液晶屏12864显示的字库字为2个一样的
实际测试结果是显示的字是每2个是同一个字,高地址的下的16个字只显示出来了,低地址的双数地址的字,只显示了0x02,0x04,0x06等的汉字显示如下,不知道是为什么邦指点下,在显示半宽字符时也是一样的
啊啊埃埃哎哎衷衷癌癌矮矮碍碍隘隘
/*
**12864并行接口参考程序,控制器st7920
*/
#include <reg51.h>
#include <intrins.h>
sbit RS = P3^5;//H代表数据,L代表指令
sbit RW = P3^4;//H读L写
sbit E = P3^3;//使能
//sbit PSB = P3^1;//串并口选择,高并行低串行
//sbit RES = P3^5;
sbit led=P3^6;//液晶屏0为亮
#define FIRST_ADDR 0 //定义字符/汉字显示起始位置
unsigned char invert(unsigned char a1)//需要传P1口值颠倒,电路连接是0-7,1-6,2-5……
{
unsigned char a3,a2;
for(a2=0;a2<7;a2++)
{
a1>>=1;
a3|=CY;
a3<<=1;
}
a1>>=1;
a3|=CY;
return a3;
}
//延时子程序
void delay(unsigned int t)
{ unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++)
;
}
//测忙
void chk_busy()
{ RS=0;
RW=1;
E=1;
while((P1&0x01)==0x01);//80
E=0;
}
//读数据
/*unsigned char lcdrd()
{ unsigned char i;
P3=0xFB;
_nop_();
E=1;
delay(5);
i=P1;
_nop_();
E=0;
return i;
}*/
//写数据
void lcdwd(unsigned char dispdata)
{ chk_busy();
_nop_();
RS=1;
RW=0;
E=1;
P1=invert(dispdata);
delay(5);
_nop_();
E=0;
_nop_();
P1=invert(0xff);
}
//写指令代码
void lcdwc(unsigned char cmdcode)
{ chk_busy();
_nop_();
RS=0;
RW=0;
E=1;
P1=invert(cmdcode);
delay(5);
_nop_();
E=0;
_nop_();
P1=invert(0xff);
}
//初始化
void lcdreset()
{ delay(2000);
//lcdwc(0x30); //选择基本指令集
lcdwc(0x30); //选择8bit数据流
delay(5);
lcdwc(0x0c); //开显示(无游标、不反白)
delay(5);
lcdwc(0x01); //清除显示,并且设定地址指针为00H
delay(5);
lcdwc(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
}
void hzklib()
{
unsigned char a1,a2;
a2=0xa0;
for(a1=0;a1<16;a1++)
{
lcdwd(0xb0);
lcdwd(a2);
a2++;
delay(3000);
}
}
main()
{ //unsigned char i;
//i=0x55;
//RES=0;
_nop_();
//RES=1;
led=0;
while(1)
{ //PSB=1;
RW=0;
lcdreset(); //初始化LCD屏
lcdwc(0x01);//清除显示,并且设定地址指针为00H
delay(1000);
hzklib();
delay(4000);
//i=~i;
}
}