51单片机定时器扫描数码管

项目场景:

按下单片机按键时数码管显示对应的数字

问题描述

提示:这里描述项目中遇到的问题:

按下是由于是CPU(主函数)在扫描数码管,导致按下按键时CPU卡在哪里 ,不能去做其他的事,也就是按下按键时数码管无法被扫描显示,会导致的情况是:按下按键时数码管不显示

解决办法是通过定时器扫描按键和数码管

扫描数码管的思路是:删除原来的主函数防止篡位的Delay(1),定时器改用2ms扫描一次,这样就完成了Delay(1)的功能
具体思路:定时器不断扫描显示"空",需要显示的位置单独给值

主体函数

//10显示小数点,11显示空
unsigned char code number[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x80,0x00};
void Nixie(unsigned char num,i)
{
	P0=0x00;
	//Delay(1);    删除原本CPU需要的延时1ms函数
	switch(num) 
	{
		case 1:P2_4=1,P2_3=1,P2_2=1;break;
		case 2:P2_4=1,P2_3=1,P2_2=0;break;
		case 3:P2_4=1,P2_3=0,P2_2=1;break;
		case 4:P2_4=1,P2_3=0,P2_2=0;break;
		case 5:P2_4=0,P2_3=1,P2_2=1;break;
		case 6:P2_4=0,P2_3=1,P2_2=0;break;
		case 7:P2_4=0,P2_3=0,P2_2=1;break;
		case 8:P2_4=0,P2_3=0,P2_2=0;break;		
	}
	P0=number[i];/* 数码管控制总线:P0 */;
}

定时器扫描

unsigned char Nixie_Buf[9]={0,11,11,11,11,11,11,11,11};
void Nixie_SetScan(unsigned char i,num)  //更改扫描显示,主函数用
{
	Nixie_Buf[i]=num;
}
void Nixie_Time()   //不断扫描8位0,需要显示的单独给值使其显示,定时器扫描用
{
	static unsigned char i=1;   //1-8不断扫描
	Nixie(i,Nixie_Buf[i]);
	i++;
	if(i>=9){	i=1;}
}

原因分析:

提示:这里填写问题的分析:

例如:Handler 发送消息有两种方式,分别是 Handler.obtainMessage()Handler.sendMessage(),其中 obtainMessage 方式当数据量过大时,由于 MessageQuene 大小也有限,所以当 message 处理不及时时,会造成先传的数据被覆盖,进而导致数据丢失。


解决方案:

提示:这里填写该问题的具体解决方案:

例如:新建一个 Message 对象,并将读取到的数据存入 Message,然后 mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();换成 mHandler.sendMessage()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值