标题:
12864 7920芯片带中文字库显示实验 输出乱码
[打印本页]
作者:
Me.march
时间:
2019-5-19 09:29
标题:
12864 7920芯片带中文字库显示实验 输出乱码
//12864液晶的试验程序,驱动芯片为ST7920
//目标板为TS8900-M128
//驱动方式-并口
//J1,J15,J8短路块位于左侧
//调节RV1电位器调整对比度
//注意:因为厂家不同液晶的19脚和20脚(背光)有时会不同,导致背光不亮,需要注意。
#include <iom128v.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define RS (1<<0)
#define RW (1<<1)
#define EN (1<<2)
//延时函数
void s_ms(uint ms)
{
for(;ms>1;ms--);
}
//此处定义字符串
char text_1[]="液晶测试第一行";
char text_2[]="液晶测试第二行";
char text_3[]="液晶测试第三行";
char text_4[]="液晶测试第四行";
//写数据
void WriteDataLCM(unsigned char WDLCM)
{
//ReadStatusLCM(); //检测忙
s_ms(100);
PORTC|=RS; //RS=1
s_ms(100);
PORTC&=~RW; //RW=0
s_ms(100);
PORTC|=EN; //EN=1
s_ms(100);
PORTA=WDLCM; //输出数据
s_ms(100);
PORTC&=~EN; //EN=0
s_ms(100);
}
//写指令
void WriteCommandLCM(unsigned char WCLCM)
{
//ReadStatusLCM(); //根据需要检测忙
s_ms(100);
PORTC&=~RS; //RS=0
s_ms(100);
PORTC&=~RW; //RW=0
s_ms(100);
PORTC|=EN; //EN=1
s_ms(100);
PORTA=WCLCM; //输出指令
s_ms(100);
PORTC&=~EN; //EN=0
s_ms(100);
}
//读状态:检测忙
void ReadStatusLCM(void)
{
uchar temp;
uchar flag = 1;
while(flag==1)
{
DDRA=0x00; //端口B改为输入
PORTA=0xff;
s_ms(100);
PORTC&=~RS; //RS=0
s_ms(100);
PORTC|=RW; //RW=1
s_ms(100);
PORTC|=EN; //EN=1
s_ms(1000);
temp = PINA; //读端口B
s_ms(1000);
DDRA=0xff; //端口B改为
s_ms(100);
PORTC&=~EN; //EN=0
s_ms(100);
if(temp>>7==0)
flag = 0;
}
}
//LCM初始化
void LCMInit(void)
{
WriteCommandLCM(0x38); //三次显示模式设置,不检测忙信号
s_ms(1000);
WriteCommandLCM(0x38);
s_ms(1000);
WriteCommandLCM(0x38);
s_ms(1000);
WriteCommandLCM(0x38); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08); //关闭显示
WriteCommandLCM(0x01); //显示清屏
WriteCommandLCM(0x06); //显示光标移动设置
WriteCommandLCM(0x0C); //显示开及光标设置
}
//按指定位置显示一串字符
//液晶显示:汉字为16*16,字母及数字为8*16,此次显示的文本
// 从第一行第一列开始,依次向左,如果想在不同的
// 位置显示,只需修改相应的行值即可。液晶显示
// 完毕后,转入语音文本发送。
//DisplsyList(X,DData)函数:X为0x80在第一行显示;X为0x90在
// 第二行显示;X为0x88在第三行显示;X为0x98在
// 第四行显示;DData为显示数组。
void DisplayList(unsigned char X,char *DData)
{
unsigned char length;
unsigned char i=0;
char *p;
p = DData;
length = strlen(p);
WriteCommandLCM(0x08);
WriteCommandLCM(X);
WriteCommandLCM(0x06);
WriteCommandLCM(0x0C);
WriteCommandLCM(X);
for(i=0;i<length;i++)
{
WriteDataLCM(DData[i]);
i++;
WriteDataLCM(DData[i]);
}
}
//主函数
void main(void)
{
//端口初始化
DDRA=0xff;
PORTA=0xff;
DDRC=0xff;
PORTC=0xff;
DDRD=0xff;
PORTD=0x00;
s_ms(200);
s_ms(200);
LCMInit(); //LCM初始化 //液晶初始化
DisplayList(0x80,text_1); //显示第一行
DisplayList(0x90,text_2); //显示第二行
DisplayList(0x88,text_3); //显示第三行
DisplayList(0x98,text_4); //显示第四行
while(1);
}
复制代码
作者:
75535451
时间:
2019-5-19 11:23
感谢楼主分享
作者:
春风十里吹
时间:
2019-5-19 11:26
输出乱码多数不是这个问题,多数是在输英文与数字时间距没处理好,汉字是16*16,输英文与数字是8*16,而12864没有做8*16的函数库,所以要自己做,网上有别人做好的库可拿来用。另外仿真与实物也完全不同,仿真有左右屏CS1 & CS2,实物少用。
作者:
积分呢
时间:
2019-5-19 15:09
先在网上找找有没有现成的参考代码把,从0开始很麻烦,也没有必要
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1