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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于c51單片機的LCD1602電子鎖仿真

[復制鏈接]
跳轉到指定樓層
樓主
基于c51的led電子鎖仿真原理圖如下(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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
led電子鎖.rar (19.42 KB, 下載次數: 114)





評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:387102 發表于 2018-8-17 08:11 | 只看該作者
不需要24C02嗎
回復

使用道具 舉報

板凳
ID:407120 發表于 2018-10-9 17:08 | 只看該作者
感覺好高大上
回復

使用道具 舉報

地板
ID:646452 發表于 2019-11-21 12:52 | 只看該作者
謝謝分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美综合一区 | 久草网在线视频 | 国产精品日韩欧美一区二区三区 | 成人h视频 | 一区二区中文字幕 | 欧美日韩不卡在线 | 国产免国产免费 | 亚洲国产第一页 | 久久国产亚洲 | 国产日韩欧美精品一区二区三区 | 久久亚洲国产精品 | 精品一二区 | 国产综合视频 | 久久伊人精品一区二区三区 | 国产精品自拍视频 | 国产美女在线播放 | 在线免费观看视频黄 | 欧美一区二区在线播放 | 久久精品一区二区 | 亚洲91视频 | 四虎影音 | 欧美中文字幕在线 | 亚洲一二三区不卡 | 欧美一区精品 | 欧美午夜精品久久久久免费视 | 日韩精品中文字幕一区二区三区 | 日韩欧美国产一区二区三区 | 青青久久 | 国产精品国产馆在线真实露脸 | 在线免费观看成人 | 成人国产在线视频 | 巨大黑人极品videos精品 | 日韩精品在线免费观看 | 91成人在线视频 | 欧美日韩中文国产一区发布 | 羞羞视频在线网站观看 | 国产特级毛片aaaaaa喷潮 | 国产aⅴ精品 | 五月天婷婷综合 | 亚洲午夜精品视频 | 99精品久久久久久久 |