4X4的矩阵键盘和1602代码哪里有问题
时间:10-02
整理:3721RD
点击:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar dis_buf; //显示缓存
uchar temp;
uchar key; //键顺序吗
void delay0(uchar x); //x*0.14MS
sbit LCD_RW = P0^6;
sbit LCD_RS = P0^5;
sbit LCD_EN = P0^7;
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
void delay(uchar x)
{ uchar j;
while((x--)!=0)
{ for(j=0;j<125;j++)
{;}
}
}
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P2&0x80);
LCD_EN = 0;
return(result);
}
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P2 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P2 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void lcd_init()
{
LCD_EN=0;
lcd_wcmd(0x38);
lcd_wcmd(0x0c); //显示开,关光标
lcd_wcmd(0x06); //移动光标
lcd_wcmd(0x01); //清除LCD的显示内容
}
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80+0x40); //数据指针=80+地址变量
}
void keyscan(void)
{ temp = 0;
P1=0xF0; //高四位输入 行为高电平 列为低电平
delay(1);
temp=P1; //读P1口
temp=temp&0xF0; //屏蔽低四位
temp=~((temp>>4)|0xF0);
if(temp==1) // p1.4 被拉低
key=0;
else if(temp==2) // p1.5 被拉低
key=1;
else if(temp==4) // p1.6 被拉低
key=2;
else if(temp==8) // p1.7 被拉低
key=3;
else
key=16;
P1=0x0F; //低四位输入 列为高电平 行为低电平
delay(1);
temp=P1; //读P1口
temp=temp&0x0F;
temp=~(temp|0xF0);
if(temp==1) // p1.1 被拉低
key=key+0;
else if(temp==2) // p1.2 被拉低
key=key+4;
else if(temp==4) // p1.3 被拉低
key=key+8;
else if(temp==8)
key=key+12;
else
key=16;
dis_buf = key; //键值入显示缓存
dis_buf = dis_buf & 0x0f;
if(dis_buf>9) //转换为ASCII码
dis_buf = dis_buf+0x37;
else
dis_buf = dis_buf+0x30;
}
void keydown(void)
{
P1=0xF0;
if(P1!=0xF0) //判断按键是否按下 如果按钮按下 会拉低P1其中的一个端口
{
keyscan();
}
}
main()
{
uchar i,j;
P0=0xFF; //置P0口
P1=0xFF; //置P1口
delay(10); //延时
lcd_init(); //初始化LCD
while(1)
{
keydown();
lcd_pos(0x80+0x40+i);
lcd_wdat(dis_buf);
i++;
if(i==17)
{
i=0;
lcd_pos(0x80+0x40);
for(j=0;j<16;j++)
{
lcd_wdat(dis_buf);
}
i=1;
}
}
}
怎样1602随按键逐个显示数字并且右移呢?现在的情况是如图!
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar dis_buf; //显示缓存
uchar temp;
uchar key; //键顺序吗
void delay0(uchar x); //x*0.14MS
sbit LCD_RW = P0^6;
sbit LCD_RS = P0^5;
sbit LCD_EN = P0^7;
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
void delay(uchar x)
{ uchar j;
while((x--)!=0)
{ for(j=0;j<125;j++)
{;}
}
}
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P2&0x80);
LCD_EN = 0;
return(result);
}
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P2 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P2 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void lcd_init()
{
LCD_EN=0;
lcd_wcmd(0x38);
lcd_wcmd(0x0c); //显示开,关光标
lcd_wcmd(0x06); //移动光标
lcd_wcmd(0x01); //清除LCD的显示内容
}
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80+0x40); //数据指针=80+地址变量
}
void keyscan(void)
{ temp = 0;
P1=0xF0; //高四位输入 行为高电平 列为低电平
delay(1);
temp=P1; //读P1口
temp=temp&0xF0; //屏蔽低四位
temp=~((temp>>4)|0xF0);
if(temp==1) // p1.4 被拉低
key=0;
else if(temp==2) // p1.5 被拉低
key=1;
else if(temp==4) // p1.6 被拉低
key=2;
else if(temp==8) // p1.7 被拉低
key=3;
else
key=16;
P1=0x0F; //低四位输入 列为高电平 行为低电平
delay(1);
temp=P1; //读P1口
temp=temp&0x0F;
temp=~(temp|0xF0);
if(temp==1) // p1.1 被拉低
key=key+0;
else if(temp==2) // p1.2 被拉低
key=key+4;
else if(temp==4) // p1.3 被拉低
key=key+8;
else if(temp==8)
key=key+12;
else
key=16;
dis_buf = key; //键值入显示缓存
dis_buf = dis_buf & 0x0f;
if(dis_buf>9) //转换为ASCII码
dis_buf = dis_buf+0x37;
else
dis_buf = dis_buf+0x30;
}
void keydown(void)
{
P1=0xF0;
if(P1!=0xF0) //判断按键是否按下 如果按钮按下 会拉低P1其中的一个端口
{
keyscan();
}
}
main()
{
uchar i,j;
P0=0xFF; //置P0口
P1=0xFF; //置P1口
delay(10); //延时
lcd_init(); //初始化LCD
while(1)
{
keydown();
lcd_pos(0x80+0x40+i);
lcd_wdat(dis_buf);
i++;
if(i==17)
{
i=0;
lcd_pos(0x80+0x40);
for(j=0;j<16;j++)
{
lcd_wdat(dis_buf);
}
i=1;
}
}
}
怎样1602随按键逐个显示数字并且右移呢?现在的情况是如图!