arduino 连接LCD显示汉字,汉字乱码,英文数字正常显示

老孟家的孩子 2017-12-14 04:24:13

//宏定义引脚
#define rs A0
#define rw A1
#define en A2
#define psb A3
#define D4 3
#define D5 9
#define D6 10
#define D7 11

unsigned char z,z1,d,d1,s,s1,s10,s100,m1;
//汉字,直接可以写入字形,写入标点符号后要加空格键
unsigned char uctech[] = {"欢迎您来到绘晶科技"};
//显示在第1,3行
unsigned char uctech3[] = {"完全兼容1602的模块"};
//显示在第2,4行
unsigned char uctech6[] = {"1602字符模块升级版"};
//显示在第1,3行
unsigned char uctech7[] = {"HJ14432A 9*2行汉字"};
//显示在第2,4行
unsigned char uctech1[] = {" HUIJINGKEJI"};
//显示在第2行
unsigned char uctech2[] = {" 144*32 DOT"};
//显示在第3行
unsigned char uctech4[] = {"TIME"};
unsigned char uctech5[] = {"绘晶科技23146001"};
unsigned char uctech8[] = {"有8192个中文字型"};
unsigned char uctech9[] = {"有126 个字母符号"};

unsigned char str[] = {0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,
0x04,0x03,0x00,0xFF,0x00,0x83,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00};
void RDBF(void)
{
unsigned char temp;

digitalWrite(rs,LOW);
digitalWrite(rw,HIGH);

while(1)
{
// P1=0xFF; //数据线为输入
digitalWrite(en,HIGH);
// temp=P1;
digitalWrite(en,LOW);
if ((temp & 0x80) ==0) break;
}
}


//发送数据,先发高四位,再发第四位
void lcd_WritData(uint8_t value)
{
RDBF();
byte d=0;
digitalWrite(rs,1);
digitalWrite(rw,0);
d=value & 0x80;
digitalWrite(D7,d);
d=value & 0x40;
digitalWrite(D6,d);
d=value & 0x20;
digitalWrite(D5,d);
d=value & 0x10;
digitalWrite(D4,d);
digitalWrite(en,1);
digitalWrite(en,0);


digitalWrite(rs,1);
digitalWrite(rw,0);
d=value & 0x08;
digitalWrite(D7,d);
d=value & 0x04;
digitalWrite(D6,d);
d=value & 0x02;
digitalWrite(D5,d);
d=value & 0x01;
digitalWrite(D4,d);
digitalWrite(en,1);
digitalWrite(en,0);
}
//发送命令指令
void lcd_WriteComn(uint8_t value)
{
RDBF();
byte d=0;

digitalWrite(rs,0);
digitalWrite(rw,0);


d=value & 0x80;
digitalWrite(D7,d);
d=value & 0x40;
digitalWrite(D6,d);
d=value & 0x20;
digitalWrite(D5,d);
d=value & 0x10;
digitalWrite(D4,d);
digitalWrite(en,1);
digitalWrite(en,0);
digitalWrite(rs,0);
digitalWrite(rw,0);
d=value & 0x08;
digitalWrite(D7,d);
d=value & 0x04;
digitalWrite(D6,d);
d=value & 0x02;
digitalWrite(D5,d);
d=value & 0x01;
digitalWrite(D4,d);
digitalWrite(en,1);
digitalWrite(en,0);
}
//addr为汉字显示位置,*hanzi汉字指针;count为输入汉字串字符数
void ShowQQCharH(unsigned char addr,unsigned char *hanzi, unsigned char count)
{
unsigned char i;
lcd_WriteComn(addr); //设定DDRAM地址
for(i=0;i<count;)
{
lcd_WritData(hanzi[i*2]);
lcd_WritData(hanzi[i*2+1]);
i++;
}
}
///addr为半宽字符首个地址,i为首个半宽字符代码,count为需要输入字符个数
void ShowNUMCharH(unsigned char addr,unsigned char i,unsigned char count)
{
unsigned char j;
for(j=0;j<count;)
{
lcd_WriteComn(addr); //设定DDRAM地址
lcd_WritData(i+j);//必为两个16*8位字符拼成一个16*16才能显示
j++;
lcd_WritData(i+j);
addr++;
j++;
}
}
//自定义字符写入CGRAM
//data1是高八位,data2是低八位,一存必须存两个字节,横向存两字节,后纵向累加,共16行
//一个自定义字符为16*16点阵
//第一个存入字节为从40H开始,到4F结束为第一个自定义汉字符, 之后调出地址从8000H为始第一个
//addr为存入头地址
void WRCGRAMH(unsigned char data1,unsigned char data2,unsigned char addr)
{
unsigned char i;
for(i=0;i<16;)
{
lcd_WriteComn(addr+i); //设定CGRAM地址
lcd_WritData(data1);
lcd_WritData(data1);
i++;
lcd_WriteComn(addr+i); //设定CGRAM地址
lcd_WritData(data2);
lcd_WritData(data2);
i++;
}
}

