在33基础上做的改进
33和44的基本思想相同,均是通过两次扫描分别判定按键所在行和列,然后通过计算显示出自己想显示的内容即可,因为本次44上除数字外会输出A B C D,# * .所以就会想到用ASCII码实现,键盘大致字符位置如下:
由于上次已经附了基本的代码,所以这次只是写点基本算法
u8 KEY_Scan(u8 mode)
{
u8 l=0,h=0;
static u8 key_con=1; //按键按松开标志
if(mode) key_con=1; //支持连按
KEY_ROW_out1=0; //行输出置低
KEY_ROW_out2=0;
KEY_ROW_out3=0;
KEY_ROW_out4=0;
KEY_Init1();
KEY_ROL_out1=1; //列输出置高
KEY_ROL_out2=1;
KEY_ROL_out3=1;
KEY_ROL_out4=1;
if(key_con&&(KEY_ROW_in1==1||KEY_ROW_in2==1||KEY_ROW_in3==1||KEY_ROW_in4==1)) //检测按下的按键所在行
{
delay_ms(10);
key_con=0;
if(KEY_ROW_in1==1) h=1; //返回行值
else if(KEY_ROW_in2==1) h=2;
else if(KEY_ROW_in3==1) h=3;
else if(KEY_ROW_in4==1) h=4;
}
else if(KEY_ROW_in1==0&&KEY_ROW_in2==0&&KEY_ROW_in3==0&&KEY_ROW_in4==0) //无按键按下
{
key_con=1;
return 0;
}
KEY_ROL_out1=0; //二次扫描 列输出置低
KEY_ROL_out2=0;
KEY_ROL_out3=0;
KEY_ROL_out4=0;
KEY_Init2();
KEY_ROW_out1=1; //行输出置高
KEY_ROW_out2=1;
KEY_ROW_out3=1;
KEY_ROW_out4=1;
if(KEY_ROL_in1==1||KEY_ROL_in2==1||KEY_ROL_in3==1||KEY_ROL_in4==1) //检测按下的按键所在列
{
if(KEY_ROL_in1==1)
{ if(h==4) l='*';
else l=(h-1)*3+49;
}
else if(KEY_ROL_in2==1)
{
if(h==4) l=48;
else l=(h-1)*3+50;
}
else if(KEY_ROL_in3==1)
{
if(h==4) l='#';
else l=(h-1)*3+51;
}
else if(KEY_ROL_in4==1)
{
l=64+h;
}
}
return l;
}
这个为主要函数 最终输出%c即可实现按键的一致输出