自己寫的一個密碼鎖,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;
- }
復制代碼
|