我是初学者,想请高手指点一下,下面的这段程序问题出在哪里。自己尝试这调试了几天,将程序下载到单片机后液晶屏上只有16个黑色的小方块,并不显示指定的字符。小弟急求,烦请高手指点,在线等!!这是用c8051f020驱动1602LCD的一段测试程序:
#include <c8051f020.h>
#include <intrins.h>
sbit rs= P2^0; //数据命令选择位
sbit rw = P2^1; //读写信号控制端
sbit ep = P2^2; //使能信号控制端
unsigned char code dis1[] = {"www.hificat.com"};
unsigned char code dis2[] = {"0571-85956028"};
void delay(unsigned char ms) //延时多长时间???
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
unsigned char lcd_bz(void) //LCD“忙”判断函数
{
P0=0xff; //此时不接受外来指令???
rs=0;
rw=1; //读指令模式
ep=0; //若晶振速度太高可以在这后加小的延时
_nop_();
_nop_();
_nop_();
ep=1;
while(P0 & 0x80) //检测忙信号 ????
return(P0);
}
void lcd_wcmd(unsigned char cmd)
{
lcd_bz(); //判断LCD是否忙碌
rs = 0; //选择指令寄存器
rw = 0; //写命令
ep = 0; //使能信号控制端
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
void lcd_pos(unsigned char pos) //显示存储器的地址
{
lcd_wcmd(pos | 0x80);
}
void lcd_wdat(unsigned char dat)
{
lcd_bz();//判断LCD是否忙碌
rs = 1; //选择数据寄存器
rw = 0; //写命令
ep = 0; //使能信号控制端
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
void lcd_init()
{
delay(50);
lcd_wcmd(0x28);
delay(50);
lcd_wcmd(0x0c);
delay(50);
lcd_wcmd(0x06);
delay(50);
lcd_wcmd(0x01);
delay(50);
lcd_wcmd(0x01);
delay(50);
}
void PORT_Init(void)
{
XBR0 = 0x00;
XBR1 = 0x00;
XBR2 = 0x40; //交叉开关使能,使得P0-P3口能输出
P0MDOUT = 0x00;
P1MDOUT = 0x00;
P2MDOUT = 0x07;
P74OUT =0x00;
}
void OSCILLATOR_Init (void)
{
int i; // delay counter
OSCXCN = 0x67; // start external oscillator with
// 22.1184MHz crystal
for (i=0; i < 256; i++) ; // wait for oscillator to start
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
// source and enable missing clock
// detector
}
void main(void)
{
unsigned char i;
WDTCN = 0xde; // Disable watchdog timer
WDTCN = 0xad;
OSCILLATOR_Init ();
PORT_Init();
lcd_init();// 初始化LCD
delay(250);
lcd_pos(0x01);//设置显示位置
i = 0;
while(dis1 != '\0')
{
lcd_wdat(dis1);//显示字符
i++;
}
lcd_pos(0x42);// 设置显示位置
i = 0;
while(dis2 != '\0')
{
lcd_wdat(dis2);// 显示字符
i++;
}
} |