用89C52单片机驱动1602液晶,怎么才能瞬间显示一行字母?(用汇编和用C,有区别吗)

别人做好的1602驱动程序,是瞬间显示一行(16个字母)
而我做的程序是逐字显示。知道是什么原因吗?
最好能说下原因

第1个回答  2010-09-05
啥叫瞬间显示啊?

如果是闪一下,可以先显示再擦除。(不过有啥用呢?测试相机?)

如果问题是不知道如何显示,方法一般是:先使能;再进行模块初始化;再写控制字;再写数据;写操作不要忘记判忙(busy=1)。

汇编与c对于但片机没有任何区别,对于使用者,比如你,也不应该有本质的区别。好的工程师是应该知道一条c语句编译出什么样的汇编语句的,所以他们在写c语句的时候是在选择更高效率的语句和结构。
第2个回答  2010-09-07
#include<reg51.h>
#include <intrins.h>

typedef unsigned char BYTE;
typedef bit BOOL;

sbit LCD_RS = P2^5;
sbit LCD_RW = P2^6;
sbit LCD_EP = P2^7;
char num;
unsigned char code table[]="I Love Yuo";
unsigned char code table1[]="Do You Love Me?";

/*延时程序*/
void delay2(unsigned char i)
{while(--i);}

void delay8(unsigned int t)
{while(--t);}

void delay_50ms(unsigned int i)
{
int j;
while(--i)
for(j=6245;j>0;j--)
{;}
}

BOOL lcd_bz()
{ // 测试LCD忙碌状态
BOOL result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EP = 1;
delay2(2);
result = (BOOL)(P0 & 0x80);
LCD_EP = 0;
return (result);
}

lcd_wcmd(BYTE cmd)
{ // 写入指令数据到LCD
while(lcd_bz());
LCD_RS = 0;
LCD_RW = 0;
LCD_EP = 0;
P0 = cmd;
//delay2(2);
LCD_EP=1;
delay2(4);
LCD_EP=0;
}
/* lcd_pos(BYTE pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
} */

lcd_wdat(BYTE dat)
{ //写入字符显示数据到LCD
while(lcd_bz());
LCD_RS = 1;
LCD_RW = 0;
LCD_EP = 0;
P0 = dat;
LCD_EP=1;
delay2(4);
LCD_EP=0;
}

lcd_init()
{
delay8(1900); //LCD初始化设定
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay8(625);
lcd_wcmd(0x0c); //显示开,关光标
delay8(625);
lcd_wcmd(0x06); //移动光标
delay8(625);
lcd_wcmd(0x01); //清除LCD的显示内容
delay8(625);
}

/*main()
{
delay8(1900);
lcd_init();
lcd_wdat(tab[1]);
delay8(1000);
{
while(1);
}

} */
void main()
{
lcd_init();

for(num=0;num<11;num++)
{
lcd_wdat(table[num]);
delay_50ms(10);
}
lcd_wcmd(0x80+0x40);
for(num=0;num<16;num++)
{
lcd_wdat(table1[num]);
delay_50ms(10);

}
delay_50ms(10);

}
第3个回答  2012-09-26
用C很方便 逐字和一起都可以!!!有需要可以给个程序给你参考
第4个回答  2010-09-06
在你的延时程序上吧

将显示每个字符后的延时时间缩短,试试吧
第5个回答  2010-09-15
把QQ告诉我,Q上谈本回答被提问者采纳