项目场景:
按下单片机按键时数码管显示对应的数字
问题描述
提示:这里描述项目中遇到的问题:
按下是由于是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()
。