单片机密码锁仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
简单密码锁源程序:
- /*******************************************
- 密码锁:基本功能
- 1 开机显示“-”,无密码输入时也显示“-”,表示锁定;
- 2 密码为1位密码;
- 3 输入密码正确,显示“P”,开锁;
- 4 输入密码错误,显示“E”,继续锁定;
- *******************************************/
- #include <REGX51.H>
- #define LED P0 //一位数码管显示端口
- #define KEY P2 //键盘端口
- //共阳极数码管字形码
- unsigned char code ledSeg[]={
- //0 1 2 3 4 5 6 7 8 9
- 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
- //A B C D E F
- 0x88,0x83,0xc6,0xa1,0x86,0x8e,
- //P16 -17
- 0x8c,0xbf
- };
- void delay(unsigned int i)
- {
- unsigned char j;
- while(i--)
- for(j=0;j<123;j++);
- }
- /*矩阵4x4键盘函数
- 行列反转法,行在低四位,
- 返回值:按键ascii码,无按键返回0*/
- char rdmkey(void)
- {
- char cin,rin; //列,行输入值
- char keyv=0; //键号
- static char preCin=0; //上次输入
-
- KEY = 0x0f; //列输出0,行输出1
- delay(1);
- rin = KEY; //读入行,只关心低四位
- rin &= 0x0f;
- if(rin==0x0f) return 0; //读入行全为1,无按下,返回0
-
- //有键按下,行列反转,继续判断在哪一列
- KEY = 0xf0; //行输出0,列输出1
- delay(1);
- cin = KEY; //读入列输入值cin只关心高四位
- cin &= 0xf0;
- if(cin==0x0f) return 0; //读入行全为1,无按下,返回0
- cin = cin+rin; //键码=cin+rin,保存在cin中,查表得到键码
- if(cin == preCin)
- return 0;//和上次相同,返回0
- else
- preCin=cin;
- switch(cin) //查表得到键码
- {
- case 0xee: keyv='1'; break; //0行0列 (列行1110 1110)
- case 0xde: keyv='2'; break; //0行1列 (列行1101 1110)
- case 0xbe: keyv='3'; break; //0行2列 (列行1011 1110)
- case 0x7e: keyv=0; break; //0行3列 (列行0111 1110)
- case 0xed: keyv='4'; break; //1行0列 (列行1110 1101)
- case 0xdd: keyv='5'; break; //1行1列 (列行1101 1101)
- case 0xbd: keyv='6'; break; //1行2列 (列行1011 1101)
- case 0x7d: keyv=0; break; //1行3列 (列行0111 1101)
- case 0xeb: keyv='7'; break; //2行0列 (列行1110 1011)
- case 0xdb: keyv='8'; break; //2行1列 (列行1101 1011)
- case 0xbb: keyv='9'; break; //2行2列 (列行1011 1011)
- case 0x7b: keyv=0; break; //2行3列 (列行0111 1011)
- case 0xe7: keyv='*'; break; //3行0列 (列行1110 0111)
- case 0xd7: keyv='0'; break; //3行1列 (列行1101 0111)
- case 0xb7: keyv='#'; break; //3行2列 (列行1011 0111)
- case 0x77: keyv=0; break; //3行3列 (列行0111 0111)
- default: ;
- }
- return keyv; //返回键码
- }
- void main()
- {
- char keyv;
-
- LED=ledSeg[17]; //显示-,锁定
-
- while(1)
- {
- keyv=rdmkey();
-
- if (keyv!=0)
- {
- if(keyv=='6')LED=ledSeg[16]; //显示 P
- else LED=ledSeg[14]; //显示 E
- }
- }
- }
复制代码
全部资料51hei下载地址:
51单片机实现密码锁.rar
(9.2 KB, 下载次数: 35)
|