找回密码
 立即注册

QQ登录

只需一步,快速开始

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

8051单片机电子密码锁防盗系统的仿真设计(12864显示)

[复制链接]
跳转到指定楼层
楼主
字模方式:
{0x00,0x02,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,0x00},
{0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00},/*"王",0*/
//取模方式为
//(1)点阵格式:阴码
//(2)取模走向:逆向
//(3)取模方式:列行式
//(4)c51格式
//(5)点阵:16*16
//取模软件为PCtolCD2002完美版

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. /*
  2. 题目:基于8051单片机的电子密码锁防盗系统的设计
  3. 作者:yarcl(原名:肖志)
  4. 注意:本文件包含LCDINIT.H和OWNMATH.C文件,LCDINIT.H主要是包含位定义,全局变量,函数声明等
  5.           而OWNMATH.C文件主要是包含12864液晶显示屏的写数据、写指令函数。
  6.           本程序当中最核心的程序部分应该是键盘扫描函数,读者可以细细品味其中的优点,在此不作叙述!
  7.           对了,修改密码的函数是采用中断方式1的模式进行的,大家也可以细细品味。
  8. */
  9. #include < reg52.h > //包含头文件
  10. #include "LcdInit.h" //包含本地文件LcdInit.h
  11. #include "ownmath.c" //包含本地文件ownmath.c

  12. static uchar mima[6] = {1,2,3,7,8,9}; //存入的密码
  13. uchar shuru[6];                                        //将输入的密码存入到shuru这个数组当中去

  14. //函数声明
  15. uchar key_scan();

  16. //字模数据(依次顺序为“居民小区:请输入密码:位数重新”)
  17. uchar code data_shuju[15][32] = {
  18. 0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xF2,0x92,0x92,0x92,0x9E,0x80,0x80,0x00,
  19. 0x40,0x30,0x0F,0x00,0xFC,0x44,0x44,0x44,0x47,0x44,0x44,0x44,0xFC,0x00,0x00,0x00,/*"居",0*/

  20. …………
  21. …………限于本文篇幅 余下代码请从51黑下载附件…………

  22. 0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,/*"*",10*/
  23. };

  24. //消去液晶显示屏的某些数字或者字母的显示
  25. uchar code disappear_char[1][16] = {
  26. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
  27. };
  28. //消去液晶显示屏的某些汉字的显示
  29. uchar code disappear_hanzi[1][32] = {
  30. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
  31. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  32. };

  33. /***************************************************************
  34. 名称:进入主函数时的初始化函数
  35. 功能:进行12864液晶显示屏的初始化
  36.           并且显示居民小区和请输入密码的提示字符
  37.           对门锁的初始化作用,P32口的低电平
  38. ***************************************************************/
  39. void init_main() {
  40.         Lcd_Initial();                            //对12864液晶显示屏的初始化作用
  41.         number = 0;                                   //密码存储,显示位置,各方面清零
  42.         P32 = 0;                                   //进行电磁铁的初始关闭作用
  43.         //显示居民小区:
  44.         Lcd_Character_16X16( 1, 0, 0,data_shuju[0]);
  45.         Lcd_Character_16X16( 1, 0, 16,data_shuju[1]);
  46.         Lcd_Character_16X16( 1, 0, 32,data_shuju[2]);
  47.         Lcd_Character_16X16( 1, 0, 48,data_shuju[3]);
  48.         Lcd_Character_16X16( 1, 0, 64,data_shuju[4]);
  49.         //显示请输入密码:
  50.         Lcd_Character_16X16( 1, 4, 0,data_shuju[5]);
  51.         Lcd_Character_16X16( 1, 4, 16,data_shuju[6]);
  52.         Lcd_Character_16X16( 1, 4, 32,data_shuju[7]);
  53.         Lcd_Character_16X16( 1, 4, 48,data_shuju[8]);
  54.         Lcd_Character_16X16( 1, 4, 64,data_shuju[9]);
  55.         Lcd_Character_16X16( 1, 4, 80,data_shuju[10]);

  56.         EA = 1;                                           //总中断打开
  57.         EX1 = 1;                                   //外部中断1打开
  58.         IT1 = 0;                                   //外部中断1工作方式,为低电平触发,IT1 = 1为下降沿触发
  59. }

  60. /***************************************************************
  61. 函数:主函数
  62. 功能:综合各个函数的作用
  63. 注意:进入主函数的时候,首先开启初始化函数功能
  64. ***************************************************************/
  65. void main() {
  66.         init_main();                           //初始化主函数之前的所有操作
  67.         while(1) {                                   //进入无限循环当中
  68.                 key_scan();                           //进行键盘扫描函数
  69.         }
  70.         //clear_screen();
  71. }

  72. /*********************************************************************
  73. 函数:键盘扫描函数
  74. 功能:集成了输入密码,显示密码个数,清除密码,
  75.           显示密码正确与错误各种功能的集成函数
  76.           可称为本函数的核心函数之一
  77. 键盘扫描方式:采用的翻转法的键盘扫描,可以减少扫描代码的数量
  78. 注意:本函数采用的是带有返回值,不带参数的函数,所以在函数的
  79.           末尾一定要加入return keyscan;这个语句
  80. **********************************************************************/
  81. uchar key_scan()
  82. {                                                                                  //函数开始
  83.    unsigned char k=0,p1_h=0,p1_l=0;                  //翻转法的定义k为选择分支作用,
  84.    uchar Mark;                                                                                  //p1_h是选择分支的高四位,p1_l是选择分支的低四位
  85.    char keyscan = 0, i = 0, j = 0;                  //记录输入的数据是数值,然后将其送入到shuru所代表的数组当中去
  86.                                                                                      //i的作用记录输入的数据是否是6位数据,防止超出所存储的数组的空间
  87.                                                                                   //j的作用是用来加强功能键“确认”的作用
  88. /*************************/
  89.         P1 = 0xf0;                                  //翻转法先给P1口送数据
  90.         k = P1;                                          //然后赋值给k
  91.         if(k != 0xf0)                                  //判断k是否是0xf0,如果不是,进入内部执行相应的程序
  92.         {
  93.                 delayms(50);                          //延时,防抖动
  94.                 k = P1;                                  //重新赋值
  95.                 if(k != 0xf0)                          //确定是否k不等于0xf0
  96.                 {
  97.                         number++;                  //number用于确定后面的在12864中的输出位置和密码存储的位置
  98.                         p1_h = P1;                  //将P1的高四位赋值给p1_h
  99.                         P1 = 0x0f;                  //然后将0x0f赋值给P1口,翻转,确定低四位,赋值给p1_l
  100.                         p1_l = P1;                  //将P1口的值赋给p1_l(是小写的字母l,不是数字1)

  101.                         k = p1_h|p1_l;                  //将高四位和低四位相或,然后赋值给k
  102.                         if (k == 0XE7) {          //此判断是为了确定是否是确认按键,如果是,直接进入确定程序
  103.                                 j = 1;        
  104.                         }

  105.                         if(number == 7)                  //此判断是为了确定输入的是否是6个数字,防止多输入或者少输入
  106.                         {
  107.                                 if (k != 0XB7) {  //这个是判断是否是清除按键,
  108.                                         number = 0;
  109.                                 }
  110.                         }

  111.                         while (p1_l == P1);          //这个是松手检测,防止长时间按在按键上,使输入的数据重复
  112.                         if (number > 0||j == 1){  
  113.                                 switch(k)          //条件分支语句
  114.                                 {
  115.                                         case 0XD7: keyscan = 0;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[0]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  116.                                         case 0XEE: keyscan = 1;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[1]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  117.                                         case 0XDE: keyscan = 2; Lcd_Character_16X8( 1, 6, 8*number,shuzi[2]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  118.                                         case 0XBE: keyscan = 3; Lcd_Character_16X8( 1, 6, 8*number,shuzi[3]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  119.                                         case 0XED: keyscan = 4;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[4]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  120.                                         case 0XDD: keyscan = 5;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[5]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  121.                                         case 0XBD: keyscan = 6; Lcd_Character_16X8( 1, 6, 8*number,shuzi[6]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  122.                                         case 0XEB: keyscan = 7;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[7]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  123.                                         case 0XDB: keyscan = 8;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[8]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  124.                                         case 0XBB: keyscan = 9; Lcd_Character_16X8( 1, 6, 8*number,shuzi[9]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  125.                                         case 0XE7: number = 0;
  126.                                                            for(i = 0; i < 6; i++)
  127.                                                                         if (mima[i] != shuru[i])//对比原始密码和输入密码
  128.                                                                         {
  129.                                                                                 Mark++;
  130.                                                                                 //该if语句是用来判断密码Mark的错误次数,一旦达到3次,
  131.                                                                                 //就进入到while循环当中,并且P30口 = 0;蜂鸣器响,直至单片机复位才可消失
  132.                                                                                 if (3 == Mark) {
  133.                                                                                         P30 = 0;
  134.                                                                                         Lcd_Character_16X8( 1, 6, 8*1,disappear_char[0]);
  135.                                                                                         Lcd_Character_16X8( 1, 6, 8*2,disappear_char[0]);
  136.                                                                                         Lcd_Character_16X8( 1, 6, 8*3,disappear_char[0]);
  137.                                                                                         Lcd_Character_16X8( 1, 6, 8*4,disappear_char[0]);
  138.                                                                                         Lcd_Character_16X8( 1, 6, 8*5,disappear_char[0]);
  139.                                                                                         Lcd_Character_16X8( 1, 6, 8*6,disappear_char[0]);
  140.                                                                                         while(1);
  141.                                                                                 }
  142.                                                                                 //密码错误
  143.                                                                                 Lcd_Character_16X16( 1, 6, 64,mistake[0]);
  144.                                                                                 Lcd_Character_16X16( 1, 6, 80,mistake[1]);
  145.                                                                                 Lcd_Character_16X16( 1, 6, 96,mistake[2]);
  146.                                                                                 Lcd_Character_16X16( 1, 6, 112,mistake[3]);
  147.                                                                                 //消除密码显示
  148.                                                                                 delayms(1000);
  149.                                                                                 Lcd_Character_16X8( 1, 6, 8*1,disappear_char[0]);
  150.                                                                                 Lcd_Character_16X8( 1, 6, 8*2,disappear_char[0]);
  151.                                                                                 Lcd_Character_16X8( 1, 6, 8*3,disappear_char[0]);
  152.                                                                                 Lcd_Character_16X8( 1, 6, 8*4,disappear_char[0]);
  153.                                                                                 Lcd_Character_16X8( 1, 6, 8*5,disappear_char[0]);
  154.                                                                                 Lcd_Character_16X8( 1, 6, 8*6,disappear_char[0]);
  155.                                                                                 //消除密码错误汉字显示
  156.                                                                                 Lcd_Character_16X16( 1, 6, 64,disappear_hanzi[0]);
  157.                                                                                 Lcd_Character_16X16( 1, 6, 80,disappear_hanzi[0]);
  158.                                                                                 Lcd_Character_16X16( 1, 6, 96,disappear_hanzi[0]);
  159.                                                                                 Lcd_Character_16X16( 1, 6, 112,disappear_hanzi[0]);
  160.                                                                                 break;                                                                                                
  161.                                                                         }
  162.                                                                         if(i == 6)        //确认密码是否是正确的,通过i值
  163.                                                                         {
  164.                                                                                 //输入密码正确
  165.                                                                                 Lcd_Character_16X16( 1, 6, 64,mistake[0]);
  166.                                                                                 Lcd_Character_16X16( 1, 6, 80,mistake[1]);
  167.                                                                                 Lcd_Character_16X16( 1, 6, 96,mistake[4]);
  168.                                                                                 Lcd_Character_16X16( 1, 6, 112,mistake[5]);
  169.                                                                                 delayms(1000);                //延时
  170.                                                                                 //消除密码显示位
  171.                                                                                 Lcd_Character_16X8( 1, 6, 8*1,disappear_char[0]);
  172.                                                                                 Lcd_Character_16X8( 1, 6, 8*2,disappear_char[0]);
  173.                                                                                 Lcd_Character_16X8( 1, 6, 8*3,disappear_char[0]);
  174.                                                                                 Lcd_Character_16X8( 1, 6, 8*4,disappear_char[0]);
  175.                                                                                 Lcd_Character_16X8( 1, 6, 8*5,disappear_char[0]);
  176.                                                                                 Lcd_Character_16X8( 1, 6, 8*6,disappear_char[0]);
  177.                                                                                 //消除密码正确显示位
  178.                                                                                 Lcd_Character_16X16( 1, 6, 64,disappear_hanzi[0]);
  179.                                                                                 Lcd_Character_16X16( 1, 6, 80,disappear_hanzi[0]);
  180.                                                                                 Lcd_Character_16X16( 1, 6, 96,disappear_hanzi[0]);
  181.                                                                                 Lcd_Character_16X16( 1, 6, 112,disappear_hanzi[0]);
  182.                                                                                 P32 = 1;
  183.                                                                                 delayms(2000);
  184.                                                                                 P32 = 0;
  185.                                                                         }
  186.                                                                 break;         
  187.                                         case 0XB7: keyscan = 10;number--;Lcd_Character_16X8( 1, 6, 8*number,disappear_char[0]);number--;break;
  188.                                         //这个是用来清除输错的密码,然后重新输入新的位数的密码
  189.                                         default: break;
  190.                                 /*        case 0XE7: return(4);break;
  191.                                         case 0XDE: return(5);break;
  192.                                         case 0XDD: return(6);break;
  193.                                         case 0XDB: return(7);break;
  194.                                         case 0XD7: return(8);break;
  195.                                         case 0XBE: return(9);break;
  196.                                         case 0XBD: return(10);break;
  197.                                         case 0XBB: return(11);break;
  198.                                         case 0XB7: return(12);break;
  199.                                         case 0X7E: return(13);break;
  200.                                         case 0X7D: return(14);break;
  201.                                         case 0X7B: return(15);break;
  202.                                         case 0X77: return(16);break;
  203.                                         default:  return(0);break;        */
  204.                                 }
  205.                         }
  206.                         
  207.                 }
  208.         }
  209.         return keyscan;                                //函数返回的参数
  210. }

  211. //修改密码函数
  212. /*
  213. 名称:修改密码函数
  214. 功能:如果需要进行密码的修改,可以调用此函数
  215. 注意:本函数可以采用中断,或者外部按键的方式,密码存储在ROM中
  216. */
  217. void external_mima() interrupt 2{
  218.         unsigned char k=0,p1_h=0,p1_l=0;                         //翻转法的定义k为选择分支作用,
  219.            unsigned char Mark = 0;                                                                                            //p1_h是选择分支的高四位,p1_l是选择分支的低四位
  220.            char keyscan = 0, i = 0, j = 0, h = 0;                //记录输入的数据是数值,然后将其送入到shuru所代表的数组当中去
  221.                                                                                                      //i的作用记录输入的数据是否是6位数据,防止超出所存储的数组的空间
  222.                                                                                                   //j的作用是用来加强功能键“确认”的作用
  223. nihao:        number = 0;                                                            //采用了goto语句,实现了错误输入密码后的重新输入
  224.         //清除“居民小区:”显示
  225.         Lcd_Character_16X16( 1, 0, 0,disappear_hanzi[0]);
  226.         Lcd_Character_16X16( 1, 0, 16,disappear_hanzi[0]);
  227.         Lcd_Character_16X16( 1, 0, 32,disappear_hanzi[0]);
  228.         Lcd_Character_16X16( 1, 0, 48,disappear_hanzi[0]);
  229.         Lcd_Character_16X16( 1, 0, 64,disappear_hanzi[0]);
  230.         //清除“请输入密码:”显示
  231.         Lcd_Character_16X16( 1, 4, 0,disappear_hanzi[0]);
  232.         Lcd_Character_16X16( 1, 4, 16,disappear_hanzi[0]);
  233.         Lcd_Character_16X16( 1, 4, 32,disappear_hanzi[0]);
  234.         Lcd_Character_16X16( 1, 4, 48,disappear_hanzi[0]);
  235.         Lcd_Character_16X16( 1, 4, 64,disappear_hanzi[0]);
  236.         Lcd_Character_16X16( 1, 4, 80,disappear_hanzi[0]);
  237.         //显示“请输入6位数密码”显示
  238.         Lcd_Character_16X16( 1, 4, 0,data_shuju[5]);
  239.         Lcd_Character_16X16( 1, 4, 16,data_shuju[6]);
  240.         Lcd_Character_16X16( 1, 4, 32,data_shuju[7]);
  241.         Lcd_Character_16X8( 1,  4, 48,shuzi[6]);
  242.         Lcd_Character_16X16( 1, 4, 56,data_shuju[11]);
  243.         Lcd_Character_16X16( 1, 4, 72,data_shuju[8]);
  244.         Lcd_Character_16X16( 1, 4, 88,data_shuju[9]);
  245.         Lcd_Character_16X16( 1, 4, 104,data_shuju[10]);
  246.                 while(1) {
  247.                 P1 = 0xf0;                                  //翻转法先给P1口送数据
  248.                 k = P1;                                          //然后赋值给k
  249.                 if(k != 0xf0)                                  //判断k是否是0xf0,如果不是,进入内部执行相应的程序
  250.                 {
  251.                         delayms(5);                          //延时,防抖动
  252.                         k = P1;                                  //重新赋值
  253.                         if(k != 0xf0)                          //确定是否k不等于0xf0
  254.                         {
  255.                                 number++;                  //number用于确定后面的在12864中的输出位置和密码存储的位置
  256.                                 p1_h = P1;                  //将P1的高四位赋值给p1_h
  257.                                 P1 = 0x0f;                  //然后将0x0f赋值给P1口,翻转,确定低四位,赋值给p1_l
  258.                                 p1_l = P1;                  //将P1口的值赋给p1_l(是小写的字母l,不是数字1)
  259.         
  260.                                 k = p1_h|p1_l;                  //将高四位和低四位相或,然后赋值给k
  261.                                 if (k == 0XE7) {          //此判断是为了确定是否是确认按键,如果是,直接进入确定程序
  262.                                         j = 1;        
  263.                                 }
  264.         
  265.                                 if(number == 7)                  //此判断是为了确定输入的是否是6个数字,防止多输入或者少输入
  266.                                 {
  267.                                         if (k != 0XB7) {  //这个是判断是否是清除按键,
  268.                                                 number = 0;
  269.                                         }
  270.                                 }
  271.         
  272.                                 while (p1_l == P1);          //这个是松手检测,防止长时间按在按键上,使输入的数据重复
  273.                                 if (number > 0||j == 1){  
  274.                                         switch(k)          //条件分支语句
  275.                                         {        
  276.                                                 case 0XD7: keyscan = 0;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[0]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  277.                                                 case 0XEE: keyscan = 1;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[1]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  278.                                                 case 0XDE: keyscan = 2; Lcd_Character_16X8( 1, 6, 8*number,shuzi[2]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  279.                                                 case 0XBE: keyscan = 3; Lcd_Character_16X8( 1, 6, 8*number,shuzi[3]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  280.                                                 case 0XED: keyscan = 4;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[4]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  281.                                                 case 0XDD: keyscan = 5;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[5]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  282.                                                 case 0XBD: keyscan = 6; Lcd_Character_16X8( 1, 6, 8*number,shuzi[6]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  283.                                                 case 0XEB: keyscan = 7;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[7]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  284.                                                 case 0XDB: keyscan = 8;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[8]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  285.                                                 case 0XBB: keyscan = 9; Lcd_Character_16X8( 1, 6, 8*number,shuzi[9]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);mima[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  286.                                                 case 0XE7: number = 0;break;
  287.                                                 case 0XB7: keyscan = 10;number--;Lcd_Character_16X8( 1, 6, 8*number,disappear_char[0]);number--;break;
  288.                                                 //这个是用来清除输错的密码,然后重新输入新的位数的密码
  289.                                         }
  290.                                 }
  291.                                 
  292.                         }
  293.                         }
  294.                         if (k == 0XE7) break;
  295.                 }
  296.                 //消除“请输入6位数密码”显示
  297.                 Lcd_Character_16X16( 1, 4, 0,disappear_hanzi[0]);
  298.                 Lcd_Character_16X16( 1, 4, 16,disappear_hanzi[0]);
  299.                 Lcd_Character_16X16( 1, 4, 32,disappear_hanzi[0]);
  300.                 Lcd_Character_16X8( 1,  4, 48,disappear_char[0]);
  301.                 Lcd_Character_16X16( 1, 4, 56,disappear_hanzi[0]);
  302.                 Lcd_Character_16X16( 1, 4, 72,disappear_hanzi[0]);
  303.                 Lcd_Character_16X16( 1, 4, 88,disappear_hanzi[0]);
  304.                 Lcd_Character_16X16( 1, 4, 104,disappear_hanzi[0]);
  305.                 Lcd_Character_16X16( 1, 4, 120,disappear_hanzi[0]);
  306.                 //消除密码显示
  307.                 Lcd_Character_16X8( 1, 6, 8*1,disappear_char[0]);
  308.                 Lcd_Character_16X8( 1, 6, 8*2,disappear_char[0]);
  309.                 Lcd_Character_16X8( 1, 6, 8*3,disappear_char[0]);
  310.                 Lcd_Character_16X8( 1, 6, 8*4,disappear_char[0]);
  311.                 Lcd_Character_16X8( 1, 6, 8*5,disappear_char[0]);
  312.                 Lcd_Character_16X8( 1, 6, 8*6,disappear_char[0]);
  313.                 //重新装初值
  314.                 number = 0;
  315.                    //显示“请重新输入密码:”
  316.                 Lcd_Character_16X16( 1, 4, 0,data_shuju[5]);
  317.                 Lcd_Character_16X16( 1, 4, 16,data_shuju[13]);
  318.                 Lcd_Character_16X16( 1, 4, 32,data_shuju[14]);
  319.                 Lcd_Character_16X16( 1, 4, 48,data_shuju[6]);
  320.                 Lcd_Character_16X16( 1, 4, 64,data_shuju[7]);
  321.                 Lcd_Character_16X16( 1, 4, 80,data_shuju[8]);
  322.                 Lcd_Character_16X16( 1, 4, 96,data_shuju[9]);
  323.                 Lcd_Character_16X16( 1, 4, 112,data_shuju[10]);
  324.                 while(1) {
  325.                 P1 = 0xf0;                                  //翻转法先给P1口送数据
  326.                 k = P1;                                          //然后赋值给k
  327.                 if(k != 0xf0)                                  //判断k是否是0xf0,如果不是,进入内部执行相应的程序
  328.                 {
  329.                         delayms(5);                          //延时,防抖动
  330.                         k = P1;                                  //重新赋值
  331.                         if(k != 0xf0)                          //确定是否k不等于0xf0
  332.                         {
  333.                                 number++;                  //number用于确定后面的在12864中的输出位置和密码存储的位置
  334.                                 p1_h = P1;                  //将P1的高四位赋值给p1_h
  335.                                 P1 = 0x0f;                  //然后将0x0f赋值给P1口,翻转,确定低四位,赋值给p1_l
  336.                                 p1_l = P1;                  //将P1口的值赋给p1_l(是小写的字母l,不是数字1)
  337.         
  338.                                 k = p1_h|p1_l;                  //将高四位和低四位相或,然后赋值给k
  339.                                 if (k == 0XE7) {          //此判断是为了确定是否是确认按键,如果是,直接进入确定程序
  340.                                         j = 1;        
  341.                                 }
  342.         
  343.                                 if(number == 7)                  //此判断是为了确定输入的是否是6个数字,防止多输入或者少输入
  344.                                 {
  345.                                         if (k != 0XB7) {  //这个是判断是否是清除按键,
  346.                                                 number = 0;
  347.                                         }
  348.                                 }
  349.         
  350.                                 while (p1_l == P1);          //这个是松手检测,防止长时间按在按键上,使输入的数据重复
  351.                                 if (number > 0||j == 1){  
  352.                                         switch(k)          //条件分支语句
  353.                                         {
  354.                                                 case 0XD7: keyscan = 0;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[0]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  355.                                                 case 0XEE: keyscan = 1;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[1]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  356.                                                 case 0XDE: keyscan = 2;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[2]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  357.                                                 case 0XBE: keyscan = 3; Lcd_Character_16X8( 1, 6, 8*number,shuzi[3]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  358.                                                 case 0XED: keyscan = 4;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[4]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  359.                                                 case 0XDD: keyscan = 5;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[5]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  360.                                                 case 0XBD: keyscan = 6; Lcd_Character_16X8( 1, 6, 8*number,shuzi[6]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  361.                                                 case 0XEB: keyscan = 7;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[7]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  362.                                                 case 0XDB: keyscan = 8;        Lcd_Character_16X8( 1, 6, 8*number,shuzi[8]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  363.                                                 case 0XBB: keyscan = 9; Lcd_Character_16X8( 1, 6, 8*number,shuzi[9]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break;                //keyscan是用来确定输入的数据,number是用来确定输入的位置,shuru【】是用来放置密码
  364.                                                 case 0XE7: number = 0;
  365.                                                                    for(i = 0; i < 6; i++)
  366.                                                                                 if (mima[i] != shuru[i])//对比原始密码和输入密码
  367.                                                                                 {
  368.                                                                                         //密码错误
  369.                                                                                         Lcd_Character_16X16( 1, 6, 64,mistake[0]);
  370.                                                                                         Lcd_Character_16X16( 1, 6, 80,mistake[1]);
  371.                                                                                         Lcd_Character_16X16( 1, 6, 96,mistake[2]);
  372.                                                                                         Lcd_Character_16X16( 1, 6, 112,mistake[3]);
  373.                                                                                         //消除密码显示位
  374.                                                                                         Lcd_Character_16X8( 1, 6, 8*1,disappear_char[0]);
  375.                                                                                         Lcd_Character_16X8( 1, 6, 8*2,disappear_char[0]);
  376.                                                                                         Lcd_Character_16X8( 1, 6, 8*3,disappear_char[0]);
  377.                                                                                         Lcd_Character_16X8( 1, 6, 8*4,disappear_char[0]);
  378.                                                                                         Lcd_Character_16X8( 1, 6, 8*5,disappear_char[0]);
  379.                                                                                         Lcd_Character_16X8( 1, 6, 8*6,disappear_char[0]);
  380.                                                                                         //消除密码错误显示位
  381.                                                                                         Lcd_Character_16X16( 1, 6, 64,disappear_hanzi[0]);
  382.                                                                                         Lcd_Character_16X16( 1, 6, 80,disappear_hanzi[0]);
  383.                                                                                         Lcd_Character_16X16( 1, 6, 96,disappear_hanzi[0]);
  384.                                                                                         Lcd_Character_16X16( 1, 6, 112,disappear_hanzi[0]);
  385. ……………………

  386. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
电子密码锁.rar (100.15 KB, 下载次数: 63)




评分

参与人数 2黑币 +55 收起 理由
569ipo + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:191910 发表于 2018-5-17 09:24 | 只看该作者
不错,收藏了,共享万岁
回复

使用道具 举报

板凳
ID:389243 发表于 2018-8-28 13:29 | 只看该作者
谢谢大佬,已收藏
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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