//自定义字符写入CGRAM
//显示上半屏自定义的字符,并把这个字符填满全屏16*16
//addr为显示地址,把自定义字符当一个汉字调出,从8000H开始为第一个,
//8100H为第二个,8200H为第三个,8300H为第四个,中文字库只能自定义四个字符
//i为自定义字符调出地址,先输入低位,再输入高位
//IC决定,中文字库类,一个IC最多只能显示16*2个汉字
void ShowCGCharH(unsigned char addr,unsigned char i)
{
unsigned char j;
for(j=0;j<0x20;)
{
lcd_WriteComn(addr+j); //设定DDRAM地址
lcd_WritData(0x00);//字符地址低八位
lcd_WritData(i);//字符地址高八位
j++;
}
}
void WRGDRAM128X9(unsigned char x1,unsigned char y1,unsigned char d1 )
{
unsigned char j,i;
lcd_WriteComn(0x34); //去扩展指令寄存器
lcd_WriteComn(0x36); //打开绘图功能
for(j=0;j<16;j++) //
{
lcd_WriteComn(0x80+y1+j); //Y总坐标,即第几行
lcd_WriteComn(0x80+x1); //X坐标,即横数第几个字节开始写起,80H为第一个字节
for(i=0;i<9;i++) //写入一行
{
lcd_WritData(d1);
lcd_WritData(d1);
}
}
}

//上半屏清除图形区数据
void CLEARGDRAMH(unsigned char c)
{
unsigned char j;
unsigned char i;
lcd_WriteComn(0x34);
lcd_WriteComn(0x36);
for(j=0;j<32;j++)
{
lcd_WriteComn(0x80+j);
lcd_WriteComn(0x80);//X坐标
for(i=0;i<16;i++)//
{
lcd_WritData(c);
lcd_WritData(c);
}
}
}

void WRGDRAM1(unsigned char x,unsigned char l,unsigned char r )
{

unsigned char j;
unsigned char i;
lcd_WriteComn(0x24); //去扩展指令寄存器
lcd_WriteComn(0x36); //打开绘图功能
//两横的上边框 下边框
for(j=0;j<2;j++) //2行
{
lcd_WriteComn(0x80+j); //Y总坐标,即第几行
lcd_WriteComn(0x80); //X坐标,即横数第几个字节开始写起,80H为第一个字节
for(i=0;i<9;i++) //写入一行
{
lcd_WritData(x);
lcd_WritData(x);
}
lcd_WriteComn(0x80+30+j); //Y总坐标,即第几行
lcd_WriteComn(0x80); //X坐标,即横数第几个字节开始写起,80H为第一个字节
for(i=0;i<9;i++) //写入一行
{
lcd_WritData(x);
lcd_WritData(x);
}
}
//上半屏两横的右左边框
for(j=2;j<30;j++) //30行 左
{ //先上半屏
lcd_WriteComn(0x80+j); //Y总坐标,即第三行开始
lcd_WriteComn(0x80); //X坐标,即横数第几个字节开始写起,80H为第一个字节
lcd_WritData(l);
lcd_WritData(0x00);
lcd_WriteComn(0x80+j); //Y总坐标,即第三行开始
lcd_WriteComn(0x80+8); //X坐标,即横数第几个字节开始写起,80H为第一个字节
lcd_WritData(0x00);
lcd_WritData(r);
}


}



