pg12864f液晶好难搞定
时间:10-02
整理:3721RD
点击:
简直分析不出原因了
仿真后出现这种情况,虽然能显示,但是不完整
附上源码
仿真后出现这种情况,虽然能显示,但是不完整
附上源码
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit wr=P2^0;
- sbit rd=P2^1;
- sbit ce=P2^2;
- sbit cd=P2^3;
- sbit rst=P2^4;
- uchar code HZ0[3][35]={{
- /*-- 文字: 王 --*/
- /*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*/
- /*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/
- 0x00,0x00,0x00,0x00,0x01,0xC0,0x1E,0x00,0x02,0x00,0x02,0x00,0x03,0x80,0x1E,0x00,
- 0x02,0x00,0x02,0x00,0x03,0xF0,0x7C,0x00,0x00,0x00,0x00,0x00,
- },
- {/*-- 文字: 东 --*/
- /*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*/
- /*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/
- 0x02,0x00,0x02,0x00,0x04,0xE0,0x3F,0x00,0x08,0x00,0x0A,0x00,0x13,0xC0,0x3E,0x00,
- 0x02,0x00,0x12,0x40,0x22,0x20,0x46,0x10,0x02,0x00,0x00,0x00,
- },
- {/*-- 文字: 华 --*/
- /*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*/
- /*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/
- 0x09,0x00,0x09,0x40,0x11,0x40,0x31,0x80,0x57,0x20,0x11,0xE0,0x12,0x00,0x03,0xF0,
- 0x7E,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,},
- };
- uchar code HZ1[6][35]=
- {
- {/*-- 文字: 0 --*/
- /*-- 宋体11; 此字体下对应的点阵为:宽x高=7x14 --*/
- /*-- 宽度不是8的倍数,现调整为:宽度x高度=8x14 --*/
- 0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x84,0x84,0x84,0x48,0x30,0x00,0x00,
- },
- {/*-- 文字: 9 --*/
- /*-- 宋体11; 此字体下对应的点阵为:宽x高=7x14 --*/
- /*-- 宽度不是8的倍数,现调整为:宽度x高度=8x14 --*/
- 0x00,0x00,0x00,0x78,0x84,0x84,0x84,0x8C,0x74,0x04,0x88,0xF0,0x00,0x00,},
- {/*-- 文字: 电 --*/
- /*-- 宋体11; 此字体下对应的点阵为:宽x高=14x14 --*/
- /*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/
- 0x02,0x00,0x02,0x00,0x02,0x00,0x7F,0xF0,0x42,0x10,0x42,0x10,0x7F,0xF0,0x42,0x10,
- 0x42,0x10,0x7F,0xF0,0x42,0x00,0x02,0x08,0x02,0x08,0x01,0xF8,},
- {/*-- 文字: 子 --*/
- /*-- 宋体11; 此字体下对应的点阵为:宽x高=14x14 --*/
- /*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/
- 0x7F,0xF0,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0xFF,0xF8,0x02,0x00,
- 0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x0E,0x00,
- },
- {/*-- 文字: 1 --*/
- /*-- 宋体11; 此字体下对应的点阵为:宽x高=7x14 --*/
- /*-- 宽度不是8的倍数,现调整为:宽度x高度=8x14 --*/
- 0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,},
- {/*-- 文字: 班 --*/
- /*-- 宋体11; 此字体下对应的点阵为:宽x高=14x14 --*/
- /*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/
- 0x01,0x00,0xF9,0x78,0x21,0x20,0x25,0x20,0x25,0x20,0xFD,0x20,0x25,0x78,0x25,0x20,
- 0x29,0x20,0x21,0x20,0x3A,0x20,0xE2,0x20,0x04,0xF8,0x08,0x00,}
- };
- void delayus(uchar x)
- {
- while(--x)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- uchar read_status()//读状态
- {
- uchar status;
- rd=0; //读选通信号
- wr=1;/
- ce=0;//片选信
- cd=1;//指令信号
- status=P0;/
- return status;/
- }
- void status_check()//检查状态,如果读状态后返回的值后两位为1,则退出检测状态,否则,需等待;要更改状态检测条件,只需改0x03
- {
- uchar s;
- while((s&0x03)!=0x03)//按位与,再和0x03相匹配,若一致,则退出检测
- s=read_status();
- }
- void data_write(uint data1)
- {
- rd=1;//读选通信号失效
- cd=0;//通道选择数据
- ce=0;//启动控制芯片
- wr=0;//写信号有效
- P0=data1;
- delayus(10);
- wr=1;//关写信号
- ce=1;//芯片关闭
- cd=1;//指令信号
- }
- void command_write(uchar command)//写信号函数
- {
- rd=1;//读选通信号失效
- cd=1;//选择指令通道
- wr=0;//写信号
- ce=0;//启动控制芯片
- P0=command;
- delayus(10);
- wr=1;//貌似每次冬眠一次
- ce=1;
- cd=0;
- }
- void command_sending_with_one_data(uchar data1,uchar command)//先送参数,再送指令
- {
- status_check();//检查状态
- data_write(data1);//写入数据
- status_check(); //再检查一次状态
- command_write(command);//写入命令
- }
- void command_sending_with_two_data(uint data1,uint data2,uchar command)
- {
- status_check();
- data_write(data1);
- status_check();
- data_write(data2);
- status_check();
- command_write(command);
- }
- void display_HZ(uchar x,uint y,uchar *hz)///x 0-3 y 0-7位置指定,汉字指针
- {
- uint add_init,add;
- uchar i,j=0;
- add_init=y*16;
- i=0;
- for(j=add_init;j<add_init+16;j++) //规定显示在第一行,前面已经定义了16字节/每行,这个循环其实就是j=0;j<16;j++
- {
- add=j*16+x*2;
- command_sending_with_two_data(add%256,add/256,0x24);//地址指针设置 低地址,高地址,命令设置地址指针,就是字符在液晶屏的位置
- command_sending_with_one_data(hz[i++],0xc0);
- command_sending_with_one_data(hz[i++],0xc0);
- }
- }
- void display_SZ(uchar x,uint y,uchar *hz)///x 0-3 y 0-7位置指定,数字指针
- {
- uint add_init,add;
- uchar i,j=0;
- add_init=y*16;
- i=0;
- for(j=add_init;j<add_init+16;j++) //规定显示在第一行,前面已经定义了16字节/每行,这个循环其实就是j=0;j<16;j++
- {
- add=j*16+x*2;
- command_sending_with_two_data(add%256,add/256,0x24);//地址指针设置 低地址,高地址,命令设置地址指针,就是字符在液晶屏的位置
- command_sending_with_one_data(hz[i++],0xc0);
- }
- }
-
- /* 数据自动写清屏 */
- void chear_screen()
- {
- uint i,j;
- command_sending_with_two_data(0x00,0x00,0x24);//图形模式下,位地址指针设置命令0x24,设为0x0000初地址
- status_check();//检查状态
- for(i=0;i<64;i++) //总共要写清64行
- {
- command_sending_with_two_data((i*16)%256,(1*16)/256,0x24); //指定每一行的首地址
- status_check();//检查状态
- command_write(0xb0); //数据自动写,每写一次,地址指针加一
- for(j=0;j<16;j++) //每一行128个字/像素,128/8=16字节
- {
- status_check();//检查状态
- data_write(0x00);
-
- }
- command_write(0xb2); //自动写结束
- }
- }
- void init_12864()
- {
- wr=1;//读失效
- rd=1;//写失效
- ce=1;//片选信号无
- cd=1;//指令信号
- rst=1;//不复位
- status_check();//检查状态
- command_sending_with_two_data(0x01,0x00,0x21); //光标指针设置,前两位子节为该单元地址的高位和地位,后一个字节为指令代码,然而后面并没有开光标显示。
- status_check(); //地址指针在开始写字的时候才进行设置
- command_sending_with_two_data(0x00,0x00,0x42); //设置图形显示首地址 GDRAM,第三个字节表明选择图像区首址功能,前两个字节为地址高位低位,不懂
- status_check();
- command_sending_with_two_data(16,0x00,0x43); //设置图形区域大小,第三位字节表明选择图像区宽度(字节数/每行)16为字节数,参考字模数组0x00为00H,固定化
- status_check();
- command_write(0x80); //模式设置,正常显示,不懂
- status_check();
- command_write(0x98); //显示设置,文本关闭,图形显示
- status_check();
- command_write(0xa0); //光标设置10100N2,N1,N0
- chear_screen(); //清屏
- }
-
- void main()
- {
- uchar i=0;
- init_12864();
- for(i=0;i<3;i++)
- display_HZ(2+i,0,HZ0[i]);//第0行,第i+1列
- display_SZ(1,1,HZ1[0]);//0
- display_SZ(2,1,HZ1[1]);//9
- display_HZ(3,1,HZ1[2]);//电
好想是发送数据坐标出了点问题吧,你找仔细查查
12864不是能直接显示汉字吗?
建议你换个其他的Lcd12864用!
command_sending_with_two_data(add%256,add/256,0x24);//地址指针设置 低地址,高地址,命令设置地址指针,就是字符在液晶屏的位置
command_sending_with_one_data(hz[i++],0xc0);
command_sending_with_one_data(hz[i++],0xc0);
这里在添加一句看看
HZ0[3][35]这一行代码出现问题,给数组分配了35列,实际只用了32,后面位自动补充0。