void init_main() {
Lcd_Initial(); //對12864液晶顯示屏的初始化作用
number = 0; //密碼存儲,顯示位置,各方面清零
P32 = 0; //進行電磁鐵的初始關閉作用
//顯示居民小區:
Lcd_Character_16X16( 1, 0, 0,data_shuju[0]);
Lcd_Character_16X16( 1, 0, 16,data_shuju[1]);
Lcd_Character_16X16( 1, 0, 32,data_shuju[2]);
Lcd_Character_16X16( 1, 0, 48,data_shuju[3]);
Lcd_Character_16X16( 1, 0, 64,data_shuju[4]);
//顯示請輸入密碼:
Lcd_Character_16X16( 1, 4, 0,data_shuju[5]);
Lcd_Character_16X16( 1, 4, 16,data_shuju[6]);
Lcd_Character_16X16( 1, 4, 32,data_shuju[7]);
Lcd_Character_16X16( 1, 4, 48,data_shuju[8]);
Lcd_Character_16X16( 1, 4, 64,data_shuju[9]);
Lcd_Character_16X16( 1, 4, 80,data_shuju[10]);
EA = 1; //總中斷打開
EX1 = 1; //外部中斷1打開
IT1 = 0; //外部中斷1工作方式,為低電平觸發,IT1 = 1為下降沿觸發
}
/***************************************************************
函數:主函數
功能:綜合各個函數的作用
注意:進入主函數的時候,首先開啟初始化函數功能
***************************************************************/
void main() {
init_main(); //初始化主函數之前的所有操作
while(1) { //進入無限循環當中
key_scan(); //進行鍵盤掃描函數
}
//clear_screen();
}
/*********************************************************************
函數:鍵盤掃描函數
功能:集成了輸入密碼,顯示密碼個數,清除密碼,
顯示密碼正確與錯誤各種功能的集成函數
可稱為本函數的核心函數之一
鍵盤掃描方式:采用的翻轉法的鍵盤掃描,可以減少掃描代碼的數量
注意:本函數采用的是帶有返回值,不帶參數的函數,所以在函數的
末尾一定要加入return keyscan;這個語句
**********************************************************************/
uchar key_scan()
{ //函數開始
unsigned char k=0,p1_h=0,p1_l=0; //翻轉法的定義k為選擇分支作用,
uchar Mark; //p1_h是選擇分支的高四位,p1_l是選擇分支的低四位
char keyscan = 0, i = 0, j = 0; //記錄輸入的數據是數值,然后將其送入到shuru所代表的數組當中去
//i的作用記錄輸入的數據是否是6位數據,防止超出所存儲的數組的空間
//j的作用是用來加強功能鍵“確認”的作用
/*************************/
P1 = 0xf0; //翻轉法先給P1口送數據
k = P1; //然后賦值給k
if(k != 0xf0) //判斷k是否是0xf0,如果不是,進入內部執行相應的程序
{
delayms(50); //延時,防抖動
k = P1; //重新賦值
if(k != 0xf0) //確定是否k不等于0xf0
{
number++; //number用于確定后面的在12864中的輸出位置和密碼存儲的位置
p1_h = P1; //將P1的高四位賦值給p1_h
P1 = 0x0f; //然后將0x0f賦值給P1口,翻轉,確定低四位,賦值給p1_l
p1_l = P1; //將P1口的值賦給p1_l(是小寫的字母l,不是數字1)
k = p1_h|p1_l; //將高四位和低四位相或,然后賦值給k
if (k == 0XE7) { //此判斷是為了確定是否是確認按鍵,如果是,直接進入確定程序
j = 1;
}
if(number == 7) //此判斷是為了確定輸入的是否是6個數字,防止多輸入或者少輸入
{
if (k != 0XB7) { //這個是判斷是否是清除按鍵,
number = 0;
}
}
while (p1_l == P1); //這個是松手檢測,防止長時間按在按鍵上,使輸入的數據重復
if (number > 0||j == 1){
switch(k) //條件分支語句
{
case 0XD7: keyscan = 0; Lcd_Character_16X8( 1, 6, 8*number,shuzi[0]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
case 0XEE: keyscan = 1; Lcd_Character_16X8( 1, 6, 8*number,shuzi[1]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
case 0XDE: keyscan = 2; Lcd_Character_16X8( 1, 6, 8*number,shuzi[2]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
case 0XBE: keyscan = 3; Lcd_Character_16X8( 1, 6, 8*number,shuzi[3]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
case 0XED: keyscan = 4; Lcd_Character_16X8( 1, 6, 8*number,shuzi[4]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
case 0XDD: keyscan = 5; Lcd_Character_16X8( 1, 6, 8*number,shuzi[5]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
case 0XBD: keyscan = 6; Lcd_Character_16X8( 1, 6, 8*number,shuzi[6]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
case 0XEB: keyscan = 7; Lcd_Character_16X8( 1, 6, 8*number,shuzi[7]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
case 0XDB: keyscan = 8; Lcd_Character_16X8( 1, 6, 8*number,shuzi[8]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
case 0XBB: keyscan = 9; Lcd_Character_16X8( 1, 6, 8*number,shuzi[9]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數據,number是用來確定輸入的位置,shuru【】是用來放置密碼
case 0XE7: number = 0;
for(i = 0; i < 6; i++)
if (mima[i] != shuru[i])//對比原始密碼和輸入密碼
{
Mark++;
//該if語句是用來判斷密碼Mark的錯誤次數,一旦達到3次,
//就進入到while循環當中,并且P30口 = 0;蜂鳴器響,直至單片機復位才可消失
if (3 == Mark) {
P30 = 0;
Lcd_Character_16X8( 1, 6, 8*1,disappear_char[0]);
Lcd_Character_16X8( 1, 6, 8*2,disappear_char[0]);
Lcd_Character_16X8( 1, 6, 8*3,disappear_char[0]);
Lcd_Character_16X8( 1, 6, 8*4,disappear_char[0]);
Lcd_Character_16X8( 1, 6, 8*5,disappear_char[0]);
Lcd_Character_16X8( 1, 6, 8*6,disappear_char[0]);
while(1);
}
//密碼錯誤
Lcd_Character_16X16( 1, 6, 64,mistake[0]);
Lcd_Character_16X16( 1, 6, 80,mistake[1]);
Lcd_Character_16X16( 1, 6, 96,mistake[2]);
Lcd_Character_16X16( 1, 6, 112,mistake[3]);
//消除密碼顯示
delayms(1000);
Lcd_Character_16X8( 1, 6, 8*1,disappear_char[0]);
Lcd_Character_16X8( 1, 6, 8*2,disappear_char[0]);
Lcd_Character_16X8( 1, 6, 8*3,disappear_char[0]);
Lcd_Character_16X8( 1, 6, 8*4,disappear_char[0]);
Lcd_Character_16X8( 1, 6, 8*5,disappear_char[0]);
Lcd_Character_16X8( 1, 6, 8*6,disappear_char[0]);
//消除密碼錯誤漢字顯示
Lcd_Character_16X16( 1, 6, 64,disappear_hanzi[0]);
Lcd_Character_16X16( 1, 6, 80,disappear_hanzi[0]);
Lcd_Character_16X16( 1, 6, 96,disappear_hanzi[0]);
Lcd_Character_16X16( 1, 6, 112,disappear_hanzi[0]);
break;
}
if(i == 6) //確認密碼是否是正確的,通過i值
{
//輸入密碼正確
Lcd_Character_16X16( 1, 6, 64,mistake[0]);
Lcd_Character_16X16( 1, 6, 80,mistake[1]);
Lcd_Character_16X16( 1, 6, 96,mistake[4]);
Lcd_Character_16X16( 1, 6, 112,mistake[5]);
delayms(1000); //延時
//消除密碼顯示位
Lcd_Character_16X8( 1, 6, 8*1,disappear_char[0]);
Lcd_Character_16X8( 1, 6, 8*2,disappear_char[0]);
Lcd_Character_16X8( 1, 6, 8*3,disappear_char[0]);
Lcd_Character_16X8( 1, 6, 8*4,disappear_char[0]);
Lcd_Character_16X8( 1, 6, 8*5,disappear_char[0]);
Lcd_Character_16X8( 1, 6, 8*6,disappear_char[0]);
//消除密碼正確顯示位
Lcd_Character_16X16( 1, 6, 64,disappear_hanzi[0]);
Lcd_Character_16X16( 1, 6, 80,disappear_hanzi[0]);
Lcd_Character_16X16( 1, 6, 96,disappear_hanzi[0]);
Lcd_Character_16X16( 1, 6, 112,disappear_hanzi[0]);
P32 = 1;
delayms(2000);
P32 = 0;
}
break;
case 0XB7: keyscan = 10;number--;Lcd_Character_16X8( 1, 6, 8*number,disappear_char[0]);number--;break;
//這個是用來清除輸錯的密碼,然后重新輸入新的位數的密碼
default: break;
/* case 0XE7: return(4);break;
case 0XDE: return(5);break;
case 0XDD: return(6);break;
case 0XDB: return(7);break;
case 0XD7: return(8);break;
case 0XBE: return(9);break;
case 0XBD: return(10);break;
case 0XBB: return(11);break;
case 0XB7: return(12);break;
case 0X7E: return(13);break;
case 0X7D: return(14);break;
case 0X7B: return(15);break;
case 0X77: return(16);break;
default: return(0);break; */
}
}
}
}
return keyscan; //函數返回的參數
|