- #include <reg52.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- sbit RS = P1^0;
- sbit RW = P1^1;
- sbit EN = P2^5;
- sbit key=P3^4;
- unsigned char KeyPro();
- unsigned char num1;
- unsigned char code mi[]={1,2,3,4};
- bit Flag;
- //?????,??????
- void delayms(unsigned int xms)
- {
- unsigned i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- void Read_Busy()
- {
- uchar busy;
- P0 = 0xff;
- RS = 0;
- RW = 1;
- do
- {
- EN = 1;
- busy = P0;
- EN = 0;
- }while(busy & 0x80);
- }
- //?LCD1602??????
- void Write_Cmd(uchar cmd)
- {
- Read_Busy();//???
- RS = 0;
- RW = 0;
- P0 = cmd;
- EN = 1;
- EN = 0;
- }
- //???????
- void Write_Dat(uchar dat)
- {
- Read_Busy();
- RS = 1;
- RW = 0;
- P0 = dat;
- EN = 1;
- EN = 0;
- }
- void charter(unsigned char x,unsigned char y,unsigned char dat)
- {
- if(y==0)
- {
- Write_Cmd(0x80+x);
- }
- else
- {
- Write_Cmd(0xc0+x);
- }
- Write_Dat( dat);
- }
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
- {
- if (y == 0)
- {
- Write_Cmd(0x80 + x);
- }
- else
- {
- Write_Cmd(0xC0 + x);
- }
- while (*s)
- {
- Write_Dat( *s);
- s ++;
- }
- }
- void lcdinit()
- {
- Write_Cmd(0x38);
- Write_Cmd(0x08); /*????*/
- Write_Cmd(0x01); /*????*/
- Write_Cmd(0x06); /*????????*/
- Write_Cmd(0x0C); /*????????*/
- }
- void main()
- {
- unsigned char a[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
- unsigned char i,num,j,b;
- unsigned char temp[4];
- lcdinit();
- LCD_Write_String(0,0,"secret code:1234");
- LCD_Write_String(0,1,"input password");
- while(1)
- {
- num=KeyPro();
- if(num!=0xff)
- {
- if(i==0)
- {
- LCD_Write_String(0,1," ");
- }
- if(i<4)
- {
-
- temp[i]=num;
- charter(0+i,1,'0'+num); [/i][i] //charter(0+i,1,'0'+num); 这里可用‘*’ 代替[/i][i]
- }
- i++;
- if(i==5)
- {
- i=0;
- Flag=1;
- for(j=0;j<4;j++)
- {
- Flag=Flag&&(temp[j]==mi[j]);
- if(Flag)
- {
- LCD_Write_String(0,1,"right open");
- }
- else
- {
- LCD_Write_String(0 ,0,"wrong retry ");
- LCD_Write_String(0,1," ");
-
- if(b<4)
- {
-
- temp[b]=num;
- if(b==0)
- {
- LCD_Write_String(0,1," ");
-
- charter(0+b,1,'0'+num); [/b][/i]
- [i] //charter(0+i,1,'0'+num); 这里可用‘*’ 代替[/i][i][b]
- }
- }
- b++;
- if(b==5)
- {
- b=0;
- Flag=1;
- for(j=0;j<4;j++)
- {
- Flag=Flag&&(temp[j]==mi[j]);
- if(Flag)
- {
- LCD_Write_String(0,1,"right open");
- }
- else
- {
- LCD_Write_String(0 ,0,"no chance");
- LCD_Write_String(0 ,1,"wait police");
- while(1)
- {
- P1=0x0f;
- }
-
- }
- }
- }
- }
- }
- }
- }
- }
- }
- unsigned char KeyScan(void) //??????,?????????
- {
- unsigned char temp,num;//???????
- P3=0x0f; //??????0
- temp=P3&0x0f; //?????
- if(temp!=0x0f) //?????????
- {
- delayms(10); //??
- if((P3&0x0f)!=0x0f)
- {
- temp=P3&0x0f; //?????
- P3=temp|0xf0; //???????
- num=P3&0xf0; //?????
- while((P3&0xf0)!=0xf0);//???????
- return(temp+num);//????????
- }
- } //????
- }
- /*
- unsigned char KeyPro(void)
- {
- switch(KeyScan())
- {
- case 0x7e:num1=0;break;//0 ??????????????
- case 0x7d:num1=1;break;//1
- case 0x7b:num1=2;break;//2
- case 0x77:num1=3;break;//3
- case 0xbe:num1=4;break;//4
- case 0xbd:num1=5;break;//5
- case 0xbb:num1=6;break;//6
- case 0xb7:num1=7;break;//7
- case 0xde:num1=8;break;//8
- case 0xdd:num1=9;break;//9
- case 0xdb:num1=10;break;//a
- case 0xd7:num1=11;break;//b
- case 0xee:num1=12;break;//c
- case 0xed:num1=13;break;//d
- case 0xeb:num1=14;break;//e
- case 0xe7:num1=15;break;//f
- default:return 0xff;break;
- }
- }
- */
- unsigned char KeyPro(void)
- {
- switch(KeyScan())
- {
- case 0x7e:return 0;break;//0 ??????????????
- case 0x7d:return 1;break;//1
- case 0x7b:return 2;break;//2
- case 0x77:return 3;break;//3
- case 0xbe:return 4;break;//4
- case 0xbd:return 5;break;//5
- case 0xbb:return 6;break;//6
- case 0xb7:return 7;break;//7
- case 0xde:return 8;break;//8
- case 0xdd:return 9;break;//9
- case 0xdb:return 10;break;//a
- case 0xd7:return 11;break;//b
- case 0xee:return 12;break;//c
- case 0xed:return 13;break;//d
- case 0xeb:return 14;break;//e
- case 0xe7:return 15;break;//f
- default:return 0xff;break;
- }
- }
复制代码 |