久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2619|回復: 0
打印 上一主題 下一主題
收起左側

液晶顯示密碼鎖仿真和單片機代碼

[復制鏈接]
跳轉到指定樓層
樓主
絕對原創,有仿真和代碼

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


單片機源程序如下:
  1. #include<reg51.h>
  2. #include<stdio.h>
  3. unsigned char password[6]={0,1,2,3,4,5,};//初始密碼
  4. sbit LED1=P1^3;
  5. sbit LED2=P1^4;
  6. sbit LED3=P1^5;
  7. sbit Beep=P0^5;
  8. sbit RS = P1^0;  
  9. sbit RW = P1^1;
  10. sbit EN = P1^2;
  11. #define CHECK_BUSY
  12. #define RS_CLR RS=0
  13. #define RS_SET RS=1
  14. #define RW_CLR RW=0
  15. #define RW_SET RW=1
  16. #define EN_CLR EN=0
  17. #define EN_SET EN=1
  18. #define DataPort P3
  19. void LCD_Write_Com(unsigned char com) ;
  20. void LCD_Write_Data(unsigned char Data) ;
  21. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ;
  22. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ;
  23. void LCD_Init(void) ;
  24. /*------------------------------------------------
  25. uS延時函數,含有輸入參數 unsigned char t,無返回值
  26. ------------------------------------------------*/
  27. void DelayUs2x(unsigned char t)
  28. {   
  29. while(--t);
  30. }
  31. void DelayMs(unsigned char t)
  32. {
  33.      
  34. while(t--)
  35. {
  36.      //大致延時1mS
  37.      DelayUs2x(245);
  38.          DelayUs2x(245);
  39. }
  40. }

  41. unsigned char KeyScan(void)  
  42. {
  43.   unsigned  n,key,key_r,key_c;
  44.                    n=0;
  45.               P2=0x70;
  46.            key_c=P2;
  47.            key_c=key_c & 0x70;
  48.            if(key_c!=0x70)
  49.                   {
  50.                       DelayMs(30);
  51.                           if(key_c!=0x70)
  52.                           {
  53.                                     key_c=key_c | 0x07;
  54.                                   P2=key_c;
  55.                                   key_r=P2;
  56.                                   key_r=key_r & 0x07;
  57.                                   key_c=key_c & 0x70;
  58.                                   key=key_c+key_r;
  59.                                   key=key & 0x77;
  60.                                   P2=0x70;                                 //等待本次按鍵結束
  61.                                   while(P2!=0x70);                                 
  62.                                   return key;
  63.                           }                          
  64.                   }
  65.    return 0x70;
  66. }
  67. /*------------------------------------------------
  68. 按鍵值處理函數,返回掃鍵值
  69. ------------------------------------------------*/
  70. unsigned char KeyPro(void)
  71. {
  72.   int n=9;
  73. switch(KeyScan())
  74. {
  75.                            {
  76.                                      case 0x66: n=0;break;
  77.                                   case 0X56: n=1;break;
  78.                                   case 0X36: n=2;break;
  79.                                   case 0X65: n=3;break;
  80.                                   case 0X55: n=4;break;
  81.                                   case 0X35: n=5;break;
  82.                                   case 0X63: n=6;break;
  83.                                   case 0X53: n=7;break;
  84.                                   case 0X33: n=8;break;
  85.                                   default :  break;
  86.                            }
  87.                               DelayMs(20);
  88. }
  89. return n;
  90. }
  91. /*------------------------------------------------
  92.               寫入命令函數
  93. ------------------------------------------------*/
  94. void LCD_Write_Com(unsigned char com)
  95. {  
  96.          DelayMs(5);
  97.          RS_CLR;
  98.          RW_CLR;
  99.          EN_SET;
  100.          DataPort= com;
  101.          ;
  102.          EN_CLR;
  103. }
  104. /*------------------------------------------------
  105.               寫入數據函數
  106. ------------------------------------------------*/
  107. void LCD_Write_Data(unsigned char Data)
  108. {
  109.          DelayMs(5);
  110.          RS_SET;
  111.          RW_CLR;
  112.          EN_SET;
  113.          DataPort= Data;
  114.          ;
  115.          EN_CLR;
  116. }
  117. /*------------------------------------------------
  118.               寫入字符串函數
  119. ------------------------------------------------*/
  120. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  121. {     
  122.          while (*s)
  123.          {     
  124.                  LCD_Write_Char(x,y,*s);     
  125.                  s ++;  x++;   
  126.          }
  127. }
  128. /*------------------------------------------------
  129.               寫入字符函數
  130. ------------------------------------------------*/
  131. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  132. {     
  133.          if (y == 0)
  134.          {     
  135.                  LCD_Write_Com(0x80 + x);     
  136.          }   
  137.          else
  138.          {     
  139.                  LCD_Write_Com(0xC0 + x);     
  140.          }        
  141.          LCD_Write_Data( Data);  
  142. }
  143. /*------------------------------------------------
  144.               初始化函數
  145. ------------------------------------------------*/
  146. void LCD_Init(void)
  147. {
  148.    LCD_Write_Com(0x38);  
  149.    LCD_Write_Com(0x08);    /*顯示關閉*/
  150.    LCD_Write_Com(0x01);    /*顯示清屏*/
  151.    LCD_Write_Com(0x06);    /*顯示光標移動設置*/
  152.    LCD_Write_Com(0x0C);    /*顯示開及光標設置*/
  153. }

  154. main()
  155. {
  156. unsigned char num,j;  
  157. int i=0,a=0,value=9;               
  158. unsigned char temp[6];
  159. bit Flag;

  160. LCD_Init();         //初始化液晶屏
  161. DelayMs(10);        //延時用于穩定,可以去掉
  162. LCD_Write_String(0,0,"   chose mode   ");    //寫入第一行信息,主循環中不再更改此信息,所以在while之前寫入
  163. LCD_Write_String(0,1," input 6or7or8  ");    //寫入第二行信息

  164. while (1)         //主循環
  165.   {

  166.   
  167. num=KeyPro();  //掃描鍵盤
  168. if(num!=9)  //如果掃描是按鍵有效值則進行處理
  169.    {
  170.     if(num==8)      
  171.         {
  172.            LCD_Write_String(0,0,"password:       ");
  173.            LCD_Write_String(0,1,"                ");
  174.            LED1=0;
  175.            LED2=1;
  176.            LED3=1;
  177.         }
  178.         if(num==7)
  179.         {
  180.           i--;
  181.           LCD_Write_Char(i,1,' ');           
  182.         }

  183.         if(num==6)
  184.         {
  185.             LCD_Write_String(0,0,"Set    password!");
  186.                 LCD_Write_String(0,1,"                ");
  187.                 LED1=1;
  188.                 LED2=0;
  189.                 LED3=1;
  190.                 for(j=0;j<6;j++)
  191.                 {
  192.                         while(value==9)
  193.                         {
  194.                            value        = KeyPro();
  195.                         }
  196.                         password[j]= value ;
  197.                         value=9;
  198.                         
  199.                         LCD_Write_Char(j,1,        password[j]+'0');        
  200.                 }

  201.             LCD_Write_String(0,0,"Set    sucessd!");
  202.                 LCD_Write_String(0,1,"               ");

  203.         }


  204.     if(num<6)     //密碼是6位,大于6位時不再輸入按鍵值
  205.          {
  206.      temp[i]=num;
  207.      LCD_Write_Char(i,1,num+'0');
  208.          i++;   //輸入數值累加
  209.          }

  210.         if(i==6)//6位后的按鍵不輸入數值,相當于確認按鍵(任意按鍵即可)
  211.           {
  212.           i=0;  //計數器復位
  213.           Flag=1;//先把比較位置1
  214.           for(j=0;j<6;j++)//循環比較6個數值,如果有一個不等 則最終Flag值為0
  215.              Flag=Flag&&(temp[j]==password[j]);//比較輸入值和已有密碼

  216.       if(Flag)//如果比較全部相同,標志位置1
  217.            {
  218.         LCD_Write_String(0,1,"Right Open!");//密碼正確顯示的信息
  219.                 }
  220.           else
  221.             {
  222.                 LCD_Write_String(0,1,"Wrong Retry!");//密碼錯誤,提示重新輸入
  223.                            DelayMs(255);
  224.                                DelayMs(255);
  225.                                    DelayMs(255);
  226.                                    DelayMs(255);
  227.                 LCD_Write_String(0,1,"            ");
  228.                 a++;
  229.                 if(a>=3)
  230.                 {
  231.                     LCD_Write_String(0,0,"not allow input");
  232.                          LCD_Write_String(0,1,"Wrong Waring!");
  233.                         LED1=1;LED2=1;LED3=0;
  234.                         Beep=0;
  235.                         while(1);
  236.                 }
  237.                 }

  238.           }
  239.     }        
  240.   }        
  241. }
