#include <reg51.h> #include <absacc.h> #define uchar unsigned char #define uint unsigned int void delays(void); uchar kbscan(void); main() { bit CRT; /*密碼正確標(biāo)志,=1密碼正確*/ bit PRT; /*密碼部分輸入標(biāo)志,=1密碼部分輸入*/ uchar COUNT; /*計(jì)數(shù)單元,存放密碼正確的位數(shù)*/ uchar KEY; /*被按下的鍵的編碼*/ CRT=0; PRT=0; COUNT=0; KEY=kbscan(); /*鍵掃描函數(shù)*/ delays(); /*鍵消抖的延時(shí)函數(shù)*/ switch (KEY) { case 0xb7: /*0鍵*/ { if (CRT) { } else /*密碼不正確時(shí)*/ { if (PRT) /*部分密碼正確時(shí)*/ { COUNT=COUNT+1; /*密碼正確的位數(shù)加1*/ if (COUNT==3) /*密碼所有位都正確*/ { CRT=1; PRT=0; COUNT=0; } } } }; break; case 0x7e: /*1鍵*/ { if (CRT) { /*密碼正確時(shí)的操作內(nèi)容*/ } else /*密碼不正確時(shí)*/ { PRT=0; COUNT=0; } }; break; case 0xbe: /*2鍵*/ { if (CRT) { /*密碼正確時(shí)的操作內(nèi)容*/ } else /*密碼不正確時(shí)*/ { if (PRT) /*部分密碼正確時(shí),說明密碼錯(cuò)誤*/ { PRT=0; COUNT=0; } else /*密碼正確位數(shù)為0時(shí),說明密碼第一位正確*/ { PRT=1; COUNT=1; } } }; break; case 0xd7: /*#鍵*/ { if (CRT) /*密碼正確時(shí),鎖定鍵盤*/ { CRT=0; PRT=0; COUNT=0; } }; break; } } // 鍵消抖的延時(shí)函數(shù) void delays(void) { uchar i; for(i=300;i>0;i--); } // kbscan(void) 鍵掃描函數(shù) uchar kbscan(void) { uchar sccode,recode; P1=0xf0; /*發(fā)全"0"行掃描碼,列線輸入*/ if((P1&0xf0)!=0xf0) /*若有鍵按下*/ { delays(); /*延時(shí)去抖動(dòng)*/ if((P1&0xf0)!=0xf0) { sccode=0xfe; /*逐行掃描初值*/ while((sccode&0x10)!=0) { P1=sccode; /*輸出行掃描碼*/ if((P1&0xf0)!=0xf0) /*本行有鍵按下*/ { recode=(P1&0xf0)|0x0f; return((~sccode)+(~recode)); /*返回特征字節(jié)碼*/ } else sccode=(sccode<<1)|0x01; /*行掃描碼左移一位*/ } } } return(0); /*無鍵按下,返回值為0*/ } |