找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1653|回复: 4
收起左侧

单片机12864电子锁程序

[复制链接]
回帖奖励 250 黑币 回复本帖可获得 50 黑币奖励! 每人限 1 次
ID:682017 发表于 2020-1-12 13:34 | 显示全部楼层 |阅读模式
电子密码锁
1. 采用 LCD12864 显示;
2. 矩阵式按键输入密码,密码长度 6 位;
3. 具有密码修改功能,可存储 3 组密码;
4. 密码输入正确则屏幕显示正确的提示,屏幕显示提示:密码正确!  
5密码输入错误,屏幕显示提示:密码错误!请重新输入。连续错误次数达到 3 次,并有红色 LED 灯亮。
求大神帮 ,有源码,能在开发板上使用

单片机源程序如下:
  1. #include "lcd12864.h"


  2. //写数据
  3. void WriteDataLCD(unsigned char WDLCD)
  4. {
  5. ReadStatusLCD(); //检测忙
  6. LCD_RS = 1;
  7. LCD_RW = 0;
  8. LCD_Data = WDLCD;
  9. LCD_E = 1;
  10. LCD_E = 1;
  11. LCD_E = 1;
  12. LCD_E = 0;
  13. }

  14. //写指令
  15. void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
  16. {
  17. if (BuysC) ReadStatusLCD(); //根据需要检测忙
  18. LCD_RS = 0;
  19. LCD_RW = 0;
  20. LCD_Data = WCLCD;
  21. LCD_E = 1;
  22. LCD_E = 1;
  23. LCD_E = 1;
  24. LCD_E = 0;  
  25. }

  26. //读数据
  27. unsigned char ReadDataLCD(void)
  28. {
  29. LCD_RS = 1;
  30. LCD_RW = 1;
  31. LCD_E = 0;
  32. LCD_E = 0;
  33. LCD_E = 1;
  34. return(LCD_Data);
  35. }

  36. //读状态
  37. unsigned char ReadStatusLCD(void)
  38. {
  39. LCD_Data = 0xFF;
  40. LCD_RS = 0;
  41. LCD_RW = 1;
  42. LCD_E = 1;
  43. while (LCD_Data & Busy); //检测忙信号
  44. LCD_E = 0;
  45. return(LCD_Data);
  46. }

  47. void LCDInit(void) //LCM初始化
  48. {
  49. WriteCommandLCD(0x30,1); //显示模式设置,开始要求每次检测忙信号
  50. WriteCommandLCD(0x01,1); //显示清屏
  51. WriteCommandLCD(0x06,1); // 显示光标移动设置
  52. WriteCommandLCD(0x0C,1); // 显示开及光标设置
  53. }
  54. void LCDClear(void) //清屏
  55. {
  56. WriteCommandLCD(0x01,1); //显示清屏
  57. WriteCommandLCD(0x34,1); // 显示光标移动设置
  58. WriteCommandLCD(0x30,1); // 显示开及光标设置
  59. }
  60. void LCDFlash(void)        //闪烁效果
  61. {
  62. WriteCommandLCD(0x08,1); //显示清屏
  63. Delay400Ms();
  64. WriteCommandLCD(0x0c,1); // 显示开及光标设置
  65. Delay400Ms();
  66. WriteCommandLCD(0x08,1); //显示清屏
  67. Delay400Ms();
  68. WriteCommandLCD(0x0c,1); // 显示开及光标设置
  69. Delay400Ms();
  70. WriteCommandLCD(0x08,1); //显示清屏
  71. Delay400Ms();
  72. }
  73. //按指定位置显示一个字符
  74. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
  75. {
  76. if(Y<1)
  77.          Y=1;
  78. if(Y>4)
  79.          Y=4;
  80. X &= 0x0F; //限制X不能大于16,Y不能大于1
  81. switch(Y){
  82.         case 1:X|=0X80;break;
  83.         case 2:X|=0X90;break;
  84.         case 3:X|=0X88;break;
  85.         case 4:X|=0X98;break;
  86.         }
  87. WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
  88. WriteDataLCD(DData);
  89. }

  90. //按指定位置显示一串字符
  91. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char  *DData)
  92. {
  93. unsigned char ListLength,X2;
  94.   ListLength = 0;
  95.   X2=X;
  96. if(Y<1)
  97.          Y=1;
  98. if(Y>4)
  99.          Y=4;
  100. X &= 0x0F; //限制X不能大于16,Y在1-4之内
  101. switch(Y){
  102.         case 1:X2|=0X80;break;        //根据行数来选择相应地址
  103.         case 2:X2|=0X90;break;
  104.         case 3:X2|=0X88;break;
  105.         case 4:X2|=0X98;break;
  106.         }
  107. WriteCommandLCD(X2, 1); //发送地址码
  108.   while (DData[ListLength]>=0x20) //若到达字串尾则退出
  109.   {
  110.    if (X <= 0x0F) //X坐标应小于0xF
  111.     {
  112.      WriteDataLCD(DData[ListLength]); //
  113.      ListLength++;
  114.          X++;
  115.          Delay5Ms();
  116.     }
  117.   }
  118. }



  119. //5ms延时
  120. void Delay5Ms(void)
  121. {
  122. unsigned int TempCyc = 5552;
  123. while(TempCyc--);
  124. }

  125. //400ms延时
  126. void Delay400Ms(void)
  127. {
  128. unsigned char TempCycA = 5;
  129. unsigned int TempCycB;
  130. while(TempCycA--)
  131. {
  132.   TempCycB=7269;
  133.   while(TempCycB--);
  134. };
  135. }
复制代码

所有资料51hei提供下载:
新建文件夹 (2).zip (1.96 KB, 下载次数: 35)
回复

使用道具 举报

ID:110278 发表于 2020-3-6 16:12 | 显示全部楼层
挺好用的。
回复

使用道具 举报

ID:702057 发表于 2020-3-7 13:39 | 显示全部楼层
看上去不错,一样能用吧!
回复

使用道具 举报

ID:701661 发表于 2020-3-8 03:14 | 显示全部楼层
写的很详细,目测应该能用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表