如果只是驱动8位数码管和独立按键,不需要使用74HC573锁存器这样浪费,直接使用蛋骗鸡上的未用IO即可。 若是学习74HC573锁存器的话,那么,使用一片即可,使用2片74HC573可实现3种功能,除了用于数码管的段码和位码输出外同时还可以扫描键盘用或做其它操作使用才选择使用2片74HC573。 教材是这样编写的?这样教学生会让学生不知锁存器的作用,为何要用锁存器的理由; 使用2个IO口可以直接操作8位数码管,不需要锁存器; 使用锁存器就是为了复用IO的,如用1片锁存器扩展可复用同一IO,这样就能达到节省IO的目的; 使用2个锁存器可以让一个IO做更多的事情,如用2片锁存器可让这个IO同时完成数码管的段操作、位操作,键盘操作,这才使用2片锁存器的理由,这样可大大节约原先使用3个IO才能达到的目的,腾出来的多余IO可以做更多的事。 |
锁存器可以动态存储8位数据,假设一片51芯片1O组不够用时就可以选择锁存器来存储数据以补不足,调用1组IO可以接控制几片锁存器就可以当作增加了几组IO.锁存器是数据并联发送的速度比595串口要快. |
#include "reg52.h"
bit k=0;//标记
unsigned char code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴0~15
unsigned char code ShaoMiaoZhi[]={238,237,235,231,222,221,219,215,190,189,187,183,126,125,123,119};
unsigned char JianPanShaoMiao(/*使用行列反转扫描法*/)
{
unsigned char H=15,L=240,Ys=0;
P1=15;
if(P1!=15)
{
while(++Ys);//消抖
H=P1;
P1=240;
L=P1;
while(P1!=240);
}
P1 = 255;
return (H+L);
}
unsigned char JianPanQuZhi(/*定义按钮*/)
{
unsigned char Jian_Zhi=0,LinShi=JianPanShaoMiao();
if(LinShi==255)return LinShi;else;//减小对延时影响提高运行效率
while(LinShi!=ShaoMiaoZhi[Jian_Zhi])if(++Jian_Zhi > 15)break;//if(LinShi!=255)
return Jian_Zhi;
}
void main()
{//缘由https://bbs.csdn.net/topics/396577304?page=1#post-411560687 https://ask.csdn.net/answers/1282564/edit
unsigned char jz=0,wei=128;//键值 位
unsigned int Ys=47474,zhi=0,ls=0;
while(1)
{
if(--Ys==0)
{
jz=JianPanQuZhi();
if(jz!=255){ls=zhi=jz*jz;wei=128;}
if(zhi)
{
P3=1;P2=wei;P3=0;//使用74HC573锁存器一片
P2=~smgduan[zhi-zhi/10*10];//数码管静态显示
zhi/=10;
if(!(wei/=2))wei=128;//数码管动态显示
}
else {wei=128;P2=255;zhi=ls;}
Ys=1747;
}
}
}