自己写的一个密码锁,4*4键盘,8盏灯,4位数密码,感觉大概逻辑还简单。先输入设置密码,同时对应亮起相应的灯提示有在输入,因为只有8盏灯,所以密码只能设置1~8。后输入密码进行解锁操作,此时只需4个LED灯按顺序从左到右亮起,提示输入了几位了。最后检查判断。 烧录到板子上感觉应该是执行太快了,输入了几位马上跳最后密码正确了。请问各位同志,哪些地方该调用延时函数?或者应该添加新的按键作为结束输入的功能?
单片机C语言源程序如下:
- #include<STC12C5A60S2.h>
- #include<LCD1602.h>
- #include<Key_scan.h> //返回键盘值1~16
- #define uchar unsigned char
- #define uint unsigned int
- void Delay_ms(uint time) //延时函数
- {
- uint i,j;
- for(i = 0;i < time;i ++)
- for(j = 0;j < 930;j ++);
- }
- void pass(void) //通过后的跑马灯效果
- {
- void Delay_ms(uint time);
- int temp;
- temp=0xaa;
- while(1)
- {
- P0=temp;
- Delay_ms(800);
- temp=_crol_(temp,1);
- }
- }
- int current_led=0;
- int last_led=0;
- int main()
- { int key,password[4]={0,0,0,0}; //键盘值;原始密码
- int i=0,input[4]={0}; //循环次数变量;输入的密码
- for(i=0;i<4;i++)//输入设置密码
- {
- key=Key_scan();
- password[i]=key;
- switch(key)
- {
- case 1:P00=0;break;
- case 2:P01=0;break;
- case 3:P02=0;break;
- case 4:P03=0;break;
- case 5:P04=0;break;
- case 6:P05=0;break;
- case 7:P06=0;break;
- case 8:P07=0;break;
- }
- Delay_ms(5000);
- } P0=1; //输入完4位数密码,灯全灭
- for(i=0;i<4;i++){ //输入密码进行解锁
- key=Key_scan();
- if(key!=0) //键盘有输入,灯顺序亮起
- {
- current_led++;
- switch(current_led)
- {
- case 1:P00=0;break;
- case 2:P01=0;break;
- case 3:P02=0;break;
- case 4:P03=0;break;
- case 5:P04=0;break;
- case 6:P05=0;break;
- case 7:P06=0;break;
- case 8:P07=0;break;
- }
- }
- input[i]=key; //将键盘值输入
- }
-
- for(i=0;i<4;i++){ //最后检查密码是否正确
- if(input[i]==password[i])
- pass();
- else
- P0=0;Delay_ms(500);
- P0=1;Delay_ms(500);
- }
- return 0;
- }
复制代码
|