#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//sbit 特殊功能位声明:声明某特殊功能寄存器中的一位
#define key P1 //按键io口
sbit fen=P3^0; //蜂鸣器io口
sbit rs=P3^1; //LCD控制口
sbit rw=P3^2;
sbit e=P3^3;
sbit led=P3^4; //LED灯io口
sbit LED=P2^0;
//bit 位变量声明:定义一个位变量的值
uchar count=0;
uchar flag=0;
uchar errnum=0;
uchar keyz;
uchar j=0;
uchar in_pw[]={"input password:"};
uchar set_pw[]={"set password:"};
uchar err[]={"error"};
uchar lock[]={"warning!"};
uchar OPEN[]={"Open"};
uchar pw[6]={0,0,0,0,0,0};
uchar temp_pw[6]={0,0,0,0,0,0};
uchar shu[]={0,1,2,3,4,5,6,7,8,9};
unsigned char lcd_r_start();
void delay(uchar i){
while(i--);
}
/蜂鸣器/
void Fen(uchar a,b) //蜂鸣器发声函数
{
uchar i,j;
for(i=0;i<a;i++)
{
for(j=0;j<100;j++)
{fen=~fen;delay(b);}
}
}
void lock_c()
{
while(1)
{
Fen(3,300);
LED=0;
}
}
/LCD/
void writecom(uchar com){ //LCD写指令
unsigned char i;
do
{ //查lcd忙状态
i=lcd_r_start(); //调用读状态字函数
i&=0x80; //“与”操作屏蔽掉低7位
delay(2);
}while(i!=0); //lcd忙,继续查询,否则退出循环
rw=0;
delay(1);
rs=0; //RW=0,RS=0,写lcd命令字
delay(1);
e=1; //E端时序以0或1高低波动
delay(1);
P0=com; //将com中的命令字写入lcd数据口
delay(1);
e=0;
delay(1);
rw=1;
delay(2);
}
void writedat(uchar dat){ //LCD写数据
unsigned char i;
do
{ //查忙操作
i=lcd_r_start(); //调用读状态字函数
i&=0x80; //“与”操作屏蔽掉低7位
delay(2);
}while(i!=0); //lcd忙,继续查询,否则退出循环
rw=0;
delay(1);
rs=1; //RW=0,RS=1,写lcd命令字
delay(1);
e=1; //E端时序以0或1高低波动
delay(1);
P0=dat; //将dat中的显示数据写入lcd数据口
delay(1);
e=0;
delay(1);
rw=1;
delay(2);
}
unsigned char lcd_r_start()
{
unsigned char s;
rw=1; //RW=1,RS=0,读lcd状态
delay(1);
rs=0;
delay(1);
e=1; //E端时序以0或1高低波动
delay(1);
s=P0; //从lcd的数据口读状态
delay(1);
e=0;
delay(1);
rw=0;
delay(1);
return(s); //返回值s读取状态忙或空闲
}
void initlcd(){ //LCD初始化函数
writecom(0x3c); //显示模式设置
writecom(0x0c);
writecom(0x01);
writecom(0x06);
writecom(0x80); }
void show_pw(uchar num){
uchar i;
writecom(0xC0); //更改显示位置用
for(i=0;i<6;i++) //此处显示SpeedChar[]字符串,字符串结束符为‘0’
{
writedat(' ');
}
writecom(0xC0); //更改显示位置用
for(i=0;i<num;i++) //此处显示SpeedChar[]字符串,字符串结束符为‘0’
{
if(keyz==0)
writedat('1');
else if(keyz==1)
writedat('2');
else if(keyz==2)
writedat('3');
else if(keyz==4)
writedat('4');
else if(keyz==5)
writedat('5');
else if(keyz==6)
writedat('6');
else if(keyz==8)
writedat('7');
else if(keyz==9)
writedat('8');
else if(keyz==10)
writedat('9');
else if(keyz==13)
writedat('0');
}
}
void show_status(uchar*str){
uchar i=0;
writecom(0x80);
for(i=0;str[i]!='\0';i++)
{
writedat(str[i]);
}}
void Key(){uchar a; //矩形式键盘函数
key=0x0f;
if(key!=0x0f){
delay(1000);
if(key!=0x0f){
key=0x0f;
switch(key){
case 0x07: keyz=0;break;
case 0x0b: keyz=1;break;
case 0x0d: keyz=2;break;
case 0x0e: keyz=3;break;
}
key=0xf0;
switch(key){
case 0x70: keyz=keyz;break;
case 0xb0: keyz=keyz+4;break;
case 0xd0: keyz=keyz+8;break;
case 0xe0: keyz=keyz+12;break;
}
while(a=50&&key!=0xf0);
{
delay(1000);
a++;}
return;
}
}
keyz=0xff;
}
void in_key(){//uchar i;
Key();
if(keyz==0xff||errnum>=3)return;
if(keyz>=0&&keyz<=2){
Fen(1,30);
if((flag==0||flag==2)&&count<6){
count++;
temp_pw[count]=keyz+1;
show_pw(count);}}
else if(keyz>=4&&keyz<=5){
Fen(1,30);
if((flag==0||flag==2)&&count<6){
count++;
temp_pw[count]=keyz;
show_pw(count);}}
else if(keyz>=8&&keyz<=10){
Fen(1,30);
if((flag==0||flag==2)&&count<6){
count++;
temp_pw[count]=keyz-1;
show_pw(count);}}
if(keyz==13){
Fen(1,30);
if((flag==0||flag==2)&&count<6){
count++;
temp_pw[count]=keyz-13;
show_pw(count);}}
else if(keyz==3)
{Fen(1,30);
writecom(0x01); delay(1000); //全屏清除
show_status(&in_pw);
show_pw(count);}
else if(keyz==7)
{Fen(1,30);
if(count>0){count--;} //删除
show_pw(count);}
else if(keyz==12)
{ Fen(1,30);
if(flag==1)
{
flag=0;
led=1;
LED=1;
show_status(&in_pw);
}
}
else if(keyz==15)
{ Fen(1,30);if(count==6){
if(flag==0){
if(temp_pw[0]==pw[0]&&temp_pw[1]==pw[1]&&
temp_pw[2]==pw[2]&&temp_pw[3]==pw[3]&&
temp_pw[4]==pw[4]&&temp_pw[5]==pw[5]){
writecom(0x01);delay(1000);
show_status(&OPEN);
flag=1;
led=0;
LED=1;
count=0;
errnum=0;
show_pw(count);
}
else{LED=0;
errnum++;
count=0;
show_pw(count);
writecom(0x01);delay(1000);
show_status(&err);
Fen(3,300);
if(errnum>=3)
{ show_pw(count);
writecom(0x01);delay(1000);
show_status(&lock);
lock_c();
}
} }
else if(flag==1)
{
}
else if(flag==2)
{ pw[0]=temp_pw[0];
pw[1]=temp_pw[1];
pw[2]=temp_pw[2];
pw[3]=temp_pw[3];
pw[4]=temp_pw[4];
pw[5]=temp_pw[5];
writecom(0x01);delay(1000);
show_status(&OPEN);
flag=1;
count=0;
show_pw(count);}}
else{led=0;} }
else if(keyz==14)
{ Fen(1,30);
if(flag==1)
{
show_status(&set_pw);
flag=2;
} } }
void main(){led=1;LED=1;
initlcd(); //LCD初始化函数
show_status(&in_pw);
show_pw(0);
while(1){
in_key();
}
//定义键盘函数
}
你先把你的问题中代码按 要求 全部 格式化为代码格式,并且规范一下格式吧!
没仔细看完,大概看了一下,key函数明显有问题
key=0x0f;
switch(key){
case 0x07: keyz=0;break;
case 0x0b: keyz=1;break;
case 0x0d: keyz=2;break;
case 0x0e: keyz=3;break;
}
key刚刚赋值了一个常量,就对key做switch,而且case的值和这个常量没有任何关系,这个switch语句毫无用处啊
跟踪测试一下