我花了一整天做了这个小玩意,然后又花了10分钟发到51hei论坛,分享给51hei的网友,第一次做这个。。小弟新手,代码也很简单给论坛的朋友们分享下。。
(打算这星期去实验室把实物做出来,这周末更新额。。)
小提示:(小弟新手额,有提示不对的地方望大神指出 )
一:大家用多文件编译的时候得多注意点
(例如: .h与.c文件的配对,以及.h的规定格式#ifndef_1602_ #define_1602_ ........................#endif,
在其他文件中调用别忘了extern前缀。eg:在文件1中定义了一个全局变量 unsigned int table[10];在文件2中使用
extern unsigned int table[10];
其他文件中的函数要记得定义,方法为void kay_scan(); 注意分号。。。具体的可以买书看看)
二:说下制作的过程中得注意的问题
1.键盘扫描中记录键盘按下的次数,这个很关键得好好把握,在必要的时候也得清零。一开始我也纠结了很久
2.设置密码与输入密码数组的存储问题,因为在密码对比的时候用到两个数组所以在
键盘服务程序中要看情况分别将键盘输入的密码写入不同的数组中。
4.其他的一些小细节就不说了代码的具体备注很详细
{:1:}下面的图片也有些阅读提示。。。。
- /**************************************************************** ***************
- 阅读提示:1.所有的数组以 名字_功能_pad[]
- 例如code_intput_pad[]; 为密码输入数组
- 2.所有的函数以 类型_功能_名字()
- 例如desplay_set_code(); 为密码设置函数
- desplay_input_code(); 为密码输入函数
- 3.调用函数大家可以多用局部变量方便,空间占用又少
- (以上名字方式纯属本人自己感到合适的,大家也可以用适合自己的方式,但是
- 不管是什么样的命名方式都得有一套方式,这样做一个比较复杂的程序方便点)
- 4.由于小弟第一次用这种方式写代码,所以在写这个程序中也有些地方没注意;
- 给大家带来不便请谅解。
- 5.广告王,这里也插播下吧
- 单片机交流群--best单片机交流群,欢迎你的加入一起学习交流
- *********************************************************************************/
- #include
- #include"delay.h"
- #include"1602.h"
- #define uint unsigned int
- #define uchar unsigned char
- #define port_key P1 //矩阵键盘输入口
- uchar key_num; //键盘扫描读回值须为全局变量
- uchar keypad[]={0xfe,0xfd,0xfb,0xf7}; //键盘扫描分别将各行置0
- uchar code_new_pad[6]={1,1,1,1,1,' '}; //6位的设置密码存储‘ ’用来判断是否输入第六位密码
- uchar code_input_pad[6]={1,1,1,1,1,' '}; //用来存储输入的密码
- sbit buzzer=P2^7; //buzzzer接口
- sbit led_r=P2^3;
- sbit led_l=P2^4;
- bit key_pd=0; //按键标志
- bit code_compare=0; //密码对比标志
- uint key_time=0; //记录键盘按下的次数
- uchar temp=0;
- void init_T1() //定时器1初始化 利用定时器提高键盘的扫描速度
- {
- EA=1;
- ET1=1;
- TMOD=0x10; //定时器工作方式选择16位定时
- TH1=(65536-1000)/256; //定时器高八位
- TL1=(65536-1000)%256; //定时器低八位
- TR1=1; //开启定时器1
- }
- void play_buzzer(uint j,uint k) //蜂鸣器
- {
- uchar i=0;
- for(j;j>0;j--)
- {
- for(i=0;i<=100;i++)
- {
- buzzer=~buzzer;
- delayms(k);
- }
- }
- }
- uint key_scan() //4*3矩阵键盘扫描
- {
- uint i=0;
- uchar key_temp;
- for(i=0;i<4;i++)
- {
- port_key=keypad[i];
- key_temp=port_key;
- key_temp=key_temp&0xf0;
- if(key_temp!=0xf0) //判断是否有键盘被按下
- {
- delayms(15); //延迟15ms,去除键盘的抖动
- key_temp=port_key; //重新读回key_port的值
- key_temp=key_temp&0xf0;
- if(key_temp!=0xf0) //说明确实有键被按下
- {
- key_temp=port_key;
- key_pd=1; //键盘按下标志
- key_time++; //键盘按下次数标志
- switch(key_temp)
- {
- case 0xee: key_num=1+0x30;play_buzzer(2,50); break; //将数字转化为ASC
- case 0xde: key_num=2+0x30;play_buzzer(2,50); break;
- case 0xbe: key_num=3+0x30;play_buzzer(2,50); break; //以上3行代码为第一行扫描
- case 0xed: key_num=4+0x30;play_buzzer(2,50); break;
- case 0xdd: key_num=5+0x30;play_buzzer(2,50); break;
- case 0xbd: key_num=6+0x30;play_buzzer(2,50); break; //第二行扫描
- case 0xeb: key_num=7+0x30;play_buzzer(2,50); break;
- case 0xdb: key_num=8+0x30;play_buzzer(2,50); break;
- case 0xbb: key_num=9+0x30;play_buzzer(2,50); break; //第三行扫描
- case 0xe7: key_num=10;play_buzzer(1,50); break; //...10代表确定键
- case 0xd7: key_num=0+0x30;play_buzzer(2,50); break;
- case 0xb7: key_num=11;play_buzzer(1,50); break; //第四行扫描..11代表删除键
- }
- while(key_temp!=0xf0) //松手检测
- {
- key_temp=port_key;
- key_temp=key_temp&0xf0;
- }
- }
- }
- }
- return key_num;
- }
- void new_save_code() //将设置密码存入code_new_pad
- {
- if(key_time<=6) //防止密码输入超过6位
- {
- code_new_pad[key_time-1]=key_num;
- gotoxy(2,key_time-1);
- w_dat_lcd(code_new_pad[key_time-1]);
- }
- }
- void input_save_code() //将输入的密码存入code_input_pad
- {
- if(key_time<=6)
- {
- code_input_pad[key_time-1]=key_num; //注意key_time的控制须好好把握
- gotoxy(2,key_time-1);
- w_dat_lcd(code_input_pad[key_time-1]);
- }
- }
- uint compare_code() //输入密码与设置密码对比
- {
- uint i=0;
- for(i=0;i<6;i++)
- {
- if(code_input_pad[i]==code_new_pad[i])
- {
- if(i==5)
- code_compare=1;
- else continue;
- }
- else
- {
- code_compare=0;
- break; //只要有一位密码不对就跳出循环
- }
- }
- return code_compare;
- }
- void key_serve() //键盘服务程序
- {
- if(key_pd==1) //判断是否有键被按下
- {
- key_pd=0;
- if(key_num==11) //是否按下删除键
- {
- gotoxy(2,key_time-2);
- w_dat_lcd(' '); //删除当前数字
- key_time=key_time-2;
- }
- else if(key_num==10&&temp==0) //是否按下设置密码时的确定键
- {
- if(code_new_pad[5]!=' ') //判断是否输入了第六个密码
- {
- key_time=0;
- w_com_lcd(0x01); //清屏指令
- desplay_set_succ();
- delaylong(500);
- desplay_input_code();
- temp=1;
- }
- else //没有输入6位密码
- {
- key_time=0;
- w_com_lcd(0x01);
- desplay_set_error();
- delaylong(500);
- desplay_set_code();
- }
- }
- else
- {
- if(temp==0) //利用temp的数值判断将键盘密码存入那个数组中
- new_save_code();
- else if(temp==1)
- {
- input_save_code();
- if(code_input_pad[5]!=' ') //判断是否输入了6位密码
- {
- if(key_num==10)
- {
- compare_code(); //密码判断函数
- if(code_compare==1)
- {
- w_com_lcd(0x01);
- desplay_input_succ();
- led_r=1;
- play_buzzer(20,88);
- }
- else
- {
- w_com_lcd(0x01);
- desplay_input_error();
- led_l=1;
- play_buzzer(20,50);
- led_l=0;
- desplay_input_code();
- key_time=0;
- }
- }
- }
- }
- }
- }
- }
- void main() //主函数
- {
- led_r=0;
- led_l=0;
- init_lcd();
- init_T1();
- desplay_set_code();
- for(;;)
- {
- key_serve();
- }
- }
- void timer1() interrupt 3 // 定时器1中断服务
- {
- TH1=(65536-1000)/256;
- TL1=(65536-1000)%256;
- key_scan(); //按键扫描程序放入中断提高扫描速度
- }
复制代码
电子密码锁.rar
(110.47 KB, 下载次数: 579)
|