復制代碼


所有資料51hei提供下載:
液晶顯示密碼鎖.rar (64.84 KB, 下載次數: 16)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品不卡视频 | 日本精品一区二区 | 国内在线视频 | 国产探花在线精品一区二区 | 国产精品不卡 | 欧美视频精品 | 精品免费国产一区二区三区四区 | 91av在线视频观看 | 高清视频一区二区三区 | 黄色大片在线播放 | 久久爆操 | 曰批视频在线观看 | 欧美视频在线看 | 日韩精品中文字幕一区二区三区 | 91视在线国内在线播放酒店 | 亚洲欧美日韩久久久 | 我爱操| 日本手机在线 | 一区二区三区在线观看视频 | 欧美不卡一区二区三区 | 久久久久综合 | 日韩av高清| 国产成人在线免费 | 国产三区视频在线观看 | 欧美精品在线一区二区三区 | 男人电影天堂 | 国产精品永久在线观看 | 99re视频这里只有精品 | 国产一区二区三区精品久久久 | 久久精品国产99国产精品 | 国外成人免费视频 | 精品免费国产一区二区三区四区介绍 | 99久久国产综合精品麻豆 | 老牛影视av一区二区在线观看 | 亚洲成人一区二区在线 | 中文字幕 国产 | 成人在线中文字幕 | 免费激情 | 国产成人精品久久二区二区 | 成人午夜网站 | 久久99深爱久久99精品 |