电子密码锁
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)
|