|
用24c04與1602液晶屏設計的簡易加密電子鎖源程序+仿真文件下載:
用24c04與1602液晶屏設計的簡易加密電子鎖.rar
(96 KB, 下載次數: 228)
2015-11-4 00:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
主程序預覽:
- #include"LCD1602.h"
- #include"AT24C04.h"
- //上次按鍵和當前按鍵序號,該矩陣中序號范圍為0~15,16表示無按鍵
- INT8U Key_Value = 0xFF, Pre_KeyNo = 0xFF;
- INT8U DSY_BUFFER[10]= ""; //顯示緩沖區
- INT8U UserPassword[7]; //用戶輸入密碼
- INT8U I2C_Password[7]; //從I2C存儲器讀取的密碼
- sbit LED_OPEN = P2^7; //開鎖亮燈
- sbit BEEP = P3^7; //蜂鳴器
- void Beep();
- void Clear_Pwd();
- void Read_I2C_Pwd();
- void Write_I2C_Pwd();
- void Keys_Scan();
- //----------主程序------------
- void main()
- {
- INT8U i = 0;
- INT8U IS_Valid_User = 0;
- P0 = 0xFF; P1 = 0xFF; P2 = 0xFF;
- Delay_ms(10);
- Init_LCD(); //初始化LCD
- Write_LCD_String(0, 0, "Your Password...");
- Read_I2C_Pwd(); //將密碼讀入I2C
- while(1)
- {
- P1 = 0x0F;
- while(P1 == 0x0F); Keys_Scan();
- Pre_KeyNo = Key_Value; //掃描鍵盤獲取鍵序號
- switch(Pre_KeyNo)
- {
- case 0: case 1: case 2: case 3: case 4:
- case 5: case 6: case 7: case 8: case 9:
- if(i <= 5)
- {
- //如果i為0則執行一次清屏
- if(i == 0) Write_LCD_String(1, 0, " ");
- UserPassword[i] = Pre_KeyNo + '0';
- UserPassword[i+1] = '\0';
- DSY_BUFFER[i] = '*';
- DSY_BUFFER[i+1] = '\0'; i++;
- Write_LCD_String(1, 0,DSY_BUFFER );
- } break;
- case 10: //按A鍵開鎖
- Read_I2C_Pwd(); //從I2C存儲器讀回密碼
- if(strcmp(UserPassword,I2C_Password) == 0)
- {
- LED_OPEN = 0; //點亮LED
- Clear_Pwd();
- Write_LCD_String(1, 0, "Unlock OK! ");
- IS_Valid_User = 1;
- }
- else
- {
- LED_OPEN = 1; //關閉LED
- Clear_Pwd();
- Write_LCD_String(1, 0, "ERROR ! ");
- IS_Valid_User = 0;
- }
- i = 0; break;
- case 11: //按B鍵上鎖
- LED_OPEN = 1;
- Clear_Pwd();
- Write_LCD_String(0, 0, "Your Password... ");
- Write_LCD_String(1, 0, " ");
- i = 0; IS_Valid_User = 0; break;
- case 12: //按C鍵設置新密碼
- //如果是合法用戶則提示輸入新密碼
- if(!IS_Valid_User)
- Write_LCD_String(1, 0, "No right ! ");
- else
- {
- i = 0; //密碼輸入緩沖索引歸零
- Write_LCD_String(0, 0, "New Password:... ");
- Write_LCD_String(1, 0, " ");
- } break;
- case 13: //按D鍵保存新密碼
- if(!IS_Valid_User)
- Write_LCD_String(1, 0, "No right ! ");
- else
- {
- //寫入新設置的密碼,并重新讀回
- Write_I2C_Pwd(); Delay_ms(5); Read_I2C_Pwd();
- i = 0; //密碼輸入緩沖索引歸零
- Write_LCD_String(0, 0, "Your Password ... ");
- Write_LCD_String(1, 0, "Password Saved ! ");
- } break;
- case 14: //按E鍵消除所有輸入
- i = 0; Clear_Pwd();
- Write_LCD_String(0, 0, "Your Password... ");
- Write_LCD_String(1, 0, " ");
- }
- Beep(); Delay_ms(100);
- while(P1 != 0xF0); //如果有鍵未釋放則等待
- }
-
- }
- //-----------蜂鳴器子程序------------
- void Beep()
- {
- INT8U i;
- for(i = 0; i < 100; i++)
- {
- Delay_ms(1);
- BEEP = ~BEEP;
- }
- BEEP = 0;
- }
- //------------清除密碼--------------
- void Clear_Pwd()
- {
- UserPassword[0] = '\0';
- DSY_BUFFER[0]='\0';
- }
- //----------讀取密碼字符串(以'\0'為結束標志)----------
- void Read_I2C_Pwd()
- {
- INT8U i = -1; //只限于讀取存儲器前半部分
- do { i++; I2C_Password[i] = Random_Read(0xA0,(INT16U)i); }
- while(I2C_Password[i] != '\0' && i < 6);
- //如果循環結束后未遇到結束標志,則直接在字符串末尾補上結束標志
- if(I2C_Password[i] != '\0') I2C_Password[i] = '\0';
- }
- //----------寫密碼字符串(結束標志'\0'注意一并寫入)---------
- void Write_I2C_Pwd()
- {
- INT8U i = 0;
- //循環寫入密碼字符,字符串末尾的'\0'也要寫入,最多7個字符
- while(i <= 6)
- {
- Random_Write(0xA0, i,UserPassword[i]); Delay_ms(5);
- if(UserPassword[i] == '\0') break;
- i++;
- }
- //如果循環結束時密碼字符串末尾未遇到'\0'則直接向I2C補充寫入'\0'
- if(UserPassword[i] != '\0') Random_Write(0xA0, i,'\0');
- }
- //-----------------鍵掃描------------------------------------
- void Keys_Scan()
- {
- /*列判斷*/
- P1 = 0x0F; Delay_ms(1);
- if(P1 == 0x0F)
- {
- Key_Value = 0xFF; return;
- }
- switch(P1)
- {
- case 0x0E: Key_Value = 0; break;
- case 0x0D: Key_Value = 1; break;
- case 0x0B: Key_Value = 2; break;
- case 0x07: Key_Value = 3; break;
- default : Key_Value = 0xFF; return;
- }
- /*行判斷*/
- P1 = 0xF0; Delay_ms(1);
- switch(P1)
- {
- case 0xE0: Key_Value += 0; break;
- case 0xD0: Key_Value += 4; break;
- case 0xB0: Key_Value += 8; break;
- case 0x70: Key_Value += 12; break;
- default : Key_Value = 0xFF;
- }
- }
復制代碼
|
評分
-
查看全部評分
|