新手设计的简易密码锁
单片机源程序如下:
- /**************************************************************************************
- * LCD1602液晶显示实验 *
- 实现现象: 具体接线操作请参考视频教程
- 下载程序后插上LCD1602液晶在开发板上,即可显示
- 注意事项:
- ***************************************************************************************/
- #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
- #include "lcd.h"
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef unsigned char u8;
- #define GPIO_DIG P0
- #define GPIO_KEY P1
- sbit beep=P3^5;
- sbit motor=P3^6;
- u8 KeyValue; //用来存放读取到的键值
- int count=0; //用来存放按键的次数
- u8 Disp[]="set initial code";
- u8 DispCode[]="input code";
- u8 Dispcorrect[]="welcome back";
- u8 Disperror[]="catch thief";
- char code1[8],inicode[8];
- /*******************************************************************************
- * 函 数 名 : delay
- * 函数功能 : 延时函数,i=1时,大约延时10us
- *******************************************************************************/
- void delay(u16 i)
- {
- while(i--);
- }
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //显示0~F的值
- /****************************************************
- 函数名: DigDisplay 数码管显示函数
- 函数功能: 输入显示的数字和点亮的数码管x,i;在对应的数码管上显示对应的数
- *****************************************************/
- void DigDisplay(int x,int i) //输入显示的数字和点亮的数码管x,i
- {
-
-
-
- switch(i) //位选,选择点亮的数码管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//显示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//显示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//显示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//显示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//显示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//显示第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//显示第6位
- case(7):
- LSA=1;LSB=1;LSC=1; break;//显示第7位
- }
- P0=smgduan[x];//发送段码
- P0=0x00;//消隐
- delay(100); //间隔一段时间扫描
-
-
- }
- /***************************************************
- 函数名:KeyDown
- 矩阵键盘
- 1 2 3 A
- 4 5 6 B
- 7 8 9 C
- * 0 # D
- 函数功能:
- 注意重点:成功按下一次后count记一次数,count初值为0
- ***************************************************/
- void KeyDown()
- {
- int a=0;
- int i=0;
-
- GPIO_KEY=0x0f;
- if(GPIO_KEY!=0x0f) //读取按键是否按下
- {
- delay(1000); //延时10ms进行消抖
- if(GPIO_KEY!=0x0f) //再次检测键盘是否按下
- {
- count++; //按键按下一次记一次数
- //测试列
- GPIO_KEY=0X0F;
- switch(GPIO_KEY)
- {
- case(0X07): KeyValue=1;break;
- case(0X0b): KeyValue=2;break;
- case(0X0d): KeyValue=3;break;
- case(0X0e): KeyValue=10;break;
- }
- }
- }
- //测试行
- /* 找出第四列单独处理*/
- if(GPIO_KEY==0X0e)
- {
- GPIO_KEY=0XF0;
- switch(GPIO_KEY)
- {
- case(0X70): KeyValue=KeyValue;break;
- case(0Xb0): KeyValue=KeyValue+1;break;
- case(0Xd0): KeyValue=KeyValue+2;break;
- case(0Xe0): KeyValue=KeyValue+3;break;
- }
- }
- //第一二三列的处理
- else
- {
- GPIO_KEY=0XF0;
- //单独处理第四行
- if(GPIO_KEY==(0Xe0)&&KeyValue==1)
- KeyValue='*';
- if(GPIO_KEY==(0Xe0)&&KeyValue==2)
- KeyValue=0;
- if(GPIO_KEY==(0Xe0)&&KeyValue==3)
- KeyValue='#';
-
- switch(GPIO_KEY)
- {
- case(0X70): KeyValue=KeyValue;break;
- case(0Xb0): KeyValue=KeyValue+3;break;
- case(0Xd0): KeyValue=KeyValue+6;break;
-
- }
- }
- while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测
- {
- delay(1000);
- a++;
- }
-
-
-
-
- }
-
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void main()
- {
-
- u8 i;
- int inicount;
- int j,flag=0,count1=0,j1=0;
- LcdInit();
- for(i=0;i<16;i++) //显示set initial code
- {
- LcdWriteData(Disp[i]);
- delay(1000000);
- }
- delay(100000000);
- LcdWriteCom(0x01); //清屏
- KeyValue=0; //给KeyValue一个初值,避免乱码
- motor=0; //给motor一个初值,避免乱转
- while(KeyValue!='#'||count<8)
- { //按键判断函数 输入初始密码 并存入inicode
- KeyDown();
-
- if(inicount!=count)
- {
- inicode[count1]=KeyValue;
- count1++;
- beep=0;
- delay(200);
- beep=1;
-
-
- }
-
- DigDisplay(count1,4);
- DigDisplay(KeyValue,0);
- inicount=count;
-
- }
-
-
- i=0;
- while(i<200) //在数码管显示inicode
- {
- for(j=0;j<8;j++)
- DigDisplay(inicode[j],j);
-
- i++;
- }
- while(1)
- {
-
- for(i=0;i<10;i++)
- {
- LcdWriteData(DispCode[i]);
- delay(10000);
- }
-
- KeyValue=0;
- count=0;
- count1=0;
- inicount=0;
- P0=0X00;
- flag=0;
- while(KeyValue!='#'||count<8)
- { //按键判断函数 输入密码并存入code1
- KeyDown();
-
- if(inicount!=count)
- {
- code1[count1]=KeyValue;
- count1++;
- beep=0;
- delay(200);
- beep=1;
- }
- DigDisplay(count1,4);
- DigDisplay(KeyValue,0);
- inicount=count;
-
- }
-
-
- i=0;
-
- while(i<200)
- {
- for(j=0;j<8;j++)
- DigDisplay(code1[j],j);
- i++;
- }
-
- P0=0X00; LcdWriteCom(0x01); //清屏
- flag=1;
- for(j=0;j<8;j++)
- {
- if(code1[j]==inicode[j]) //密码匹配
- ++flag;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
密码锁.zip
(51.32 KB, 下载次数: 55)
|