基于51单片机
单片机源程序如下:
- #include <intrins.h>
- #include <reg52.h>
- #define ulong unsigned long
- #define uint unsigned int
- #define uchar unsigned char
- uchar temp,num,flag,r;
- /******************************/
- //显示字符串定义
- uchar code table1[]="You are welcome";
- uchar code table3[]="******";
- uchar code table4[]="code is wrong!";
- uchar code table5[]="you are right!";
- uchar code table6[]="the second time!";
- uchar code table7[]="the last time!";
- uchar code table8[]="Input new password:";
- uchar code table9[]="Modify right!!!";
- uchar code table10[]="password:";
- uchar code table12[]=" calling....";
- uchar code table13[]=" ";
- uchar code table14[]="Input again:";
- uchar code table15[]="Modify error!!!";
- /******************************/
- uchar init_password[6]={1,2,3,4,5,6};//定义原始密码存放的数组
- uchar password[6]={0};//定义输入密码存放的数组
- /******************************/
- //1602位定义
- sbit lcdrs=P2^0;// 数据/指令
- sbit lcdrw=P2^1;// 读/写
- sbit lcden=P2^2;// 使能端
- /******************************/
- sbit beep=P3^7;
- /******************************/
- void delay(uint z);
- void init();
- void write_com(uchar com);
- void write_data(uchar dat1);
- void keyscan();
- void mima();
- void mima1();
- void delete();
- /******************************/
- //1602初始化设置
- void init()
- {
- lcden=0;//使能
- write_com(0x38);//显示模式设置
- write_com(0x0e);//显示开关设置(显示有效、光标显示有效、光标闪烁无效)?
- write_com(0x06);//光标移动设置(读或写一个字符后地址指针加一,光标加一,写一个字符串后,整屏显示不移动)
- write_com(0x01);//显示清屏
- write_com(0x80);//读忙
- }
- /******************************/
- //向1602写指令
- void write_com(uchar com)
- {
- lcdrs=0;//指令
- lcdrw=0;//写
- P0=com;//将指令代码送到P0口,通过数据线给1602
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;//下降沿使能
- }
- /******************************/
- //向1602写数据
- void write_data(uchar dat1)
- {
- lcdrs=1;//数据
- lcdrw=0;//写
- P0=dat1;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;//下降沿使能
- }
- /******************************/
- //延时子程序
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /******************************/
- //按键扫描子程序
- void keyscan()
- {
- P1=0x7f;
- temp=P1;
- temp=temp&0x0f;
- while(temp!=0x0f)
- {
- delay(5);
- temp=P1;
- temp=temp&0x0f;
- while(temp!=0x0f)
- {
- temp=P1;//按键消抖
- switch(temp)
- {
- case 0x7e:num=0;flag=1;//按键0被按下,且0为有效的按键
- break;
- case 0x7d:num=1;flag=1;//按键1被按下,且1为有效的按键
- break;
- case 0x7b:num=2;flag=1;//按键2被按下,且2为有效的按键
- break;
- case 0x77:num=3;flag=1;//按键3被按下,且3为有效的按键
- break;
- }
- while(temp!=0x0f)
- {
- temp=P1;
- temp=temp&0x0f;
- }
- }
- }
- P1=0xbf;
- temp=P1;
- temp=temp&0x0f;
- while(temp!=0x0f)
- {
- delay(5);
- temp=P1;
- temp=temp&0x0f;
- while(temp!=0x0f)
- {
- temp=P1;//消抖
- switch(temp)
- {
- case 0xbe:num=4;flag=1;//按键4被按下,且4为有效的按键
- break;
- case 0xbd:num=5;flag=1;//按键5被按下,且5为有效的按键
- break;
- case 0xbb:num=6;flag=1;//按键6被按下,且6为有效的按键
- break;
- case 0xb7:num=7;flag=1;//按键7被按下,且7为有效的按键
- break;
- }
- while(temp!=0x0f)
- {
- temp=P1;
- temp=temp&0x0f;
- }
- }
- }
- P1=0xdf;
- temp=P1;
- temp=temp&0x0f;
- while(temp!=0x0f)
- {
- delay(5);
- temp=P1;
- temp=temp&0x0f;
- while(temp!=0x0f)
- {
- temp=P1;
- switch(temp)
- {
- case 0xde:num=8;flag=1;//按键8被按下,且8为有效的按键
- break;
- case 0xdd:num=9;flag=1;//按键9被按下,且9为有效的按键
- break;
- case 0xdb:num=10;//按键10被按下,且该键无效
- break;
- case 0xd7:num=11;//按键11被按下,且该键无效
- break;
- }
- while(temp!=0x0f)
- {
- temp=P1;
- temp=temp&0x0f;
- }
- }
- }
- P1=0xef;
- temp=P1;
- temp=temp&0x0f;
- while(temp!=0x0f)
- {
- delay(5);
- temp=P1;
- temp=temp&0x0f;
- while(temp!=0x0f)
- {
- temp=P1;
- switch(temp)
- {
- case 0xee:num=12;//按键12被按下,且该键无效
- break;
- case 0xed:num=13;flag=1;//按键13,即修改密码键被按下,且13为有效的按键
- break;
- case 0xeb:num=14;flag=1;//按键14,即退格键被按下,且14为有效的按键
- break;
- case 0xe7:num=15;flag=1;//按键15,即输入密码键被按下,且15为有效的按键
- break;
- }
- while(temp!=0x0f)
- {
- temp=P1;
- temp=temp&0x0f;
- }
- }
- }
- }
- /******************************/
- void main()
- {
- uchar m=0,w=0;
- init();//1602初始化
- for(r=0;r<15;r++)
- {
- delay(5);
- write_data(table1[r]);
- }//显示欢迎界面
- write_com(0x0c);//显示,关光标
- do
- {
- keyscan();
- }
- while(num!=15);//在输入密码键按下之前一直进行键盘扫描
- mima();//子程序调用
- while((password[m]==init_password[m])&m<6)
- {
- m++;
- }
- if(m>=6)
- {
-
- mima1();//子程序调用
- }
- else
- {
- m=0;
- write_com(0x80+0x40);//显示从第二行开始
- for(r=0;r<14;r++)
- {
- delay(20);
- write_data(table4[r]);
- }//显示密码错误
- delay(2000);//延时
- init();//1602初始化
- for(r=0;r<16;r++)
- {
- delay(20);
- write_data(table6[r]);
- }//显示第二次输入
- delay(2000);
- mima();
- while((password[m]==init_password[m])&m<6 )
- {
- m++;
- }
- if(m>=6)
- {
- mima1();
- }
- else
-
- {
- m=0;
- write_com(0x80+0x40);
- for(r=0;r<14;r++)
- {
- delay(20);
- write_data(table4[r]);
- }//显示密码错误
- delay(2000);
- init();//1602初始化
- for(r=0;r<14;r++)
- {
- delay(20);
- write_data(table7[r]);
- }//最后一次机会
- delay(2000);
- mima();
-
- while((password[m]==init_password[m])&m<6)
- {
- m++;
- }
- if(m>=6)
- {
-
- mima1();
- }
- else
- {
- init();
- write_com(0x80+0x40);
- for(r=0;r<14;r++)
- {
- delay(20);
- write_data(table12[r]);
- }//显示报警
- write_com(0x0c);
- while(1)
- {
- delay(1);
- beep=~beep;
- }//喇叭发出警报音
- }
-
-
- }
-
- }
-
- }
- void mima()
- {
- uchar w=0;
- init();
- for(r=0;r<9;r++)
- {
- delay(20);
- write_data(table10[r]);
- }//显示请输入密码
- do
- {
- flag=0;
- keyscan();
- write_com(0x80+9+w);//接着password:后第w位处显示
- if(flag==1&&num<=9)//输入的是0—9的情况下
- {
- password[w]=num;//将输入的数存入数组的相应位
- write_data(table3[w]);//1602显示*
- w++;//位数加一
- if(w==6)
- write_com(0x0c);//六位都输入后,显示从屏幕左方开始
- }
- if(flag==1&&num==14)//如果退格键被按下
- {
- w--;//位数减一
- if(w==255)
- w=w+1;//如果位数变成-1,即255,则加一,变成0
- write_com(0x80+9+w);//从字符串后第w位处开始显示
- write_data(table13[w+1]);//显示*
- if(flag==1&&num<=9)
- {
- password[w]=num;
- write_data(table3[w]);
- }
- }
- } while(w<=5);
- }
- void mima1()
- {
- uchar f=0,n=0,d=0;
- write_com(0x80+0x40); //从第二行开始显示
- for(r=0;r<14;r++)
- {
- delay(20);
- write_data(table5[r]);//显示密码正确
- }
- delay(2000);
- do
- {
- num=16;
- keyscan();
- }while(num!=13);//在改密码键按下前一直扫描键盘
- if(flag==1&&num==13)
- {
- init();//显示初始化
- for(r=0;r<15;r++)
- {
- delay(20);
- write_data(table8[r]);//显示输入新密码
- }
- write_com(0x0c);//显示,关光标
- write_com(0x80+0x40+n);//从第二行开始显示
- write_com(0x0e);//显示开关初始化
- }
- do{
- num=16;
- keyscan();
- write_com(0x80+0x40+n);
- if(flag==1&&num<=9)
- {
- init_password[n]=num;//将输入值存入新的密码数组的相应位
- write_data(table3[n]);//显示*
- n++;
- if(n==6)
- write_com(0x0c);
- }
- if(flag==1&&num==14)
- {
- n--;//如果退格键按下,左移一位
- if(n==255)
- n=n+1;//如果n减为负值则从0开始
- write_com(0x80+0x40+n);//从相应位置开始显示
- write_data(table13[n]);//显示空字符
- if(flag==1&&num<=9)
- {
- password[n]=num;
- write_data(table3[n]);
- }
- }
- }
- while(n<=5);
- init();
- for(r=0;r<12;r++)
- {
- delay(20);
- write_data(table14[r]);
- }//显示重新输入
- do
- {
- flag=0;
- keyscan();
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
LCD1602 16点键盘.zip
(44.44 KB, 下载次数: 31)
|