数码管公有7个LED灯,加上下面的小数点,共需要8个驱动接口。同时为了节约引脚数量,这个8个数据引脚同时也是数码管公共端的驱动接口。那一个数据到来的时候到底分配给LED还会分配给他的公共端呢?这就需要两个开关,总计10个输出接口。
这10个输出接口分别可称为8个数据口,1个段选控制口(控制哪个段亮起来),一个位选控制口(控制数码管的公共端)。
74HC573的数据有效位是高电平,赋值为1的时候数据可以被接收。
P0接的数据为byte类型,P20为段选,P21为位选
执行程序的流程时,按顺序会出现以下问题:
P0=哪个显示1;
P21=1//位选有效;
P21=0//关闭位选;
//将要显示的LED打开,比如1
P0=显示数据1;
P20=1;//段选有效
P20=0;//关闭段选
//把数据(比如0)写入到要显示的LED中,比如1,此时LED1=0,注意:总线数据此时是0
P0=哪个显示2;
P21=1//位选有效;
P21=0//关闭位选;
//将要显示的LED打开,比如2。因为打开了LED2且总线中存在0的数据,LED2=0;
P0=显示数据2;
P20=1;//段选有效
P20=0;//关闭段选
//把数据(比如3)写入到要显示的LED中,比如2,此时LED2=3,注意:总线数据此时是3
显示数据2与哪个显示1会产生了冲突,也就是当哪个显示1选定了LED以后,显示数据2的数据进入了。
P21虽然已经关闭了,显示数据不会进入位选的芯片,但是位选是激活的状态,当有数据的时候就显示出来了。所以在输入数据的时候要把所有的LED全部关闭,所以LED实际是处于高频闪灭闪灭的状态的。
因为只有一个总线数据,所以在设置某一个LED的时候,要把其他的LED关断,就一定会产生高频的开关动作才可以。
要特别注意的是,上面的代码是不对的,试验证明,有且只有一个顺序如下是对的,否则数据都会冲进去而乱掉。
P0=duan_table[da];
P20=1;
P20=0;
P0=wei_table[num];
P21=1;
P21=0;
P0=0xFF;//COLSE ALL WEIXUAN
P21=1;
P21=0;