Can you help me?
请大家帮忙浏览一下这个显示程序。程序是要在字符型液晶体模块(2*24,5*7点阵)上显
示两行字符,我反复检查了输入的显示地址都 没错,但是程序运行只能在第一行显示,我
找不出问题,请高手指点。(89s51控制芯片,控制驱动电路HD44780)
#include <reg51.h>
#include <absacc.h>
/*LCD*/
#define LCD_Data_Port P0
#define LINE1_ADDR 0x00
#define LINE2_ADDR 0x40
static void LCD_goxy(unsigned char x,unsigned char y);//LCD
static void LCD_clr(void);//clear display
static void LCD_CMD_Write(unsigned char pass_value);//write command
static void LCD_DAT_Write(unsigned char pass_value);//Write data
static void LCD_DAT_Write1(unsigned char pass_value);
static void LCD_CMD_Write1(unsigned char pass_value);
static unsigned char LCD_RAM_Read(void);
static void LCD_DAT_Read(void);
void LCD_init(void);
void LCD_Delay(void);
static void LCD_light();
sbit LCD_black_ligh=P2^7;
sbit LCD_E=P3^3;
sbit LCD_RS=P3^4;
sbit LCD_RW=P3^5;
sbit ALARM=P3^6;
sbit STATUS=P3^7;
sbit bflag=ACC^7;
void main(void)
{
int j=0,k=0;
unsigned char m,n;
unsigned char code Table_1[15]=
{0x31,0x2e,0x30,0x20,0x56,0x49,0x45,0x57,0x20,0x41,0x4c,0x41,0x52,0x4d,0x53};
unsigned char code Table_2[17]=
{0x41,0x4c,0x41,0x52,0x4d,0x53,0x20,0x4c,0x49,0x53,0x54,0x20,0x45,0x4d,0x50,0x54
,0x59};
LCD_light();
LCD_clr();
LCD_init();
LCD_goxy(0,1);
for(m=0;m <15;m++)
{
LCD_DAT_Write(Table_1[j++]);
LCD_E=0;
LCD_Data_Port=0xff;
}
LCD_goxy(1,2);
for(n=0;n <17;n++)
{
LCD_DAT_Write(Table_2[k++]);
LCD_E=0;
LCD_Data_Port=0xff;
}
}
/* 子函数 *
/*灯*/
void LCD_light()
{
P2=0xff;
LCD_black_ligh=0;
}
/*读LCD的忙标志*/
void LCD_busy(void)
{
LCD_RS=0;
LCD_RW=1;
LCD_E=1;
do
{
ACC=LCD_Data_Port;
}while(bflag==1);
LCD_E=0;
}
/*显示的位置*/
/*清屏*/
static void LCD_clr(void)
{
LCD_busy();
LCD_CMD_Write(0x01);
}
/*初始化 LCD*/
void LCD_init(void)
{
unsigned char pass;
int i=3;
do
{
pass=0x38;//功能设置,8位数据,两行显示,5*7点阵字符
LCD_RS=0;
LCD_RW=0;
LCD_Data_Port=pass;
LCD_Delay();
LCD_E=1;
LCD_E=0;
}while(i--);
pass=0x01;
LCD_CMD_Write(pass);//清屏
pass=0x06;
LCD_CMD_Write(pass);//输入方式设置,数据操作后,AC加一
pass=0x0c;
LCD_CMD_Write(pass);//LCD显示开,光标,闪烁关
}
/*延时子程序*/
void LCD_Delay(void)
{
int t;
t=5000;
while(t) t--;
}
static void LCD_goxy(unsigned char x,unsigned char y)
{
unsigned char tmp;
tmp=x&0xf;
switch(y)
{
case 0:
tmp|=LINE1_ADDR;
LCD_CMD_Write(tmp);
break;
case 1:
tmp|=LINE2_ADDR;
LCD_CMD_Write(tmp);
break;
}
}
/*写指令到 LCD*/
void LCD_CMD_Write(unsigned char pass_value)
{
LCD_busy();
LCD_RS=0;
LCD_RW=0;
LCD_E=1;
LCD_E=0;
LCD_Data_Port=pass_value;
LCD_busy();
LCD_E=1;
LCD_E=0;
}
/*写数据到LCD*/
void LCD_DAT_Write(unsigned char pass_value)
{
LCD_busy();
LCD_RS=1;
LCD_RW=0;
LCD_Data_Port=pass_value;
LCD_E=1;
LCD_E=0;
LCD_Data_Port=0xff;
}
发表时间:2004年7月19日14:09:34