bug:
?while一定要加break;等跳出循环;特别是单片机,因为有时根本发现不了进入了死循环;
?矩阵密码锁代码:
#include <REGX52.H>
#include "delay.h"
/**
* @brief 矩阵键盘读取按键值
* @param 无
* @retval 按下的键码值
按下按键时,程序会一直卡在这,松手的瞬间返回值;
*/
unsigned char MatrixKey()
{
unsigned char KeyNum=0;
P1=0xff;
P1_3=0;
if(P1_7==0){Delayms(20);while(P1_7==0);Delayms(20);KeyNum=1;}
//当while没有时,按键按下瞬间程序就会返回按键值;
if(P1_6==0){Delayms(20);while(P1_6==0);Delayms(20);KeyNum=5;}
if(P1_5==0){Delayms(20);while(P1_5==0);Delayms(20);KeyNum=9;}
if(P1_4==0){Delayms(20);while(P1_4==0);Delayms(20);KeyNum=13;}
P1=0xff;
P1_2=0;
if(P1_7==0){Delayms(20);while(P1_7==0);Delayms(20);KeyNum=2;}
if(P1_6==0){Delayms(20);while(P1_6==0);Delayms(20);KeyNum=6;}
if(P1_5==0){Delayms(20);while(P1_5==0);Delayms(20);KeyNum=10;}
if(P1_4==0){Delayms(20);while(P1_4==0);Delayms(20);KeyNum=14;}
P1=0xff;
P1_1=0;
if(P1_7==0){Delayms(20);while(P1_7==0);Delayms(20);KeyNum=3;}
if(P1_6==0){Delayms(20);while(P1_6==0);Delayms(20);KeyNum=7;}
if(P1_5==0){Delayms(20);while(P1_5==0);Delayms(20);KeyNum=11;}
if(P1_4==0){Delayms(20);while(P1_4==0);Delayms(20);KeyNum=15;}
P1=0xff;
P1_0=0;
if(P1_7==0){Delayms(20);while(P1_7==0);Delayms(20);KeyNum=4;}
if(P1_6==0){Delayms(20);while(P1_6==0);Delayms(20);KeyNum=8;}
if(P1_5==0){Delayms(20);while(P1_5==0);Delayms(20);KeyNum=12;}
if(P1_4==0){Delayms(20);while(P1_4==0);Delayms(20);KeyNum=16;}
return KeyNum;
}
#include <REGX52.H>
#include "LCD1602.h"
//边写边测试;
unsigned char MatrixKey();
unsigned char keynum=0;
unsigned int key=0;
unsigned char i=0;
void main(){
LCD_Init();
LCD_ShowString(1,1,"Password :");
LCD_ShowString(2,13,"i:");//
while(1)
{
keynum=MatrixKey();
if(keynum){
if(i<4)
{
key=key*10+keynum%10;
//LCD_ShowNum(2,1,key,4);
i++;
}
while(keynum==16)
{//设置16键值为确认键;
if(key==1234){
LCD_ShowString(1,14,"OK ");
key=0;
i=0;//按下确认键后重置;
}
else{
LCD_ShowString(1,14,"ERR");
key=0;
i=0;//按下确认键后重置;
}
break;
//*****一定记得break;后者直接用if();!!!!
}
LCD_ShowNum(2,15,i,2);
LCD_ShowNum(2,1,key,4);
}
}
}
血的教训:因为忘记跳出while死循环:折腾了两三个小时:
?
|