麻烦大家看一下,为什么郭天祥的lcd1602A程序在普中科技那个
单片机上运行不了,只显示第一行,没显示第二行。然后加了一个侧忙函数就可以两行显示了。为什么啊?这个是郭天祥的程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="I LIKE MCU!";
uchar code table1[]="WWW.TXMCU.COM";
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^6;
sbit wela=P2^7;
uchar num;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x10);
}
void main()
{
init();
for(num=0;num<11;num++)
{
write_data(table[num]);
delay(20);
}
write_com(0x80+0x53);
for(num=0;num<13;num++)
{
write_data(table1[num]);
delay(20);
}
for(num=0;num<16;num++)
{
write_com(0x18);
delay(20);
}
while(1);
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~另一个程序~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <reg51.h> //51寄存器文件
#include <intrins.h>
typedef unsigned char BYTE; //用BYTE代替unsigned char
typedef unsigned int WORD;//WORD代替unsigned int
typedef bit BOOL ;//用BOOL代替bit
sbit rs = P2^6; //复位端
sbit rw = P2^5; //写数据端
sbit ep = P2^7; //使能端
BYTE code dis1[] = {"I LIKE MCU!"};
BYTE code dis2[] = {"www.PRECHIN.com"};
/*******************延时函数********************/
delay(BYTE ms)
{
BYTE i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_(); //空执行消耗CPU时间达到等待的效果
_nop_();
_nop_();
}
}
}
/*******************LCD侧忙函数********************/
BOOL lcd_bz()
{
BOOL result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80); //检测P0最高位是否为1
ep = 0;
return result;//返回侧忙结果
}
lcd_wcmd(BYTE cmd)
{ // 写入指令数据到LCD
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd; //将8位指令通过P0口传给1602
_nop_();
_nop_();//用于产生一个脉冲宽度
ep = 1;
_nop_();
_nop_();
ep = 0;
}
lcd_pos(BYTE pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
}
lcd_wdat(BYTE dat)
{ //写入字符显示数据到LCD
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P0 = dat;//将8位数据通过P0口传给1602
_nop_(); //用于产生一个脉冲宽度
_nop_();
ep = 1;
_nop_();
_nop_();
ep = 0;
}
lcd_init()
{ //LCD初始化设定
lcd_wcmd(0x38); ////16*2显示,5*7点阵,8位数据
delay(1);
lcd_wcmd(0x0c); //显示开,关光标
delay(1);
lcd_wcmd(0x06); //移动光标
delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
}
main()
{
BYTE i;
lcd_init(); //初始化LCD
delay(10);
lcd_pos(4); //设置显示位置为第一行的第5个字符
for(i=0;i<8;i++)
{ //显示字符"welcome!"
lcd_wdat(dis1
);
}
lcd_pos(0x41); //设置显示位置为第二行第二个字符
for(i=0;i<16;i++)
{
lcd_wdat(dis2); //显示字符" www.PRECHIN.com "
}
while(1); //
}
{
init();
for(num=0;num<11;num++)
{
write_data(table[num]);
delay(20);
}
write_com(0x80+0x53);////////////// 这里改成80+40试试。
for(num=0;num<13;num++)
{
write_data(table1[num]);
delay(20);
}
for(num=0;num<16;num++)
{
write_com(0x18);
delay(20);
}
while(1);
嗯嗯,知道了,谢谢~~
一周热门 更多>