絕對原創,有仿真和代碼
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (13.86 KB, 下載次數: 48)
下載附件
2019-4-17 00:42 上傳
單片機源程序如下:
- #include<reg51.h>
- #include<stdio.h>
- unsigned char password[6]={0,1,2,3,4,5,};//初始密碼
- sbit LED1=P1^3;
- sbit LED2=P1^4;
- sbit LED3=P1^5;
- sbit Beep=P0^5;
- sbit RS = P1^0;
- sbit RW = P1^1;
- sbit EN = P1^2;
- #define CHECK_BUSY
- #define RS_CLR RS=0
- #define RS_SET RS=1
- #define RW_CLR RW=0
- #define RW_SET RW=1
- #define EN_CLR EN=0
- #define EN_SET EN=1
- #define DataPort P3
- void LCD_Write_Com(unsigned char com) ;
- void LCD_Write_Data(unsigned char Data) ;
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ;
- void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ;
- void LCD_Init(void) ;
- /*------------------------------------------------
- uS延時函數,含有輸入參數 unsigned char t,無返回值
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- void DelayMs(unsigned char t)
- {
-
- while(t--)
- {
- //大致延時1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- unsigned char KeyScan(void)
- {
- unsigned n,key,key_r,key_c;
- n=0;
- P2=0x70;
- key_c=P2;
- key_c=key_c & 0x70;
- if(key_c!=0x70)
- {
- DelayMs(30);
- if(key_c!=0x70)
- {
- key_c=key_c | 0x07;
- P2=key_c;
- key_r=P2;
- key_r=key_r & 0x07;
- key_c=key_c & 0x70;
- key=key_c+key_r;
- key=key & 0x77;
- P2=0x70; //等待本次按鍵結束
- while(P2!=0x70);
- return key;
- }
- }
- return 0x70;
- }
- /*------------------------------------------------
- 按鍵值處理函數,返回掃鍵值
- ------------------------------------------------*/
- unsigned char KeyPro(void)
- {
- int n=9;
- switch(KeyScan())
- {
- {
- case 0x66: n=0;break;
- case 0X56: n=1;break;
- case 0X36: n=2;break;
- case 0X65: n=3;break;
- case 0X55: n=4;break;
- case 0X35: n=5;break;
- case 0X63: n=6;break;
- case 0X53: n=7;break;
- case 0X33: n=8;break;
- default : break;
- }
- DelayMs(20);
- }
- return n;
- }
- /*------------------------------------------------
- 寫入命令函數
- ------------------------------------------------*/
- void LCD_Write_Com(unsigned char com)
- {
- DelayMs(5);
- RS_CLR;
- RW_CLR;
- EN_SET;
- DataPort= com;
- ;
- EN_CLR;
- }
- /*------------------------------------------------
- 寫入數據函數
- ------------------------------------------------*/
- void LCD_Write_Data(unsigned char Data)
- {
- DelayMs(5);
- RS_SET;
- RW_CLR;
- EN_SET;
- DataPort= Data;
- ;
- EN_CLR;
- }
- /*------------------------------------------------
- 寫入字符串函數
- ------------------------------------------------*/
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
- {
- while (*s)
- {
- LCD_Write_Char(x,y,*s);
- s ++; x++;
- }
- }
- /*------------------------------------------------
- 寫入字符函數
- ------------------------------------------------*/
- void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
- {
- if (y == 0)
- {
- LCD_Write_Com(0x80 + x);
- }
- else
- {
- LCD_Write_Com(0xC0 + x);
- }
- LCD_Write_Data( Data);
- }
- /*------------------------------------------------
- 初始化函數
- ------------------------------------------------*/
- void LCD_Init(void)
- {
- LCD_Write_Com(0x38);
- LCD_Write_Com(0x08); /*顯示關閉*/
- LCD_Write_Com(0x01); /*顯示清屏*/
- LCD_Write_Com(0x06); /*顯示光標移動設置*/
- LCD_Write_Com(0x0C); /*顯示開及光標設置*/
- }
- main()
- {
- unsigned char num,j;
- int i=0,a=0,value=9;
- unsigned char temp[6];
- bit Flag;
- LCD_Init(); //初始化液晶屏
- DelayMs(10); //延時用于穩定,可以去掉
- LCD_Write_String(0,0," chose mode "); //寫入第一行信息,主循環中不再更改此信息,所以在while之前寫入
- LCD_Write_String(0,1," input 6or7or8 "); //寫入第二行信息
- while (1) //主循環
- {
-
- num=KeyPro(); //掃描鍵盤
- if(num!=9) //如果掃描是按鍵有效值則進行處理
- {
- if(num==8)
- {
- LCD_Write_String(0,0,"password: ");
- LCD_Write_String(0,1," ");
- LED1=0;
- LED2=1;
- LED3=1;
- }
- if(num==7)
- {
- i--;
- LCD_Write_Char(i,1,' ');
- }
- if(num==6)
- {
- LCD_Write_String(0,0,"Set password!");
- LCD_Write_String(0,1," ");
- LED1=1;
- LED2=0;
- LED3=1;
- for(j=0;j<6;j++)
- {
- while(value==9)
- {
- value = KeyPro();
- }
- password[j]= value ;
- value=9;
-
- LCD_Write_Char(j,1, password[j]+'0');
- }
- LCD_Write_String(0,0,"Set sucessd!");
- LCD_Write_String(0,1," ");
- }
- if(num<6) //密碼是6位,大于6位時不再輸入按鍵值
- {
- temp[i]=num;
- LCD_Write_Char(i,1,num+'0');
- i++; //輸入數值累加
- }
- if(i==6)//6位后的按鍵不輸入數值,相當于確認按鍵(任意按鍵即可)
- {
- i=0; //計數器復位
- Flag=1;//先把比較位置1
- for(j=0;j<6;j++)//循環比較6個數值,如果有一個不等 則最終Flag值為0
- Flag=Flag&&(temp[j]==password[j]);//比較輸入值和已有密碼
- if(Flag)//如果比較全部相同,標志位置1
- {
- LCD_Write_String(0,1,"Right Open!");//密碼正確顯示的信息
- }
- else
- {
- LCD_Write_String(0,1,"Wrong Retry!");//密碼錯誤,提示重新輸入
- DelayMs(255);
- DelayMs(255);
- DelayMs(255);
- DelayMs(255);
- LCD_Write_String(0,1," ");
- a++;
- if(a>=3)
- {
- LCD_Write_String(0,0,"not allow input");
- LCD_Write_String(0,1,"Wrong Waring!");
- LED1=1;LED2=1;LED3=0;
- Beep=0;
- while(1);
- }
- }
- }
- }
- }
- }
復制代碼
0.png (7.23 KB, 下載次數: 45)
下載附件
2019-4-17 00:43 上傳
所有資料51hei提供下載:
液晶顯示密碼鎖.rar
(64.84 KB, 下載次數: 16)
2019-4-16 22:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|