電子密碼鎖
1. 采用 LCD12864 顯示;
2. 矩陣式按鍵輸入密碼,密碼長度 6 位;
3. 具有密碼修改功能,可存儲 3 組密碼;
4. 密碼輸入正確則屏幕顯示正確的提示,屏幕顯示提示:密碼正確!
5密碼輸入錯誤,屏幕顯示提示:密碼錯誤!請重新輸入。連續錯誤次數達到 3 次,并有紅色 LED 燈亮。
求大神幫 ,有源碼,能在開發板上使用
單片機源程序如下:
- #include "lcd12864.h"
- //寫數據
- void WriteDataLCD(unsigned char WDLCD)
- {
- ReadStatusLCD(); //檢測忙
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_Data = WDLCD;
- LCD_E = 1;
- LCD_E = 1;
- LCD_E = 1;
- LCD_E = 0;
- }
- //寫指令
- void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC為0時忽略忙檢測
- {
- if (BuysC) ReadStatusLCD(); //根據需要檢測忙
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_Data = WCLCD;
- LCD_E = 1;
- LCD_E = 1;
- LCD_E = 1;
- LCD_E = 0;
- }
- //讀數據
- unsigned char ReadDataLCD(void)
- {
- LCD_RS = 1;
- LCD_RW = 1;
- LCD_E = 0;
- LCD_E = 0;
- LCD_E = 1;
- return(LCD_Data);
- }
- //讀狀態
- unsigned char ReadStatusLCD(void)
- {
- LCD_Data = 0xFF;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_E = 1;
- while (LCD_Data & Busy); //檢測忙信號
- LCD_E = 0;
- return(LCD_Data);
- }
- void LCDInit(void) //LCM初始化
- {
- WriteCommandLCD(0x30,1); //顯示模式設置,開始要求每次檢測忙信號
- WriteCommandLCD(0x01,1); //顯示清屏
- WriteCommandLCD(0x06,1); // 顯示光標移動設置
- WriteCommandLCD(0x0C,1); // 顯示開及光標設置
- }
- void LCDClear(void) //清屏
- {
- WriteCommandLCD(0x01,1); //顯示清屏
- WriteCommandLCD(0x34,1); // 顯示光標移動設置
- WriteCommandLCD(0x30,1); // 顯示開及光標設置
- }
- void LCDFlash(void) //閃爍效果
- {
- WriteCommandLCD(0x08,1); //顯示清屏
- Delay400Ms();
- WriteCommandLCD(0x0c,1); // 顯示開及光標設置
- Delay400Ms();
- WriteCommandLCD(0x08,1); //顯示清屏
- Delay400Ms();
- WriteCommandLCD(0x0c,1); // 顯示開及光標設置
- Delay400Ms();
- WriteCommandLCD(0x08,1); //顯示清屏
- Delay400Ms();
- }
- //按指定位置顯示一個字符
- void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
- {
- if(Y<1)
- Y=1;
- if(Y>4)
- Y=4;
- X &= 0x0F; //限制X不能大于16,Y不能大于1
- switch(Y){
- case 1:X|=0X80;break;
- case 2:X|=0X90;break;
- case 3:X|=0X88;break;
- case 4:X|=0X98;break;
- }
- WriteCommandLCD(X, 0); //這里不檢測忙信號,發送地址碼
- WriteDataLCD(DData);
- }
- //按指定位置顯示一串字符
- void DisplayListChar(unsigned char X, unsigned char Y, unsigned char *DData)
- {
- unsigned char ListLength,X2;
- ListLength = 0;
- X2=X;
- if(Y<1)
- Y=1;
- if(Y>4)
- Y=4;
- X &= 0x0F; //限制X不能大于16,Y在1-4之內
- switch(Y){
- case 1:X2|=0X80;break; //根據行數來選擇相應地址
- case 2:X2|=0X90;break;
- case 3:X2|=0X88;break;
- case 4:X2|=0X98;break;
- }
- WriteCommandLCD(X2, 1); //發送地址碼
- while (DData[ListLength]>=0x20) //若到達字串尾則退出
- {
- if (X <= 0x0F) //X坐標應小于0xF
- {
- WriteDataLCD(DData[ListLength]); //
- ListLength++;
- X++;
- Delay5Ms();
- }
- }
- }
- //5ms延時
- void Delay5Ms(void)
- {
- unsigned int TempCyc = 5552;
- while(TempCyc--);
- }
- //400ms延時
- void Delay400Ms(void)
- {
- unsigned char TempCycA = 5;
- unsigned int TempCycB;
- while(TempCycA--)
- {
- TempCycB=7269;
- while(TempCycB--);
- };
- }
復制代碼
所有資料51hei提供下載:
新建文件夾 (2).zip
(1.96 KB, 下載次數: 35)
2020-1-12 13:31 上傳
點擊文件名下載附件
|