求助单片机键盘显示(1602)
时间:10-02
整理:3721RD
点击:
要在1602显示屏显示数字0-9 常用符号
程序有两个不知名程序,
本来想用13号键选择数字模块,11号键光标左移,12右移,16键选择符号 1-9号键控制0-9数字和符号之类的
选择数字或符号模块时什么也没输出!求解
#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
/*LCD端口定义*/
sbit RS=P3^7;
sbit RW=P3^6;
sbit E=P3^5;
sfr LCDData=0x80;
sfr keyport=0xa0;//键盘端口定义//
uchar key;
uint q=0x80;//左右移位变量
void Delay(uint i) //延时
{
while(i--);
}
/*液晶驱动程序*/
void Write_Instruction(uchar x) //字节命令
{
Delay(1000);
E=0;
RW=0;
RS=0;
LCDData=x;
E=1;
Delay(20);
E=0;
}
void Write_Data(uchar x) //字节数据写入数据
{
Delay(1000);
E=0;
RW=0;
RS=1;
E=1;
LCDData=x;
E=0;
}
void C1S(void) //清屏
{
Write_Instruction(0x01);
}
void InitLCD(void) //初始化
{Write_Instruction(0x38);
Delay(200);
Write_Instruction(0x0e);
Delay(200);
Write_Instruction(0x06);
Delay(200);
}
void Write_String(uchar x,uchar*p) //字符串写入
{
Write_Instruction(x);
while(*p!=0x00)
{
Write_Data(*p);
p++;
if(x++==0x8f)
{Write_Instruction(0xc0);
}}}
/*行列式键盘驱动程序*/
bit ReadKey(void) //Reakey
{
bit dat;
keyport=0xf0; //键盘口高四位列线为1,低四位行线为0
if(keyport==0xf0)
{
dat=0;//没有按键按下
}
else
{
dat=1; //当前有按键按下
}
return(dat);
}
uchar IdentifyKey(void) //键盘驱动程序
{
uchar i=1,j=0xfe,m;
while(j!=0x7f)
{
keyport=j;
m=keyport&0xf0;
switch(m)
{
case 0xe0:
{
i=i+0;
j=0x7f;
break;
}
case 0xd0:
{i=i+4;
j=0x7f;
break;
}
case 0xb0:
{i=i+8;
j=0x7f;
break;
}
case 0x70:
{
i=i+12;
j=0x7f;
break;
}
default:
{
i=i+1;
j=(j<<1)+1;
break;
}
}
}
return(i);
}
/*键盘与与液晶驱动应用 */
//显示按键结果程序
//i:1602液晶屏上的显示地址
//k:按键编号,1-16
void DisplayKey(uchar i,uchar k)
{
Write_Instruction(i);
Write_Data(k);
}
void left () //左移
{
Write_Instruction(0x10);
q--;
if(q+1==0xc0)
{
q=0x8f;
Write_Instruction(0x8f);
}
}
void right () //右移
{
Write_Instruction(0x14);
q++;
if(q-1==0x8f)
{
q=0xc0 ;
Write_Instruction(0xc0);
}}
void DisplayKey_point (void) //数字模块
{
放 if(ReadKey())//如果没有按键按下,则直接退出
{
key=IdentifyKey();//识别按键编号
while(ReadKey());//等待按键释放
}
if(key==1){DisplayKey(q,0x31);}
if(key==2){DisplayKey(q,0x32);}
if(key==3){DisplayKey(q,0x33);}
if(key==4){DisplayKey(q,0x34);}
if(key==5){DisplayKey(q,0x35);}
if(key==6){DisplayKey(q,0x36);}
if(key==7){DisplayKey(q,0x37);}
if(key==8){DisplayKey(q,0x38);}
if(key==9){DisplayKey(q,0x39);}
if(key==10){DisplayKey(q,0x30);} }
void DisplayKey_symbol (void) //符号模块
{
if(ReadKey())//如果没有按键按下,则直接退出
{
key=IdentifyKey();//识别按键编号
while(ReadKey());//等待按键释放
}
if(key==1){DisplayKey(q,0x21);}
if(key==2){DisplayKey(q,0x2c);}
if(key==3){DisplayKey(q,0x2e);}
if(key==4){DisplayKey(q,0x28);}
}
//扫描键盘程序
void ScanKey(void)
{
if(ReadKey())//如果没有按键按下,则直接退出
{
key=IdentifyKey();//识别按键编号
while(ReadKey());//等待按键释放
if(key==11) //左移
{
left();
}
if(key==12) //右移
{
right();
}
if (key==13) //选择数字模块
{
DisplayKey_point();
}
if (key==16) //选择字符模块
{
DisplayKey_symbol();
}
}}
/*主程序*/
void main(void)
{
C1S();
InitLCD();//初始化液晶
while(1)
{
ScanKey();
Delay(0xffff);
}}
程序有两个不知名程序,
本来想用13号键选择数字模块,11号键光标左移,12右移,16键选择符号 1-9号键控制0-9数字和符号之类的
选择数字或符号模块时什么也没输出!求解
#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
/*LCD端口定义*/
sbit RS=P3^7;
sbit RW=P3^6;
sbit E=P3^5;
sfr LCDData=0x80;
sfr keyport=0xa0;//键盘端口定义//
uchar key;
uint q=0x80;//左右移位变量
void Delay(uint i) //延时
{
while(i--);
}
/*液晶驱动程序*/
void Write_Instruction(uchar x) //字节命令
{
Delay(1000);
E=0;
RW=0;
RS=0;
LCDData=x;
E=1;
Delay(20);
E=0;
}
void Write_Data(uchar x) //字节数据写入数据
{
Delay(1000);
E=0;
RW=0;
RS=1;
E=1;
LCDData=x;
E=0;
}
void C1S(void) //清屏
{
Write_Instruction(0x01);
}
void InitLCD(void) //初始化
{Write_Instruction(0x38);
Delay(200);
Write_Instruction(0x0e);
Delay(200);
Write_Instruction(0x06);
Delay(200);
}
void Write_String(uchar x,uchar*p) //字符串写入
{
Write_Instruction(x);
while(*p!=0x00)
{
Write_Data(*p);
p++;
if(x++==0x8f)
{Write_Instruction(0xc0);
}}}
/*行列式键盘驱动程序*/
bit ReadKey(void) //Reakey
{
bit dat;
keyport=0xf0; //键盘口高四位列线为1,低四位行线为0
if(keyport==0xf0)
{
dat=0;//没有按键按下
}
else
{
dat=1; //当前有按键按下
}
return(dat);
}
uchar IdentifyKey(void) //键盘驱动程序
{
uchar i=1,j=0xfe,m;
while(j!=0x7f)
{
keyport=j;
m=keyport&0xf0;
switch(m)
{
case 0xe0:
{
i=i+0;
j=0x7f;
break;
}
case 0xd0:
{i=i+4;
j=0x7f;
break;
}
case 0xb0:
{i=i+8;
j=0x7f;
break;
}
case 0x70:
{
i=i+12;
j=0x7f;
break;
}
default:
{
i=i+1;
j=(j<<1)+1;
break;
}
}
}
return(i);
}
/*键盘与与液晶驱动应用 */
//显示按键结果程序
//i:1602液晶屏上的显示地址
//k:按键编号,1-16
void DisplayKey(uchar i,uchar k)
{
Write_Instruction(i);
Write_Data(k);
}
void left () //左移
{
Write_Instruction(0x10);
q--;
if(q+1==0xc0)
{
q=0x8f;
Write_Instruction(0x8f);
}
}
void right () //右移
{
Write_Instruction(0x14);
q++;
if(q-1==0x8f)
{
q=0xc0 ;
Write_Instruction(0xc0);
}}
void DisplayKey_point (void) //数字模块
{
放 if(ReadKey())//如果没有按键按下,则直接退出
{
key=IdentifyKey();//识别按键编号
while(ReadKey());//等待按键释放
}
if(key==1){DisplayKey(q,0x31);}
if(key==2){DisplayKey(q,0x32);}
if(key==3){DisplayKey(q,0x33);}
if(key==4){DisplayKey(q,0x34);}
if(key==5){DisplayKey(q,0x35);}
if(key==6){DisplayKey(q,0x36);}
if(key==7){DisplayKey(q,0x37);}
if(key==8){DisplayKey(q,0x38);}
if(key==9){DisplayKey(q,0x39);}
if(key==10){DisplayKey(q,0x30);} }
void DisplayKey_symbol (void) //符号模块
{
if(ReadKey())//如果没有按键按下,则直接退出
{
key=IdentifyKey();//识别按键编号
while(ReadKey());//等待按键释放
}
if(key==1){DisplayKey(q,0x21);}
if(key==2){DisplayKey(q,0x2c);}
if(key==3){DisplayKey(q,0x2e);}
if(key==4){DisplayKey(q,0x28);}
}
//扫描键盘程序
void ScanKey(void)
{
if(ReadKey())//如果没有按键按下,则直接退出
{
key=IdentifyKey();//识别按键编号
while(ReadKey());//等待按键释放
if(key==11) //左移
{
left();
}
if(key==12) //右移
{
right();
}
if (key==13) //选择数字模块
{
DisplayKey_point();
}
if (key==16) //选择字符模块
{
DisplayKey_symbol();
}
}}
/*主程序*/
void main(void)
{
C1S();
InitLCD();//初始化液晶
while(1)
{
ScanKey();
Delay(0xffff);
}}
等大神
程序太长,没时间看,先测试按键是否响应,响应按键后送个信号或显个数出来,一步一步的找原因
程序太长没时间看,不过我觉得,你是不是试着软件延时去抖动看看。