|
仿真好好的到了單片機(jī)上出現(xiàn)了這個(gè)問題看圖
這字母一直從左到右循環(huán),按鍵的話下面還會出現(xiàn)數(shù)字5和7.
LCD顯示屏
麻煩看一下哪里有問題!!!代碼在下面:
#include <reg52.h>
#include <intrins.h> //包含_nop_( )空函數(shù)指令的頭文件
#define uchar unsigned char
#define uint unsigned int
#define out P0
sbit RS=P3^4; //位變量
sbit RW=P3^5; //位變量
sbit E=P3^6;
sbit YES=P2^3;
sbit ST=P3^7;
sbit START=P3^0;
void lcd_initial(void); //位變量
void lcd_initial(void); //LCD初始化函數(shù)
void check_busy(void); //檢查忙標(biāo)志函數(shù)
void write_command(uchar com); //寫命令函數(shù)
void write_data(uchar dat); //寫數(shù)據(jù)函數(shù)
void string(uchar ad ,uchar *s);
void delay(uint); //延時(shí)函數(shù)
unsigned char key_scan()
{
unsigned char key_temp0,key_temp1;
unsigned char key_num=0;
P2=0x0f;
key_temp0=P2;
if(key_temp0!=0x0f)
{
delay(5);
key_temp0=P2;
if(key_temp0!=0x0f)
{
P2=0xf0;
key_temp1=P2;
if(key_temp0==0x0e)
{
switch(key_temp1)
{
case 0xe0: key_num=4;break;
case 0xd0: key_num=3;break;
case 0xb0: key_num=2;break;
case 0x70: key_num=1;break;
default:key_num=0;break;
}
}
else if(key_temp0==0x0d)
{
switch(key_temp1)
{
case 0xe0: key_num=8;break;
case 0xd0: key_num=7;break;
case 0xb0: key_num=6;break;
case 0x70: key_num=5;break;
default:key_num=0;break;
}
}
else if(key_temp0==0x0b)
{
switch(key_temp1)
{
case 0xe0: key_num=12;break;
case 0xd0: key_num=11;break;
case 0xb0: key_num=10;break;
case 0x70: key_num=9;break;
default:key_num=0;break;
}
}
else if(key_temp0==0x07)
{
switch(key_temp1)
{
case 0xe0: key_num=16;break;
case 0xd0: key_num=15;break;
case 0xb0: key_num=14;break;
case 0x70: key_num=13;break;
default:key_num=0;break;
}
}
}
}
return key_num;
}
void main(void) //主函數(shù)
{
unsigned char key_num;
lcd_initial( ); //調(diào)用對LCD初始化函數(shù)
do
{
key_num=key_scan();
string(0x82,"zhijing"); //顯示的第1行字符串
switch(key_num)
{
case 1 :string(0xC8,"1"); break;
case 2 :string(0xC8,"2"); break;
case 3 :string(0xC8,"3"); break;
case 4 :string(0xC8,"4"); break;
case 5 :string(0xC8,"5"); break;
case 6 :string(0xC8,"6"); break;
case 7 :string(0xC8,"7"); break;
case 8 :string(0xC8,"8"); break;
case 9 :string(0xC8,"9"); break;
case 10:string(0xC8,"0"); break;
case 11:string(0xC8,"."); break;
case 12:string(0xC8,"YES"); break;
case 13:string(0xC8,"YES"); break;
case 14:string(0xC8,"YES"); break;
case 15:string(0xC8,"YES"); break;
case 16:string(0xC8,"YES"); break;
}
delay(100); //延時(shí)
write_command(0x01); //寫入清屏命令
delay(1); //延時(shí)
} while(ST==1);
write_command(0x01); //寫入清屏命令
delay(1); //延時(shí)
if(START==1) //有按鍵按下
{
delay(2000);
{
string(0x80,"3614.1 cm3/s");
}
}
delay(10000000);//延時(shí)
write_command(0x01);//寫入清屏命令
delay(1);//延時(shí)
while(1);
}
void delay(uint j) //1ms延時(shí)子程序
{
uchar i=250;
for(;j>0;j--)
{
while(--i);
i=249;
while(--i);
i=250;
}
}
void check_busy(void) //檢查忙標(biāo)志函數(shù)
{
uchar dt;
do
{
P0=0xff;
E=0;
RS=0;
RW=1;
E=1;
dt=P0;
}while(dt&0x80);
E=0;
}
void write_command(uchar com) //寫命令函數(shù)
{
check_busy();
E=0;
RS=0;
RW=0;
out=com;
E=1;
_nop_( );
E=0;
delay(1);
}
void write_data(uchar dat) //寫數(shù)據(jù)函數(shù)
{
check_busy();
E=0;
RS=1;
RW=0;
out=dat;
E=1;
_nop_();
E=0;
delay(1);
}
void LCD_initial(void) //液晶顯示器初始化函數(shù)
{
write_command(0x38); //寫入命令0x38:8位兩行顯示,5×7點(diǎn)陣字符
write_command(0x0C); //寫入命令0x0C:開整體顯示,光標(biāo)關(guān),無黑塊
write_command(0x06); //寫入命令0x06:光標(biāo)右移
write_command(0x01); //寫入命令0x01:清屏
delay(1);
}
void string(uchar ad,uchar *s) //輸出顯示字符串的函數(shù)
{
write_command(ad);
while(*s>0)
{
write_data(*s++); //輸出字符串,且指針增1
delay(50);
}
}
|
|