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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4450|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

基于c51單片機(jī)的LCD1602電子鎖仿真

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
基于c51的led電子鎖仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  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延時(shí)函數(shù),含有輸入?yún)?shù) 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.      //大致延時(shí)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;                                 //等待本次按鍵結(jié)束
  61.                                   while(P2!=0x70);                                 
  62.                                   return key;
  63.                           }                          
  64.                   }
  65.    return 0x70;
  66. }
  67. /*------------------------------------------------
  68. 按鍵值處理函數(shù),返回掃鍵值
  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.               寫入命令函數(shù)
  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.               寫入數(shù)據(jù)函數(shù)
  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.               寫入字符串函數(shù)
  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.               寫入字符函數(shù)
  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.               初始化函數(shù)
  145. ------------------------------------------------*/
  146. void LCD_Init(void)
  147. {
  148.    LCD_Write_Com(0x38);  
  149.    LCD_Write_Com(0x08);    /*顯示關(guān)閉*/
  150.    LCD_Write_Com(0x01);    /*顯示清屏*/
  151.    LCD_Write_Com(0x06);    /*顯示光標(biāo)移動(dòng)設(shè)置*/
  152.    LCD_Write_Com(0x0C);    /*顯示開及光標(biāo)設(shè)置*/
  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);        //延時(shí)用于穩(wěn)定,可以去掉
  162. LCD_Write_String(0,0,"   chose mode   ");    //寫入第一行信息,主循環(huán)中不再更改此信息,所以在while之前寫入
  163. LCD_Write_String(0,1," input 6or7or8  ");    //寫入第二行信息

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

  166.   
  167. num=KeyPro();  //掃描鍵盤
  168. if(num!=9)  //如果掃描是按鍵有效值則進(jìn)行處理
  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位時(shí)不再輸入按鍵值
  205.          {
  206.      temp[i]=num;
  207.      LCD_Write_Char(i,1,num+'0');
  208.          i++;   //輸入數(shù)值累加
  209.          }

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

  216.       if(Flag)//如果比較全部相同,標(biāo)志位置1
  217.            {
  218.         LCD_Write_String(0,1,"Right Open!");//密碼正確顯示的信息
  219.                 }
  220.           else
  221.             {
  222.                 LCD_Write_String(0,1,"Wrong Retry!");//密碼錯(cuò)誤,提示重新輸入
  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. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

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





評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 天天天操操操 | 欧美视频第三页 | 91精品久久 | 999久久久久久久久6666 | 国产一区二区三区免费视频 | 国内精品视频在线观看 | 中文字幕在线免费观看 | 国产天堂| 黑人巨大精品欧美一区二区免费 | 最新中文字幕在线播放 | 999精品在线观看 | 午夜在线 | 国产精品999| 亚洲一区二区视频在线观看 | 亚洲成人国产精品 | av福利网 | 国产视频一区在线 | 色综合久久久 | 亚洲一区二区视频在线播放 | 精品欧美一区免费观看α√ | 欧美精品在线免费 | 亚洲国产精品一区二区久久 | 国产精品18毛片一区二区 | 欧美精产国品一二三区 | 欧美国产精品久久久 | 先锋资源亚洲 | 一区二区免费在线视频 | 国产视频精品在线观看 | 国产欧美一区二区三区在线看 | 99在线资源 | 亚洲精品乱码久久久久久9色 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 成人国产一区二区三区精品麻豆 | 久草成人| 亚洲成a人片 | 午夜视频在线播放 | 黄色一级毛片 | 国产乱码精品一品二品 | 欧美成人猛片aaaaaaa | 天堂色| 美女国产精品 |