void lcd_Init()
{
digitalWrite(psb,1);
lcd_WriteComn(0x20);//四位bit,基本指令
delay(10);
lcd_WriteComn(0x03);//
delay(10);
lcd_WriteComn(0x0c);
delay(10);
lcd_WriteComn(0x01);//清屏显示
delay(10);
lcd_WriteComn(0x06);
delay(10);
}
//主函数
void setup() {
// put your setup here, to run once:
pinMode(rs,OUTPUT);
pinMode(rw,OUTPUT);
pinMode(en,OUTPUT);
pinMode(psb,OUTPUT);
pinMode(D4,OUTPUT);
pinMode(D5,OUTPUT);
pinMode(D6,OUTPUT);
pinMode(D7,OUTPUT);
RDBF();
lcd_Init();

delay(100);
ShowQQCharH(0x80,uctech4,2);//调用字库
ShowQQCharH(0x90,uctech,9);//显示'绘晶科技'
//ShowQQCharH(0x90,uctech9,8);//调用字库
//ShowQQCharH(0x88,uctech8,8);//调用字库
//ShowQQCharH(0x98,uctech5,8);//调用字库
for(z=0;z<10;z++)
{
lcd_WriteComn(0x80+2);//写地址
lcd_WritData(0x3a);
lcd_WritData(0x30+z); //分10
for(z1=0;z1<10;z1++)
{
lcd_WriteComn(0x80+3);//写地址
lcd_WritData(0x30+z1); //分10
lcd_WritData(0x3a);
for(d=0;d<6;d++)
{
for(d1=0;d1<10;d1++)
{
lcd_WriteComn(0x80+4);//写地址
lcd_WritData(0x30+d); //分10
lcd_WritData(0x30+d1); //分01
//lcd_WriteComn(0x10);
for(s=0;s<6;s++)
{
lcd_WriteComn(0x80+5);//写地址
lcd_WritData(0x3a);
lcd_WritData(0x30+s); //秒10

for(s1=0;s1<10;s1++)
{
lcd_WriteComn(0x80+6);//写地址
lcd_WritData(0x30+s1); //秒01
lcd_WritData(0x3a);
delay(5);////延时 x ms
//lcd_WriteComn(0x18);
for(s10=0;s10<10;s10++)
{
delay(5);////延时 x ms
for(s100=0;s100<10;s100++)
{
lcd_WriteComn(0x80+7);//写地址
lcd_WritData(0x30+s10);//100MS
lcd_WritData(0x30+s100);//10MS
delay(5);////延时 x ms
}
}
}
}
}
}
}
}

}

void loop() {
// put your main here, to run repeatedly:

}
...全文
1610 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdnmuzi 2018-10-29
  • 打赏
  • 举报
回复
请问下 怎样在arduino下用Nokia5110显示汉字和图片啊 超级感谢!
老孟家的孩子 2017-12-20
  • 打赏
  • 举报
回复
已经解决了。是汉字编码不对。
of123 2017-12-15
  • 打赏
  • 举报
回复
显示汉字,需要几个条件: 1 你的编译器支持汉字,也就是说,能够将汉字字符转为某种规范的编码。 2 你有合适的字库,且汉字编码能够正确对应特定汉字字型点阵数据的入口地址。 3 你的程序代码正确地取回了对应汉字的点阵数据,并用显示屏控制器支持的命令写入。

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