我的液晶无法显示,源程序如下,请帮忙分析,谢谢各位高手。
#include <C8051F000.H>
sbit LCM_CS = P0^3 ; //LCM 驱动端口
sbit LCM_SID = P0^4 ;
sbit LCM_SCLK = P0^5 ;
sbit LCM_RST = P0^6 ;
sbit LCM_BK = P0^7 ;
void send_byte(unsigned char dat);
void write_cmd(unsigned char cmd);
void write_data(unsigned char buffer);
void lcd_init(void) ;
void delay_us(int ms)
{
unsigned int data i;
unsigned char data j;
for(i=0;i <ms;i++)
{
for(j=0;j <0x2f;j++);
}
}
//串行发送一字节数据
void send_byte(unsigned char lcd_byte)
{
unsigned char data i;
for(i=0;i <8;i++)
{
LCM_SCLK = 0 ;
delay_us(10);
if((lcd_byte) & 0x80) LCM_SID = 1;
else LCM_SID = 0;
LCM_SCLK = 1 ;
lcd_byte=lcd_byte < <1;
delay_us(10);
}
}
void write_cmd(unsigned char cmd)
{
//LCM_CS=1;
delay_us(20);
send_byte(0xf8); //11111,00,0 RW=0,RS=0 同步标志
send_byte(cmd & 0xf0); //高四位
send_byte((cmd < <4) & 0xf0); //低四位
delay_us(20);
// LCM_CS=0;
}
void write_data(unsigned char buffer)
{
// LCM_CS=1;
delay_us(20);
send_byte(0xfa); //11111,01,0 RW=0,RS=1
send_byte(buffer & 0xf0); //高四位
send_byte((buffer < <4) & 0xf0); //低四位
delay_us(20);
//LCM_CS=0;
}
void lcd_init(void)
{
LCM_RST= 0;
delay_us(1000) ;
LCM_RST=1;
delay_us(1000);
LCM_CS = 1;
write_cmd(0x30) ; //功能设置,一次送8位数据,基本指令集
delay_us(100) ;
write_cmd(0x30) ; //功能设置,一次送8位数据,基本指令集
delay_us(100) ;
write_cmd(0x0c) ; //0000,1100 整体显示,游标off,游标位置off
delay_us(100);
write_cmd(0x01) ; //0000,0001 清DDRAM
delay_us(100);
write_cmd(0x02) ; //0000,0010 DDRAM地址归位
delay_us(100) ;
write_cmd(0x80) ;//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC
delay_us(100) ;
}
void display(unsigned char x_add,unsigned char dat1,unsigned char dat2)
{
write_cmd(x_add);//1xxx,xxxx 设定DDRAM 7位地址xxx,xxxx到地址计数器AC
write_data(dat1);
write_data(dat2);
}
void display_test(void)
{
write_cmd(0x81);//1000,0001 设定DDRAM 7位地址000,0001到地址计数器AC
write_data(0x33);
write_data(0x42);
write_data(0x43);
write_data(0x44);
write_cmd(0x00);
display(0x80,0xb0,0xb2);
display(0x81,0xbb,0xD5);
display(0x82,0xb5,0xe7);
display(0x83,0xc1,0xA6);
display(0x84,0xc5,0xe0);
display(0x85,0xD1,0xb5);
display(0x86,0xd6,0xD0);
display(0x87,0xd0,0xc4);
}
void main(void)
{
WDTCN = 0xde; // disable watchdog timer
WDTCN = 0xad;
OSCICN = 0x97; // Internal Oscillator Control Register,16M,
// adc_init();
port_init();
// read_setting();
// write_setting();
lcd_init();
display_test();
// os_start_system (INIT); /* start the first task */
}