51蛋骗鸡使用74HC573锁存器

缘由单片机七段数码管电路 求分析 - 24小时必答区    

如果只是驱动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;
		}
	}
}

 

51单片机结合按键、计数器以及74HC573锁存器来实现0到99的计数器,其基本流程如下: 1. **硬件连接**: - 将51单片机的输入输出口(如P1口)连接到按键上,作为启动和暂停控制信号。 - 连接51单片机74HC573锁存器,用于存储计数值并延长显示时间。 - 从51单片机通过I/O口驱动数码管,显示0-9的数字。 2. **软件设计**: - **初始化**:设置定时器T0工作于模式1,作为计数器;配置按键中断,当按下开始按钮时触发中断。 - **计数逻辑**:在中断服务程序(ISR)中,检查按键状态。如果按键按下,则开始计数;若按键松开,停止计数。每增加一次,将当前值送到锁存器,并更新数码管显示。 - **锁存器操作**:利用74HC573的三态缓冲功能,将计数结果串行化输出,然后分时驱动数码管各个位。 3. **计数范围限制**:为了防止溢出,当计数值达到99时,通常会进入下一个循环,即清零并加1,而不是直接跳到0。 以下是简化的伪代码示例(仅作参考,实际代码需配合具体的单片机API): ```c void setup() { // 初始化定时器T0 timerInit(); // 设置按键中断 keyInterruptSetup(); } void loop() { if (keyIsPressed()) { startCounter(); } else if (!keyIsPressed()) { pauseCounter(); } } // 中断服务程序 ISR(timer0_vect) { count++; if (count == 100) { count = 0; } updateDisplay(count); shiftOutToLockRegister(count); } // 其他辅助函数... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值