找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3727|回复: 0
打印 上一主题 下一主题
收起左侧

基于lgm12641液晶和单片机设计的密码锁程序仿真与实物

[复制链接]
跳转到指定楼层
楼主
proteus仿真的51单片机基于lgm12641制作出来的实物图如下:


电路原理图如下:


单片机程序源码
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. int t,key,wei=0;
  5. sbit rst=P2^5;
  6. sbit lcden=P2^4;
  7. sbit lcdrw=P2^3;
  8. sbit lcdrs=P2^2;
  9. sbit cs2=P2^1;
  10. sbit cs1=P2^0;
  11. sbit flag=P0^7;
  12. /*存储输入密码*/
  13. uchar w_pwd[]={-1,-1,-1};
  14. /*  !*2_   */
  15. uchar code num[]={0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,
  16. 0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,
  17. 0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
  18. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80};
  19. /*位密码锁*/
  20. uchar code dis[]={0x00,0x80,0x60,0xF8,0x07,0x10,0x90,0x10,0x11,0x16,0x10,0x10,0xD0,0x10,0x00,0x00,0x01,0x00,0x00,0xFF,0x40,0x40,0x41,0x5E,0x40,0x40,0x70,0x4E,0x41,0x40,0x40,0x00,
  21. 0x10,0x8C,0x44,0x04,0xE4,0x04,0x95,0xA6,0x44,0x24,0x14,0x84,0x44,0x94,0x0C,0x00,0x02,0x02,0x7A,0x41,0x41,0x43,0x42,0x7E,0x42,0x42,0x42,0x43,0xF8,0x00,0x00,0x00,
  22. 0x04,0x84,0xE4,0x5C,0x44,0xC4,0x00,0x02,0xF2,0x82,0x82,0x82,0xFE,0x80,0x80,0x00,0x02,0x01,0x7F,0x10,0x10,0x3F,0x00,0x08,0x08,0x08,0x08,0x48,0x88,0x40,0x3F,0x00,
  23. 0x20,0x10,0x2C,0xE7,0x24,0x24,0x00,0xE2,0x2C,0x20,0xBF,0x20,0x28,0xE6,0x00,0x00,0x01,0x01,0x01,0x7F,0x21,0x11,0x80,0x4F,0x20,0x10,0x0F,0x10,0x20,0x4F,0x80,0x00};

  24. /*请输入*/
  25. uchar code dis1[]={0x40,0x42,0xCC,0x00,0x00,0x44,0x54,0x54,0x54,0x7F,0x54,0x54,0x54,0x44,0x40,0x00,0x00,0x00,0x7F,0x20,0x10,0x00,0xFF,0x15,0x15,0x15,0x55,0x95,0x7F,0x00,0x00,0x00,
  26. 0x88,0x68,0x1F,0xC8,0x08,0x10,0xC8,0x54,0x52,0xD1,0x12,0x94,0x08,0xD0,0x10,0x00,0x09,0x19,0x09,0xFF,0x05,0x00,0xFF,0x12,0x92,0xFF,0x00,0x5F,0x80,0x7F,0x00,0x00,
  27. 0x00,0x00,0x00,0x00,0x00,0x01,0xE2,0x1C,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x03,0x0C,0x30,0x40,0x80,0x80,0x00};
  28. /*正确错误*/
  29. uchar code rg[]={0x00,0x02,0x02,0xC2,0x02,0x02,0x02,0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,0x00,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,
  30. 0x04,0x84,0xE4,0x5C,0x44,0xC4,0x20,0x10,0xE8,0x27,0x24,0xE4,0x34,0x2C,0xE0,0x00,0x02,0x01,0x7F,0x10,0x10,0x3F,0x80,0x60,0x1F,0x09,0x09,0x3F,0x49,0x89,0x7F,0x00,
  31. 0x40,0x30,0xEF,0x24,0x64,0x48,0x48,0x7F,0x48,0x48,0x48,0x7F,0x48,0x48,0x40,0x00,0x01,0x01,0x7F,0x21,0x11,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,
  32. 0x40,0x42,0xCC,0x00,0x00,0x80,0x9E,0x92,0x92,0x92,0x92,0x92,0x9E,0x80,0x00,0x00,0x00,0x00,0x7F,0x20,0x94,0x84,0x44,0x24,0x14,0x0F,0x14,0x24,0x44,0x84,0x84,0x00};
  33. void delay(uint k)
  34. {
  35.         uint i,j;
  36.         for(i=0;i<k;i++)
  37.         for(j=0;j<125;j++);
  38. }
  39. void left()
  40. {
  41.         cs1=1;
  42.         cs2=0;
  43. }
  44. void right()
  45. {
  46.         cs1=0;
  47.         cs2=1;
  48. }
  49. void busy()
  50. {
  51.         do
  52.                 {
  53.                         lcden=0;
  54.                         lcdrs=0;
  55.                         lcdrw=1;
  56.                         P0=0xff;
  57.                         lcden=1;
  58.                         lcden=0;
  59.                 }while(flag);
  60. }
  61. void write_lcdcom(uchar com)
  62. {
  63.         busy();
  64.         lcdrs=0;
  65.         lcdrw=0;
  66.         P0=com;
  67.         lcden=1;
  68.         lcden=0;
  69. }
  70. void write_lcddata(uchar date)
  71. {
  72.         busy();
  73.         lcdrs=1;
  74.         lcdrw=0;
  75.         P0=date;
  76.         lcden=1;
  77.         lcden=0;
  78. }
  79. void f_page(uchar page)
  80. {
  81.         uchar i;
  82.         i=page;
  83.         page=i|0xb8;
  84.         busy();
  85.         write_lcdcom(page);
  86. }
  87. void f_line(uchar line)
  88. {
  89.         uchar i;
  90.         i=line;
  91.         line=i|0x40;
  92.         busy();
  93.         write_lcdcom(line);
  94. }
  95. void lcd_ready()
  96. {
  97.         uchar i,j;
  98.         left();
  99.         for(i=0;i<8;i++)
  100.         {
  101.                 f_page(i);
  102.                 f_line(0x00);
  103.                 for(j=0;j<64;j++)
  104.                 {
  105.                         write_lcddata(0x00);
  106.                 }
  107.         }
  108.         right();
  109.         for(i=0;i<8;i++)
  110.         {
  111.                 f_page(i);
  112.                 f_line(0x00);
  113.                 for(j=0;j<64;j++)
  114.                 {
  115.                         write_lcddata(0x00);
  116.                 }
  117.         }
  118. }
  119. void lcd_1(uchar *s,uchar page,uchar line)
  120. {
  121.         uchar i,j;
  122.         f_page(page);
  123.         f_line(line);
  124.         for(i=0;i<16;i++)
  125.         {
  126.                 write_lcddata(*s);
  127.                 s++;
  128.         }
  129.         f_page(page+1);
  130.         f_line(line);
  131.         for(j=0;j<16;j++)
  132.         {
  133.                 write_lcddata(*s);
  134.                 s++;
  135.         }
  136. }
  137. void lcd_2(char *s,uchar page,uchar line)
  138. {
  139.         uchar i,j;
  140.         f_page(page);
  141.         f_line(line);
  142.         for(i=0;i<8;i++)
  143.         {
  144.                 write_lcddata(*s);
  145.                 s++;
  146.         }
  147.         f_page(page+1);
  148.         f_line(line);
  149.         for(j=0;j<8;j++)
  150.         {
  151.                 write_lcddata(*s);
  152.                 s++;
  153.         }
  154. }
  155. void display()//显示2位密码锁 欢迎使用!
  156. {
  157.         left();
  158.         lcd_2(num+32,0x00,23);
  159.         lcd_1(dis,0x00,31);
  160.         lcd_1(dis+32,0x00,47);
  161.         right();
  162.         lcd_1(dis+64,0x00,0);
  163.         lcd_1(dis+96,0x00,16);
  164.         left();
  165.         lcd_1(dis1,0x04,15);
  166.         lcd_1(dis1+32,0x04,31);
  167.         lcd_1(dis1+64,0x04,47);
  168.         right();
  169.         lcd_1(dis+32,0x04,0);
  170.         lcd_1(dis+64,0x04,16);
  171.         lcd_2(num,0x04,32);
  172. }
  173. void display1(uint i)//显示密码判断结果  正确or错误
  174. {
  175.         if(i==1)
  176.         {
  177.         left();
  178.         lcd_1(rg,0x04,15);
  179.         lcd_1(rg+32,0x04,31);
  180.         }
  181.         else
  182.         {
  183.         left();
  184.         lcd_1(rg+64,0x04,15);
  185.         lcd_1(rg+94,0x04,31);               
  186.         }
  187.   delay(1500);
  188. }
  189. void display2()//显示输入密码时状态  *_
  190. {
  191.         left();
  192.         lcd_2(num+32,0x00,23);
  193.         lcd_1(dis,0x00,31);
  194.         lcd_1(dis+32,0x00,47);
  195.         right();
  196.         lcd_1(dis+64,0x00,0);
  197.         lcd_1(dis+96,0x00,16);
  198.         if(wei==0)
  199.         {
  200.         left();
  201.         lcd_2(num+48,0x04,15);
  202.         }
  203.         if(wei==1)
  204.         {
  205.         left();
  206.         lcd_2(num+16,0x04,15);
  207.         lcd_2(num+48,0x04,31);
  208.         }
  209.         if(wei==2)
  210.         {
  211.         left();
  212.         lcd_2(num+16,0x04,15);
  213.         lcd_2(num+16,0x04,31);
  214.         }
  215. }
  216. void w_pw()//密码显示函数
  217. {
  218.         lcd_ready();
  219.         display2();
  220. }
  221. void w_res()//结果函数 初始密码:00
  222. {
  223.         if(w_pwd[1]==0&&w_pwd[2]==0)
  224.         display1(1);
  225.         else
  226.         display1(0);
  227. }
  228. void keyscan()//键盘扫描获取函数
  229. {
  230.         key=-1;
  231.         P1=0xfe;
  232.         t=P1;
  233.         t&=0xf0;
  234.         if(t!=0xf0)
  235.         {
  236.                 delay(1);
  237.                 if(t!=0xf0)
  238.                 {
  239.                         t=P1;
  240.                         switch(t)
  241.                         {
  242.                                 case 0xee:key=1;wei++;break;
  243.                                 case 0xde:key=2;wei++;break;
  244.                                 case 0xbe:key=3;wei++;break;
  245.                         }
  246.                         if(wei<0)wei=0;if(wei>2)wei=2;
  247.                         if(key>=0&&key<10)w_pwd[wei]=key;
  248.                         if(wei>-1)
  249.             w_pw();
  250.                         while(t!=0xf0)
  251.          {
  252.            t=P1;
  253.            t=t&0xf0;
  254.          }
  255.                 }
  256.         }
  257.         P1=0xfd;
  258.         t=P1;
  259.         t&=0xf0;
  260.         if(t!=0xf0)
  261.         {
  262.                 delay(1);
  263.                 if(t!=0xf0)
  264.                 {
  265.                         t=P1;
  266.                         switch(t)
  267.                         {
  268.                                 case 0xed:key=4;wei++;break;
  269.                                 case 0xdd:key=5;wei++;break;
  270.                                 case 0xbd:key=6;wei++;break;
  271.                         }
  272.                         if(wei<0)wei=0;if(wei>2)wei=2;
  273.                         if(key>=0&&key<10)w_pwd[wei]=key;
  274.                         if(wei>-1)
  275.             w_pw();
  276.                         while(t!=0xf0)
  277.          {
  278.            t=P1;
  279.            t=t&0xf0;
  280.          }
  281.                 }
  282.         }
  283.         P1=0xfb;
  284.         t=P1;
  285.         t&=0xf0;
  286.         if(t!=0xf0)
  287.         {
  288.                 delay(1);
  289.                 if(t!=0xf0)
  290.                 {
  291.                         t=P1;
  292.                         switch(t)
  293.                         {
  294.                                 case 0xeb:key=7;wei++;break;
  295.                                 case 0xdb:key=8;wei++;break;
  296.                                 case 0xbb:key=9;wei++;break;
  297.                         }
  298.                         if(wei<0)wei=0;if(wei>2)wei=2;
  299.                         if(key>=0&&key<10)w_pwd[wei]=key;
  300.                         if(wei>-1)
  301.             w_pw();
  302.                         while(t!=0xf0)
  303.          {
  304.            t=P1;
  305.            t=t&0xf0;
  306.          }
  307.                 }
  308.         }
  309.         P1=0xf7;
  310.         t=P1;
  311.         t&=0xf0;
  312.         if(t!=0xf0)
  313.         {
  314.                 delay(1);
  315.                 if(t!=0xf0)
  316.                 {
  317.                         t=P1;
  318.                         switch(t)
  319.                         {
  320.                                 case 0xe7:key=10;wei--;break;
  321.                                 case 0xd7:key=0;wei++;break;
  322.                                 case 0xb7:key=11;wei++;break;
  323.                         }
  324.                         if(wei<0)wei=0;if(wei>2)wei=2;
  325.                         if(key>=0&&key<10)w_pwd[wei]=key;
  326.                         if(wei>-1)
  327.             w_pw();
  328.                         while(t!=0xf0)
  329.          {
  330.            t=P1;
  331.            t=t&0xf0;
  332.          }
  333.                 }
  334.         }
  335. }

  336. void main()
  337. {
  338.         rst=1;   //开显示屏
  339.         lcd_ready();
  340.         display();
  341.         while(1)
  342.         {
  343.                 keyscan();
  344.                 if(key==11)//11代表确定键 10表示取消键
  345.                 {
  346.                         w_res();
  347.                         break;
  348.                 }
  349.         }
  350. }
复制代码

密码锁全部资料51hei下载地址:
lgm12641_suo.rar (80.67 KB, 下载次数: 22)


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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