项目三简易计算器 任务3-6六位密码锁2
任务描述单片机连接8位共阳极数码管和4*4矩阵键盘编程完成六位密码校验结果正确显示“HELLO”,结果错误显示“ERROR。一次扫描多次记录。会造成空翻。所以需要key4(),释放。strcmp函数用于字符串比较首先必须要有头文件 #includestring.h其次字符串必须是ASCII码比较对象。可加双引号字符串将其转换为ASCII 码0~9任意一个数加上48等于其对应的ASCII码。可加单引号字符将单个字符转换为ASCII 码。/************************* 项目名称项目三简易计算器 任务名称任务3-6六位密码锁2 任务描述单片机连接8位共阳极数码管和4*4矩阵键盘 编程完成六位密码校验结果正确显示“HELLO”,结果错误显示“ERROR” *************************/ #includereg51.h #includeintrins.h #includestring.h //51单片机寄存器定义头文件 sbit row0P1^0; sbit row1P1^1; sbit row2P1^2; sbit row3P1^3; sbit col0P1^4; sbit col1P1^5; sbit col2P1^6; sbit col3P1^7; int n;//存放按键编号0~9数字10-确认 int t;//记录用户输入密码和位数平铺记录密码 char pass1[10];//存放用户输入的密码 char pass2[]240423;//系统预存密码 int m1[]{0x89,0x86,0xc7,0xc0};//HELO int m2[]{0x86,0x88,0xc0,0x88};//EROR int dis[2];//存放结果的十位和个位 int seg[]{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义0~9共阳极七段码 void key1();//等待按键按下无限查询 void key2();//扫描按键位置行列扫描 void key3();//处理按键请求显示编号 void key4();//等待按键释放防止空翻一次按键多次生效 void display();//显示HELLO或者ERROR /**********************************************/ void delay(int i) { int k,j; for(k0;ki;k) for(j0;j100;j); } /**********************************************/ void main() { while(1) { key1(); key2(); key3(); key4(); } } /**********************************************/ void key1() { while(1) { P10x0f; if(P1!0x0f)//有变化一定是有按键按下导致某行某列短路 delay(10);//延时10毫秒去掉按键抖动 if(P1!0x0f) break;//退出查询 } } /**********************************************/ void key4() { while(1) { P10x0f; if(P10x0f)//某行某列短路消失按键释放 delay(10);//延时10毫秒去掉按键抖动 if(P10x0f) break;//退出查询 } } /**********************************************/ void key2() { P10xff;//行列都写1 col00;//清零0列 if(row00) n0; if(row10) n1; if(row20) n2; if(row30) n3; P10xff;//行列都写1 col10;//清零1列 if(row00) n4; if(row10) n5; if(row20) n6; if(row30) n7; P10xff;//行列都写1 col20;//清零2列 if(row00) n8; if(row10) n9; if(row30) n10;//确认键保存用户输入密码键值10 } /**********************************************/ void key3() { if(n10)//按下数字键显示数字 { P20xfe;//1111 1110 P0seg[n]; pass1[t]n48;//保存本次用户输入密码的ASCII值 t; } else//按下等号键 display();//显示两位结果 } /**********************************************/ void display() { int i,j; while(1) { for(i0,j0xf7;i4;i)//0111 1111 { P2j; if(strcmp(pass1,pass2)0)//字符串比较函数校验多位密码 P0m1[i];//取HELLO else P0m2[i];//ERROR delay(5); j_cror_(j,1); } } }效果新增只能试错三次第一次输入错误后显示eror,三秒后消失按键可以重复输入重复三次三次后若还错锁定。若输入正确则显示helo,且不变。/************************* 项目名称项目三简易计算器 任务名称任务3-6六位密码锁2 任务描述单片机连接8位共阳极数码管和4*4矩阵键盘 编程完成六位密码校验结果正确显示“HELLO”,结果错误显示“ERROR” *************************/ #includereg51.h #includeintrins.h #includestring.h //51单片机寄存器定义头文件 sbit row0P1^0; sbit row1P1^1; sbit row2P1^2; sbit row3P1^3; sbit col0P1^4; sbit col1P1^5; sbit col2P1^6; sbit col3P1^7; int n;//存放按键编号0~9数字10-确认 int t;//记录用户输入密码和位数平铺记录密码 int m3; char pass1[10];//存放用户输入的密码 char pass2[]240423;//系统预存密码 int m1[]{0x89,0x86,0xc7,0xc0};//HELO int m2[]{0x86,0x88,0xc0,0x88};//EROR int dis[2];//存放结果的十位和个位 int seg[]{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义0~9共阳极七段码 void key1();//等待按键按下无限查询 void key2();//扫描按键位置行列扫描 void key3();//处理按键请求显示编号 void key4();//等待按键释放防止空翻一次按键多次生效 void display();//显示HELLO或者ERROR /**********************************************/ void delay(int i) { int k,j; for(k0;ki;k) for(j0;j100;j); } /**********************************************/ void main() { while(1) { key1(); key2(); key3(); key4(); } } /**********************************************/ void key1() { while(1) { P10x0f; if(P1!0x0f)//有变化一定是有按键按下导致某行某列短路 delay(10);//延时10毫秒去掉按键抖动 if(P1!0x0f) break;//退出查询 } } /**********************************************/ void key4() { while(1) { P10x0f; if(P10x0f)//某行某列短路消失按键释放 delay(10);//延时10毫秒去掉按键抖动 if(P10x0f) break;//退出查询 } } /**********************************************/ void key2() { P10xff;//行列都写1 col00;//清零0列 if(row00) n0; if(row10) n1; if(row20) n2; if(row30) n3; P10xff;//行列都写1 col10;//清零1列 if(row00) n4; if(row10) n5; if(row20) n6; if(row30) n7; P10xff;//行列都写1 col20;//清零2列 if(row00) n8; if(row10) n9; if(row30) n10;//确认键保存用户输入密码键值10 } /**********************************************/ void key3() { if(n10)//按下数字键显示数字 { P20xfe;//1111 1110 P0seg[n]; pass1[t]n48;//保存本次用户输入密码的ASCII值 t; } else//按下等号键 display();//显示两位结果 } /**********************************************/ void display() { int i,j; int num100; int flag; m--; if(strcmp(pass1,pass2)0) flag0; else flag1; while(num-- |flag0 |m0)//无限显示结果按键失效 { for(i0,j0xf7;i4;i)//1111 0111 { P2j; if(flag0)//字符串比较函数校验多位密码 P0m1[i];//取HELLO else P0m2[i];//ERROR delay(5); j_cror_(j,1); } } P20xff; t0; }