找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4524|回复: 8
收起左侧

LCD1602做密码锁—可修改密码 带仿真文件 电路图

[复制链接]
ID:80594 发表于 2015-7-17 11:22 | 显示全部楼层 |阅读模式
源文件:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. sbit RS=P3^1;
  4. sbit RW=P3^2;
  5. sbit E=P3^3;
  6. void lcd_w_cmd(unsigned char com);
  7. void lcd_w_dat(unsigned char dat);
  8. unsigned char lcd_r_start();
  9. void lcd_int();
  10. void delay(unsigned int i);
  11. void delay1();
  12. char keyscan();
  13. void puts(unsigned char ch[]);
  14. void set_pw();                                                                                                          
  15. unsigned char codekey_code[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
  16. unsigned char pw[6]={0,0,0,0,0,0,};
  17. unsigned char pwnew[10]={0,0,0,0,0,0,0,0,0,0};
  18. sbit P30=P3^0;


  19. void puts(unsigned char ch[])
  20. {
  21. unsigned char i;
  22. i=0;
  23. while(ch[i]!='\0')
  24. {
  25.   lcd_w_dat(ch[i]);
  26.   i++;
  27.   }
  28.   }


  29. void set_pw()
  30. {
  31. unsigned char key,count;
  32. lcd_w_cmd(0x01);
  33. puts("password setup:");
  34. lcd_w_cmd(0xc0);
  35. while(1)
  36. {
  37.   key=keyscan();
  38.   if(key>=0&&key<=9)
  39.   {
  40.    lcd_w_dat(key+0x30);
  41.    pw[count]=key;
  42.    count++;
  43.    if(count==6)break;
  44.    P2=0xf0;
  45.    while(P2!=0xf0);}
  46.    }
  47.    }


  48. void main()
  49. {
  50. unsigned char i,count;
  51. bit pw_flag;
  52. P1=0xff;
  53. lcd_int();
  54. delay(255);
  55. lcd_w_cmd(0x80);
  56. puts("password:");
  57. count=0;
  58. while(1)
  59. {
  60.   i=keyscan();
  61.   if(i!=-1)
  62.   {
  63.    if(i>=0&&i<=9)
  64.    {
  65.     pwnew[count]=i;
  66.         lcd_w_dat(i+0x30);
  67.         count++;
  68.         P2=0xf0;
  69.         while(P2!=0xf0);}
  70.         else if(i==10)
  71.         {
  72.          pw_flag=1;
  73.          if(count!=6)
  74.          pw_flag=0;
  75.          else
  76.           {
  77.            for(i=0;i<6;i++)
  78.            {
  79.             if(pw[i]!=pwnew[i])
  80.                 {
  81.                  pw_flag=0;break;}
  82.                  }
  83.             }
  84. if(pw_flag==1)
  85. {
  86. lcd_w_cmd(0xc0);
  87. puts("pass");
  88. P30=0;
  89.   P2=0xf0;
  90.   while(P2!=0xf0);
  91. while(1)
  92. {
  93.   i=keyscan();
  94.   if(i!=-1)
  95.   break;
  96.   }
  97.   P2=0xf0;
  98.   while(P2!=0xf0);
  99.   if(i==11)set_pw();
  100.   }
  101.   else
  102.   {
  103.    lcd_w_cmd(0xc0);
  104.    P30=1;
  105.    puts("error");}
  106.    count=0;
  107.    delay(50000);
  108.    lcd_w_cmd(0x01);
  109.    puts("password:");
  110.    }}}}


  111. char keyscan()
  112. {
  113. char scan1,scan2,keycode,j,key;
  114. key=-1;
  115. P2=0xf0;
  116. scan1=P2;
  117. if(scan1!=0xf0)
  118. {
  119. delay(1200);
  120. scan1=P2;
  121. if(scan1!=0xf0)
  122. {
  123.   P2=0x0f;
  124.   scan2=P2;
  125.   keycode=scan1|scan2;
  126.   for(j=0;j<16;j++)
  127.   {
  128.    if(keycode==codekey_code[j])
  129.    {
  130.     key=j;break;}
  131.         }}}
  132.         return(key);
  133.         }


  134. void delay1()
  135. {
  136. _nop_();
  137. _nop_();
  138. _nop_();
  139. }
  140. void lcd_int()
  141. {
  142. lcd_w_cmd(0x3c);
  143. lcd_w_cmd(0x0e);
  144. lcd_w_cmd(0x01);
  145. lcd_w_cmd(0x06);
  146. lcd_w_cmd(0x80);
  147. }

  148. unsigned char lcd_r_start()
  149. {
  150. unsigned char s;
  151. RW=1;
  152. delay1();
  153. RS=0;
  154. delay1();
  155. E=1;
  156. delay1();
  157. s=P1;
  158. delay1();
  159. E=0;
  160. delay1();
  161. RW=0;
  162. delay1();
  163. return(s);
  164. }
  165. void lcd_w_cmd(unsigned char com)
  166. {
  167. unsigned char i;
  168. do{
  169.     i=lcd_r_start();
  170.         i&=0x80;
  171.         delay(2);
  172.         }
  173.         while(i!=0);
  174. RW=0;
  175. delay1();
  176. RS=0;
  177. delay1();
  178. E=1;
  179. delay1();
  180. P1=com;
  181. delay1();
  182. E=0;
  183. delay1();
  184. RW=1;
  185. delay(255);
  186. }
  187. void lcd_w_dat(unsigned char dat)
  188. {
  189. unsigned char i;
  190. do{
  191.     i=lcd_r_start();
  192.         i&=0x80;
  193.         delay(2);
  194.         }
  195.         while(i!=0);
  196. RW=0;
  197. delay1();
  198. RS=1;
  199. delay1();
  200. E=1;
  201. delay1();
  202. P1=dat;
  203. delay1();
  204. E=0;
  205. delay1();
  206. RW=1;
  207. delay(255);
  208. }
  209.    void delay(unsigned int i)
  210.   {unsigned int k;
  211.    for(k=0;k<i;k++);
  212.    }
复制代码


完整程序 电路图 仿真文件下载: lcd 密码锁.zip (75.46 KB, 下载次数: 101)

评分

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

查看全部评分

回复

使用道具 举报

ID:96006 发表于 2015-11-16 17:47 | 显示全部楼层
我的币现在是0啊
回复

使用道具 举报

ID:87193 发表于 2015-11-17 08:50 | 显示全部楼层
怎么没有截图呢,或者其他的呢
回复

使用道具 举报

ID:98680 发表于 2015-12-7 20:12 | 显示全部楼层
看看·~~~~~~~~~~~
回复

使用道具 举报

ID:97697 发表于 2015-12-24 14:37 | 显示全部楼层
我也试做一个
回复

使用道具 举报

ID:127184 发表于 2016-6-18 16:20 | 显示全部楼层
不错不错,我带走看看学习下
回复

使用道具 举报

ID:127330 发表于 2016-6-20 01:08 | 显示全部楼层
很好,还行,有用
回复

使用道具 举报

ID:166410 发表于 2017-2-24 19:02 | 显示全部楼层
不错 还可以
回复

使用道具 举报

ID:150257 发表于 2017-2-27 17:25 | 显示全部楼层
怎么没有图 图呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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