打印

帮忙看一下不带字库12864的程序

[复制链接]
3002|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tracyking|  楼主 | 2011-7-18 16:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
LCD, CD, se, RS, SCR
哪位高手帮我看一下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);
}

相关帖子

沙发
chenyu988| | 2012-7-22 08:16 | 只看该作者
这不是我发的求助帖的程序么- -

使用特权

评论回复
板凳
wukunshan| | 2012-7-22 11:45 | 只看该作者
先保证能显示英文字符,然后再调试显示汉字。

使用特权

评论回复
地板
chenyu988| | 2012-7-22 21:13 | 只看该作者
我当时的选屏那块出了问题,你看看你的12864 CS1 CS2是不是高电平有效。

使用特权

评论回复
5
伍戈123| | 2012-7-26 20:12 | 只看该作者
我这两天闲着没事也是做这个,完全可以。不会是你的读忙函数问题吧。。。。看你写的这么麻烦啊

使用特权

评论回复
6
泗一起| | 2013-6-1 17:08 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

144

帖子

0

粉丝