各位前辈,这几天自己在尝试用200的三个输出口驱动7219芯片的时候,发现没有任何反映:自己已经按照7219的时序向7219发送数据,也首先对控制寄存器初始化,然后发送点亮指示灯的信号,都是按照7219说明书上一步步执行的,但通过7219带的指示灯没有任何反映。并且自己查过几遍自己的接线没有问题。各位前辈,能否给小弟一些指导性的方法或指导性的小程序,让小弟有所领悟,谢谢。
最佳答案
先说7219的时序:在DIN引脚准备数据,然后在CLK引脚提供一个上升沿,在此过程中LOAD引脚必须保持低电平。发送数据时先送地址,再送数据。例如:你想在第二个数码管上显示数字8,应该先发送2,再发送8。下面是向7219发送数据的子程序:
void write_7219(byte address, byte data)
{
//参数address是7219的寄存器地址,取值范围1到8,对应外接的8个数码管。参数data是要显示的数字。
bit t ;
_7219_CLK = 0;
_7219_LOAD= 0;
t = 1;
MB1 = address;
// t=1时,把地址存入MB1。
Loop:
_7219_DIN = M1.7;
_7219_CLK = 1;
_7219_CLK = 1;
_7219_CLK = 0;
_7219_CLK = 0;//之所以重复两次,是为了拖延时钟信号变化的时间,因为plc的指令执行速度很快,7219可能捕捉不到。
_7219_DIN = M1.6;
_7219_CLK = 1;
_7219_CLK = 1;
_7219_CLK = 0;
_7219_CLK = 0;
_7219_DIN = M1.5;
_7219_CLK = 1;
_7219_CLK = 1;
_7219_CLK = 0;
_7219_CLK = 0;
_7219_DIN = M1.4;
_7219_CLK = 1;
_7219_CLK = 1;
_7219_CLK = 0;
_7219_CLK = 0;
_7219_DIN = M1.3;
_7219_CLK = 1;
_7219_CLK = 1;
_7219_CLK = 0;
_7219_CLK = 0;
_7219_DIN = M1.2;
_7219_CLK = 1;
_7219_CLK = 1;
_7219_CLK = 0;
_7219_CLK = 0;
_7219_DIN = M1.1;
_7219_CLK = 1;
_7219_CLK = 1;
_7219_CLK = 0;
_7219_CLK = 0;
_7219_DIN = M1.0;
_7219_CLK = 1;
_7219_CLK = 1;
_7219_CLK = 0;
_7219_CLK = 0;
if(t==1)
{
t = 0;
MB1 = data; //t=0时,把数据存入MB1
goto Loop; //跳转到上面的Loop标志处,把MB1再发送一遍。
}
EndLoop;
_7219_LOAD = 1;
_7219_CLK = 0;
_7219_CLK = 1;
_7219_CLK = 0;
} // write_7219 end
下面是7219的初始化子程序,用来配置7219的寄存器:
void init_7219( )
{
write_7219(0x0C,0x00);//停止7219的输出,以便配置寄存器
write_7219(0x0a,0xff); //最大亮度,也可以用硬件来调
write_7219(0x09,0xff); //模式设置,全部解码
write_7219(1,0x0f); //blank
write_7219(2,0x0f); //blank
write_7219(3,0x0f); //blank
write_7219(4,0x0f); //blank
write_7219(5,0x0f); //blank
write_7219(6,0x0f); //blank
write_7219(7,0x0f); //blank
write_7219(8,0x0f); //8个数码管全部blank
write_7219(0x0C,0x0f); //启动7219
write_7219(0x0b,0x0f); //扫描位数8,假设一共有8个数码管
}
由于在7219的模式设置中开启了解码操作,所以只需把地址和字符传送给7219就行了,不需要分析字形。例如,你想在第二个数码管上显示数字8,可以这样调用:
init_7219();
write_7219(2,8);
附带说一下,我没有做过这样的应用,所以上面的程序只是给个思路。
提问者对于答案的评价:
谢谢前辈的指导
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc347603.html