找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3286|回复: 1
收起左侧

键盘电子锁

[复制链接]
ID:85234 发表于 2015-7-21 18:11 | 显示全部楼层 |阅读模式
自己做的,实测可用

键盘电子锁(复位,改密码).zip

37.73 KB, 下载次数: 64, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的积分奖励!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2015-7-22 00:12 | 显示全部楼层
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #include"absacc.h"
  4. #include"math.h"
  5. #include"string.h"
  6. typedef unsigned char BYTE;
  7. typedef unsigned int   WORD;
  8. BYTE temp;
  9. BYTE key;
  10. BYTE dis_buf;
  11. BYTE Userpassword[10]="123";
  12. BYTE inputpassword[10]="";
  13. int a;a=0;
  14. sbit led2=P2^2;
  15. sbit led1=P2^1;
  16. sbit beep=P2^0;
  17. /*  液晶1602口地址*/
  18. #define wr_com XBYTE[0xC000] //写命令
  19. #define wr_data XBYTE[0xC100] //写数据
  20. #define rd_com XBYTE[0xC200] //读命令
  21. #define rd_data XBYTE[0xC300] //读数据
  22. void Delay(WORD n);
  23. void Delay2(WORD n);
  24. void ShowResult(BYTE ch);
  25. void lcd_init(void); // lcd初始化
  26. void write_cmd(BYTE cmd); // lcd写命令
  27. //void write_string(unsigned char *s); // 写字符串
  28. void write_data(BYTE dat) ; // 写数据
  29. void set_display_place(BYTE line,column);
  30. void write_string_lcd(BYTE line,column,unsigned char *string);
  31. /********************************************************************
  32. Function name: write_cmd
  33. Descriptions:  向lcd输入指令
  34. ********************************************************************/
  35. void write_cmd(BYTE cmd)
  36. {
  37. BYTE dl;
  38. do {
  39. dl=rd_com;
  40. } while((dl&0x80)!=0); //判忙
  41. wr_com= cmd;
  42. Delay(1);
  43. }
  44. /*******************************************************************
  45. Function name: write_data
  46. Descriptions:  写入数据
  47. *******************************************************************/
  48. void write_data(BYTE dat)  
  49. {
  50. BYTE dl;
  51. do {
  52. dl=rd_com;
  53. } while((dl&0x80)!=0); //判忙
  54. wr_data= dat;
  55. Delay(1);
  56. }
  57. /********************************************************************
  58. Function name: write_string
  59. Descriptions:  写入字符串
  60. ********************************************************************/
  61. void write_string(BYTE *s)
  62. {
  63. while(*s != '\0') //'\0'为字符串结束标志
  64. {
  65. write_data(*s);
  66. s++;
  67. }
  68. }
  69. /***************************************************************
  70. Function name: set_display_place
  71. Descriptions:  设置字符的显示位置
  72. **************************************************************/
  73. void set_display_place(BYTE line,column)
  74. {
  75. BYTE address;
  76. if(line == 1)
  77. {
  78. address = 0x80 + column;
  79. }
  80. else if(line == 2)
  81. {
  82. address = 0xc0 + column;
  83. }
  84. write_cmd(address);
  85. }
  86. /*****************************************************************
  87. Function name:  将字符串写到指定的位置
  88. Descriptions:  将字符串显示在lcd的特定位置
  89. *****************************************************************/
  90. void write_string_lcd(BYTE line,column,unsigned char *string)
  91. {
  92. set_display_place(line,column);
  93. write_string(string);
  94. Delay(1);
  95. }
  96. /***************************************************
  97. ************液晶模块初始化******************************
  98. ****************************************************/
  99. void lcd_init(void)
  100. {
  101. write_cmd(0x38);//
  102. write_cmd(0x38);//
  103. write_cmd(0x06);//
  104. write_cmd(0x0c);//
  105. write_cmd(0x01);//
  106. }
  107. void crti(unsigned long dat)  
  108. {
  109. unsigned char dhi;
  110. unsigned char dli;
  111. unsigned char ddi;
  112. unsigned char dei;
  113. unsigned long datah;
  114. unsigned long datal;
  115. datah=dat;
  116. dhi=0;
  117. if (datah>=10)
  118. {
  119. do
  120. {
  121. datah/=10;
  122. dhi++;
  123. }while(datah>=10);
  124. datah=dat;
  125. ddi=dhi;
  126. for (dli=0;dli<dhi;dli++)
  127. {
  128. datal=1;
  129. for (dei=0;dei<ddi;dei++)
  130. {
  131. datal*=10;
  132. }
  133. datah=dat/datal;
  134. dat=dat%datal;
  135. datah+=0x30;
  136. write_data(datah);
  137. ddi--;
  138. }
  139. dat+=0x30;
  140. write_data(dat);
  141. }
  142. else
  143. {
  144. dat=dat+0x30;
  145. write_data(dat);
  146. }
  147. }
  148. void Delay(WORD n)
  149. {
  150. WORD x;
  151. while(n--)
  152. {
  153. x=500;  while(x--);
  154. }
  155. }
  156. void Delay2(WORD n)
  157. {
  158. WORD x;
  159. while(n--)
  160. {
  161. x=5000;  while(x--);
  162. }
  163. }
  164. /*************************************************************/
  165. /*                                                           */
  166. /* 键扫描子程序                                              */
  167. /*                                                           */
  168. /*************************************************************/
  169. void  keyscan(void)
  170. {
  171.     P1=0x0F;                 //低四位输入  
  172.     Delay(1);
  173.         temp=P1;                 //读P1口
  174.     temp=temp&0x0F;
  175.     temp=~(temp|0xF0);
  176.     if(temp==1)
  177.         key=0;
  178.     else if(temp==2)
  179.         key=1;
  180.     else if(temp==4)
  181.         key=2;
  182.     else if(temp==8)
  183.         key=3;
  184.     else
  185.         key=16;
  186.         
  187.     P1=0xF0;                //高四位输入
  188.     Delay(1);
  189.         temp=P1;                //读P1口      
  190.     temp=temp&0xF0;
  191.     temp=~((temp>>4)|0xF0);
  192.     if(temp==1)
  193.         key=key+0;
  194.     else if(temp==2)
  195.         key=key+4;
  196.     else if(temp==4)
  197.         key=key+8;
  198.     else if(temp==8)
  199.         key=key+12;
  200.     else
  201.         key=16;
  202.            
  203.      dis_buf = key;                     //键值入显示缓存
  204.      //dis_buf = dis_buf & 0x0f;
  205. if(dis_buf>9)               //转换为ASCII码
  206.       dis_buf = dis_buf+0x37;
  207.      else
  208.           dis_buf = dis_buf+0x30;
  209. }
  210. void clear()
  211. {write_string_lcd(2,4, "               ");
  212. }

  213. int fuwei()
  214. {Delay2(15);
  215. //
  216. //
  217.         P1=0xF0;
  218.         if(P1!=0xF0)
  219.         {        Delay(1);
  220.         keyscan();
  221.         if(key==15)
  222.         return 0;
  223.         else return 1;
  224.         }
  225. }

  226. void main()
  227. {int j,w,c;
  228. c=0;
  229. w=0;
  230. j=4;
  231. SP=0x60;
  232. beep= 1;

  233. lcd_init();

  234.   while(1)
  235. {
  236. write_string_lcd(1,0, "Hello    ");   
  237. write_string_lcd(2,0, "key:");
  238. write_string_lcd(1,10, "warn:");
  239. set_display_place(1,15);
  240.         write_data(0x30+w);
  241.         if(c==1) write_string_lcd(1,7, "C");
  242.         else write_string_lcd(1,7, " ");
  243. write_string_lcd(2,j, "_");//光标闪烁
  244. Delay2(15);
  245. write_string_lcd(2,j," ");
  246. Delay2(15);
  247. //
  248. //
  249.         P1=0xF0;
  250.         if(P1!=0xF0)
  251.         {led1= 1;
  252.         led2= 1;
  253.         Delay(1);
  254.         keyscan();
  255.         switch(key)
  256.         {case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:
  257.         {inputpassword[a]=key+'0';
  258.         inputpassword[a+1]='\0';
  259.         a++;
  260.         set_display_place(2,j);
  261.         write_data(dis_buf);
  262.          j++;        
  263.                                 }break;
  264.          case 10:
  265.          j++;
  266.                         if(strcmp(inputpassword,Userpassword)==0)
  267.                         {
  268.                                                         write_string_lcd(2,0, "Unlock  OK!        ");
  269.                                                         write_string_lcd(1,0, "Welcome!          ");

  270.                                                         c=1;
  271.                                                         inputpassword[0]="a";                                                                       
  272.                                                         a=0;
  273.                                                         led1=0;               
  274.                                                         j=4;
  275.                                                         w=0;
  276.                                                         Delay2(200);
  277.                                                         clear();
  278.                         }
  279.                         else {w++;
  280.                                        
  281.                                         if(w<3)
  282.                                         {        write_string_lcd(2,4, " error          ");
  283.                                         inputpassword[10]="";
  284.                                         a=0;
  285.                                         led2=0;
  286.                                         Delay2(60);clear();j=4;c=0;}
  287.                                         else{while(fuwei()!=0){ write_string_lcd(2,4, " shutdown!!!          ");beep=0;}                                       
  288.                                         inputpassword[10]="";
  289.                                         clear();
  290.                                         beep=1;
  291.                                         a=0;       
  292.                                         j=4;
  293.                                         w=0;
  294.                                         c=0;}
  295.                                         //Delay2(60);
  296.                                         }
  297.                                         //clear();
  298.                                         break;
  299.                 case 12:
  300.                 if(c==0) {write_string_lcd(2,4, "can't change  ");Delay2(60);clear();j=4;a=0;}
  301.                 else
  302.         {       
  303.                
  304.                 Userpassword[0]=inputpassword[0];
  305.                 Userpassword[1]=inputpassword[1];
  306.                 Userpassword[2]=inputpassword[2];
  307.                         Userpassword[3]=inputpassword[3];
  308.                                 Userpassword[4]=inputpassword[4];
  309.                                         Userpassword[5]=inputpassword[5];
  310.                                                 Userpassword[6]=inputpassword[6];
  311.                                                         Userpassword[7]=inputpassword[7];
  312.                                                                 Userpassword[8]=inputpassword[8];
  313.                                                                         Userpassword[9]=inputpassword[9];
  314.                                                                                 Userpassword[10]=inputpassword[10];
  315.                 beep=1;
  316.                 j=4;
  317.                 w=0;
  318.                 c=0;
  319.                         a=0;write_string_lcd(2,4, "change ok! "); Delay2(60);clear();j=4;}
  320.                 break;
  321.                

  322.            case 14:
  323.                 {c=0;
  324.                 clear();
  325.                 inputpassword[10]="";
  326.                 j=4;
  327.                 a=0;}
  328.                 break;
  329.                          }
  330.                          }
  331. }
  332. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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