选择器:
首先我们需要知道选择器控制是怎么控制的锁存器
在原理图的右边,可以看到有一个74HC138的选择器,通过P25,P26,P27来间接的控制Y7C,Y6C,Y5C,Y4C
锁存器:
锁存器的最主要作用是缓存,其次完成高速的控制器与慢速的外设的不同步问题。
Y4C的主要功能:控制LED。
Y7C的主要功能:控制数码管。
Y6C的主要功能:控制数码管的位选。
Y5C的主要功能:控制蜂鸣器和LED10。
以上所有的选择器在选着之后都可以通过位操作来控制,比如说说今年的国赛里面让MOTOR输出一个脉冲,我们就可以先选着Y5C之后,通过控制P0^6在指定IO。
代码分享:
这个代码完美解决了,数码管和LED同时在工作的时候导致的双方的出现错误。
void Set_HC573(unsigned char channel, unsigned char dat)
{
P0 = dat; //待设置数据
switch(channel) //选通锁存器
{
case 4:
P2 = (P2 & 0x1f) | 0x80; //Y4输出0,LED控制
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0; //Y5输出0,蜂鸣器和继电器控制
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0; //Y6输出0,数码管位选
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0; //Y7输出0,数码管段码
break;
case 0:
P2 = (P2 & 0x1f) | 0x00; //所有锁存器不选择
break;
}
P2 = (P2 & 0x1f) | 0x00; //设置完成,关闭所有锁存器
}
实战代码:
硬件初始化:
关闭LED,SMG,BUZZ
void DisplaySMG_All(unsigned char value)
{
Set_HC573(6, 0xff); //使能所有数码管
Set_HC573(7, value); //数码管显示内容
}
void Hardware_init()
{
Set_HC573(0, 0x00); //关闭所有锁存器
Set_HC573(5, 0x00); //关闭蜂鸣器和继电器
Set_HC573(4, 0xff); //关闭全部LED灯
DisplaySMG_All(0xff); //关闭全部数码管
}
数码管的动态显示:
通过调用DisplaySMG_Bit(0,0xef);控制第一位所需要显示的数字或字母.
void delay(unsigned int t) { while(t--); } void DisplaySMG_Bit(unsigned char pos, unsigned char value){
Set_HC573(6, 0x01 << pos); //数码管的段位
Set_HC573(7, value); //数码管显示内
delay(300);
Set_HC573(6, 0x01 << pos);
Set_HC573(7, 0xff); //消隐
}
可以通过如下工具来计算出value所需要的段码
0~9段码:
unsigned char code smg_duanma[]={0xC0,0xF9,0xA4,0xB0,
0x99,0x92,0x82,0xF8,0x80,0x90};