哪位高手帮我看一下LCD12864(不带字库)的程序,从昨天调到现在都还没把字给显示出来,纠结啊...感觉程序都没什么问题,但是字就是出不来,帮忙找一下错误
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define lcd_dat P0
sbit lcd_rs=P2^6;
sbit lcd_rw=P2^5;
sbit lcd_en=P2^7;
sbit cs1=P3^2;
sbit cs2=P3^3;
uchar code wo[]={0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20,0x00,
0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41,0xF8,0x00,};
uchar num;
void delay_us(uchar us_value)
{
while(us_value--)
{
_nop_();
_nop_();
}
}
void delayms(uint z)
{
uint i,j;
for(i=z;j>0;j--)
for(j=110;j>0;j--);
}
void read_busy() //读“忙”函数,数据线的最高位DB7为1的时候则为busy
{
uchar dat;
lcd_rs=0;
lcd_rw=1;
do
{
P0=0x00; //清零P0口
delayms(5);
lcd_en=1;
dat=P0; //读P0口
lcd_en=0;
dat>>=7; //仅当第7位为0时才可操作(判别busy信号)
}
while(!(dat==0x00));
}
void write_lcd_com(uchar value) //写指令函数
{
read_busy(); //每次读写前都要忙判断;
lcd_rs=0;
lcd_rw=0;
lcd_dat=value;
delayms(5);
lcd_en=1;
delayms(5);
lcd_en=0;
}
void write_lcd_dat(uchar value) //写数据函数
{
read_busy();
lcd_rs=1;
lcd_rw=0;
lcd_dat=value;
delayms(5);
lcd_en=1;
delayms(5);
lcd_en=0;
}
void set_page(uchar page) //设置页,要那一页直接是那个数字就行了;总共有8页,一页是8行点阵点,即128*8
{
page=0xb8+page; //页得首地址为0xB8
write_lcd_com(page);
}
void set_line(uchar startline) //设置显示的起始行
{
startline=0xc0+startline; //起始行地址为0xc0
write_lcd_com(startline); //设置从哪一行开始,共0--63
}
void set_column(uchar column) //设置显示的列
{
column=column&0x3f; //列的最大值为64,因为分成两个屏了
column=0x40+column; //列的首地址为0x40;
write_lcd_com(column); //设置列位置
}
void setonoff(uchar onoff) //显示开关函数,1为开,0为关
{
onoff=0x3e+onoff; //0x3e是关显示,0x3f是开显示;
write_lcd_com(onoff);
}
void selectscreen(uchar screen) //选屏
{
switch(screen)
{
case 0:cs1=0;cs2=0;break; //全屏
case 1:cs1=0;cs2=1;break; //选左半屏
case 2:cs1=1;cs2=0;break; //选右半屏
default:break;
}
}
void clearscreen(uchar screen) //清屏
{
uchar i,j;
selectscreen(screen);
for(i=0;i<8;i++) //控制页数0--7,共8页
{
set_page(i);
set_column(0);
for(j=0;j<64;j++) //控制列数0-63,共64列
{
write_lcd_dat(0x00); //写入0,地址指针自加1
}
}
}
void intlcd() //lcd的初始化
{
read_busy();
selectscreen(0); //两个屏都选
setonoff(0); //关显示
delayms(2);
selectscreen(0);
setonoff(1); //开显示
delayms(2);
clearscreen(0); //清屏
set_line(0); //开始行为0
set_column(0); //开始列为0
set_page(0); //开始页为0
}
void display(uchar ss,uchar page,uchar column,uchar *p) //显示汉字
{
uchar i;
selectscreen(ss);
set_page(page); //写上半页
set_column(column); //控制列
for(i=0;i<16;i++) //控制16列的数据输出,因为一个汉字是16*16点阵的
{
write_lcd_dat(p[i]); //汉字的上半部分
}
set_page(page+1); //写下半页
set_column(column); //控制列
for(i=0;i<16;i++) //控制16列数据的输出
{
write_lcd_dat(p[i+16]);//汉字的下半部分
}
}
void main()
{
intlcd(); //lcd初始化
display(1,0,4,wo); //我
while(1);
} |