STC89C51学习笔记(五)
综述:文本讲述了代码中速写模板的创建、如何将矩阵键盘的按键与数字一一对应以及如何创建一个矩阵键盘密码锁。
一、速写模板
点击“templates”,再鼠标右键选择配置,按照以下方式即可修改一些简写操作。
二、矩阵键盘
1.创建矩阵键盘读取数字子函数
①如果按照独立键盘的连接方式,16个按键需要16个IO口,矩阵键盘为了减少IO口的使用,采用逐行或逐列扫描。在写代码时,可以先读取第一列,然后再读取第二列,依次往下。(也可以先读取行)
unsigned char MatrixKey()//有返回值
{
unsigned char KeyNumber=0;
P1=0xff;
P1_3=0;//第一列
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
P1=0xff;
P1_2=0;//第二列
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
P1=0xff;
P1_1=0;//第三列
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
P1=0xff;
P1_0=0;//第四列
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
return KeyNumber;
}
②可以在代码前写上相应的注释,便于后序查看和调用。
2.矩阵键盘密码锁
思路:
①先将按键的值转化为数字,由于即1-9为原来的数字,10变成0,这样就可以用取余的算术来表示;
②然后,每次按下一位后要实现左移,也即是,每次按下后原来的数字会乘以10,新按下的变成个位数;
③最后,为了防止数字可以无间断的移位下去,可以限制密码的个数,达到密码位数后就不可以再输入了,于是这里运用了if语句和count来表示;
if(KeyNum<=10)//S1-S10按键按下时,输入密码
{
if(Count<4)//如果输入次数小于4
{
Password*=10;//密码左移一位
Password+=KeyNum%10;//获取一位密码
Count++;//计数加一
}
LCD_ShowNum(2,1,Password,4);//更新显示
}
④设置按键11为确认键,当输入数字和密码相同时,显示OK,不同时,显示ERR,同时清零显示数字和已输入密码位数;
if(KeyNum==11)//如果S11按键按下,确认
{
if(Password==2344)
{
LCD_ShowString(1,14,"OK ");//如果密码正确,在第一行末尾显示OK
Password=0;
Count=0;//计数清零
LCD_ShowNum(2,1,Password,4);//更新显示
}
else
{
LCD_ShowString(1,14,"ERR");//如果密码错误,在第一行末尾显示ERR
Password=0;
Count=0;//计数清零
LCD_ShowNum(2,1,Password,4);//更新显示
}
}
⑤如果按键12按下时,直接取消已经输入的所有数字和已输入密码位数,从头开始。
if(KeyNum==12)//如果S12按键按下,取消
{
Password=0;
Count=0;//计数清零
LCD_ShowNum(2,1,Password,4);//更新显示
}
整体代码:
参考视频:51单片机学习视频
侵权联系删除!