研究了一会缓冲区,还有利用中断去检测键盘的算法,又中和了之前的代码风格,发展出了一种新的通用代码格式,这几天要好好熟悉~
定时器2ms中断
void Timer0_Init()
{
TMOD=0x10;
TH0=0xf8;
TL0=0xcd;
TH1=0x00;
TL1=0x00;
EA=1;
ET0=1;
ET1=0;
TR0=1;
TR1=0;
}
void Timer0_Service() interrupt 1
{
static Key_Buf[4]={0xff,0xff,0xff,0xff};
uchar i;
Key_Buf[0]=(Key_Buf[0]<<1)|S7;
Key_Buf[1]=(Key_Buf[1]<<1)|S6;
Key_Buf[2]=(Key_Buf[2]<<1)|S5;
Key_Buf[3]=(Key_Buf[3]<<1)|S4;
for(i=0;i<4;i++)
{
if((Key_Buf[i]&0x0f)==0x0f)
Key_State[i]=1;
else if((Key_Buf[i]&0x0f)==0x00)
Key_State[i]=0;
}
Scan_KeyAlone();
Display_SMG();
}
键盘相关函数
1.对4个独立按键做一个遍历,根据前后状态,在下降沿得到键值。
2.可以根据键值分辨不同的按键,然后做出不同的处理。
/*==============================键盘相关函数================================*/
//扫描键盘
void Scan_KeyAlone()
{
static Key_backup[4]={1,1,1,1};
uchar i;
for(i=0;i<4;i++)
{
if(Key_backup[i]!=Key_State[i])
{
if(Key_backup[i]!=0)
Key_Action(Key_Value_Map[i]);
Key_backup[i]=Key_State[i];
}
}
}
//处理按键S7
void Key_Dealwith_S7()
{
if(SMG_state==2)
{
History_count++;
if(History_count==5)
History_count=1;
}
else if(SMG_state==3)
{
Blind_Distance+=10;
if(Blind_Distance>30)
Blind_Distance=0;
}
}
//处理按键S6
void Key_Dealwith_S6()
{
if(SMG_state!=3)
{
SMG_state=3;
}
else
{
SMG_state=1;
}
}
//处理按键S5
void Key_Dealwith_S5()
{
if(SMG_state!=2)
{
SMG_state=2;
}
else
{
SMG_state=1;
}
}
//处理按键S4
void Key_Dealwith_S4()
{
SMG_state=1;
//Measure_Distance();
}
//根据键盘键值执行动作
void Key_Action(uchar num)
{
switch(num)
{
case '7': Key_Dealwith_S7();
break;
case '6': Key_Dealwith_S6();
break;
case '5': Key_Dealwith_S5();
break;
case '4': Key_Dealwith_S4();
break;
}
}
/*==========================================================================*/
数码管相关函数
1.首先是显示函数,消影,开位选,开段选,这里采用静态变量来做位选,加到8后重新置0,这里加载的是数码管缓冲区的数据。
2.根据不同的显示界面,把不同的数据送入数码管缓冲区里。
/*=============================数码管相关函数===============================*/
//数码管显示函数
void Display_SMG()
{
static i=0;
Choose_HC138(6);
P0=0xff;
Choose_HC138(0);
Choose_HC138(6);
P0=0x01<<i;
Choose_HC138(7);
P0=SMG_Buf[i]; //数码管缓冲区的位与实际相对应
Choose_HC138(0);
i++;
if(i==8)
{
i=0;
}
}
//加载实时模式数据到缓冲区
void Load_date_Buf_1()
{
char i;
uchar num1=Distance_value[3];
for(i=7;i>=5;i--)
{
SMG_Buf[i]=table[num1%10];
num1=num1/10;
}
num1=Distance_value[2];
for(i=4;i>=2;i--)
{
SMG_Buf[i]=table[num1%10];
num1=num1/10;
}
SMG_Buf[1]=0xff;
SMG_Buf[0]=table[11];
}
//回显界面 count代表第几次
void Load_date_Buf_2(uchar count)
{
char i;
uchar num2=Distance_value[4-count];
for(i=7;i>=5;i--)
{
SMG_Buf[i]=table[num2%10];
num2=num2/10;
}
for(i=4;i>0;i--)
{
SMG_Buf[i]=0xff;
}
SMG_Buf[0]=table[count];
}
//参数设置界面
void Load_date_Buf_3()
{
char i;
uchar num3=Blind_Distance;
for(i=7;i>=5;i--)
{
SMG_Buf[i]=table[num3%10];
num3=num3/10;
}
for(i=4;i>0;i--)
{
SMG_Buf[i]=0xff;
}
SMG_Buf[0]=table[10];
}
void Choose_SMG_state()
{
switch(SMG_state)
{
case 1: Load_date_Buf_1();
break;
case 2: Load_date_Buf_2(History_count);
break;
case 3: Load_date_Buf_3();
break;
}
}
/*==========================================================================*/
感觉新的代码风格的移植性应该挺好,国赛加油!