|
程序的用途是键盘输入然后在lcd显示 单独测试过键盘程序和lcd程序都可以 但是放一起 就出错了 无论我摁下哪个键总是显示字符串的第一个字符 就是说key总是等于0 但是单独用led测试键盘程序很正常
程序如下 麻烦各位帮忙给看一下了
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar table[17]= "0123456789abcdef";//键盘输入码
uchar dis_buf; //显示缓存
uchar temp;
uchar key; //键顺序码
uchar row;
uchar line;
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
//--------------------------------------------------
/* 延时子程序*/
void delay(uchar x)
{ uchar j;
while((x--)!=0)
{ for(j=0;j<125;j++)
{;}
}
}
//--------------------------------------------------
/*键扫描子程序*/
void keyscan(void)
{
P0=0xf0; //低四位输入
delay(1);
temp=P0; //读P1口
temp=temp&0x0f;
if(temp==1)
line=0;
else if(temp==2)
line=1;
else if(temp==4)
line=2;
else if(temp==8)
line=3;
P0=0x0f; //高四位输入
delay(1);
temp=P0; //读P1口
temp=temp&0xf0;
if(temp==16)
row=0;
else if(temp==32)
row=1;
else if(temp==64)
row=2;
else if(temp==128)
row=3;
key=line*4+row;
dis_buf=table[key]; //查表得键值
}
//--------------------------------------------------
/*判断键是否按下*/
void keydown(void)
{
P0=0xf0;
if(P0!=0xf0)
/*delay(1);
else
keydown();
if(P0!=0xf0)
keyscan();
else
keydown();*/
keyscan();
}
//--------------------------------------------------
/*读lcd状态指令*/
void recom( )
{
EN=0;
RS=0;
RW=1;
EN=1;
}
//--------------------------------------------------
//////////测试是否忙///////////////
void busytest()
{
P1=0xff;
RS=0;
RW=1;
EN=1;
while((P1&0x80)==0x80)
{
EN=0; //这两句protues仿真必须加
EN=1; //
};
EN=0;
}
/////////////////////////////////
////////////写lcd指令不判断是否忙//////
void wrcom(unsigned char n)
{
RS=0;
RW=0;
EN=1;
P1=n;
EN=0;
}
////////////////////////////////
//////////写lcd指令判断是否忙//////
void wrcomn (unsigned char n)
{
busytest();
wrcom(n);
}
/////////////////////////////
////////清屏//////////////
void clrscr()
{
wrcomn(0x01); //清屏
}
/////////////////////////////
///////////初始化lcd///////////
void initlcd()
{
delay(150);
wrcom(0x38);
delay(50);
wrcom(0x38);
delay(50);
wrcom(0x38);
wrcomn(0x38);
wrcomn(0x08); //关显示 不显示光标
wrcomn(0x01); //清屏
wrcomn(0x06); //光标模式
wrcomn(0x0c); //开显示
}
////////////////////////////
//////////设置光标位置/////////
void setpos(unsigned char x,unsigned char y)
{
busytest();
x&=0x0f;
y&=0x03;
if(y==0x00)
wrcomn(x|0x80);
else if(y==0x01)
wrcomn((x+0x40)|0x80);
}
/////////////////////////////////
////////////写数据//////////////
void wrightdata(uchar n)
{
busytest();
RS=1;
RW=0;
EN=1;
P1=n;
EN=0;
}
///////////////////////
///////////写字符串数据////////
void wrightstrdata(unsigned char *s,unsigned int length)
{
int x,y;
int YMAX,XMAX[2];
if(length>16)
{
YMAX=2;
XMAX[0]=16;
XMAX[1]=length-16;
}
else
{
YMAX=1;
XMAX[0]=length;
XMAX[1]=0;
}
for(y=0;y
for(x=0;x
{
setpos(x,y);
wrightdata(*s);
s++;
}
}
///////////////////////////////
main()
{
EN=0;
initlcd();
while(1)
{
keydown();
clrscr();
//wrightstrdata(table,16);
wrightdata(dis_buf);
delay(3000);
}
}
|
|