微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 谁能看看,LCD1206为什么乱码啊,

谁能看看,LCD1206为什么乱码啊,

时间:10-02 整理:3721RD 点击:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar table[]={"X:"};
uchar table1[]={"Y:"};
sbit rs=P2^5;//数据命令选择端         RS寄存器选择,RS=1数据寄存器,RS=0指令寄存器
sbit rw=P2^6;
sbit en=P2^7;//使能端         en为低电平时液晶屏开始执行命令。
uchar num,num1,x1,y1;
uchar a,b;
void delay(uint n)//延时程序
{
while(n>0) n--;
}
bit Busy(void)
{
bit busy_flag = 0;
rs = 0;
rw = 1;
en = 1;
delay(5);
busy_flag = (bit)(P0 & 0x80);
en = 0;
return busy_flag;
}
void write_com(uchar com) //液晶写命令程序
{
while(Busy());
rw=0;
rs=0;//等0输入是命令
en=0;//液晶使能信号初始化
delay(10);
P0=com;//把com参数,液晶的命令值送到P0口
delay(10);//延时,按照液晶时序图要的要求
en=1;//使能信号,0到1表示上升沿打开可以写命令数据到液晶里
delay(10);
en=0;//使能信号恢复0
}
void write_data(uchar date) //液晶写数据程序
{
while(Busy());
rs=1; //等1表示输入是数据
rw=0;
en=0;
delay(10);
P0=date; //把date参数,液晶的数据送到P0口;
delay(10);
en=1;
delay(10);
en=0;
}
void init() //液晶初始化程序
{
en=0;
delay(50);
write_com(0x38); //0x38是按照液晶文档说明写    0011 1000                 显示模式设置:设置为16*2显示,5*7点阵,8位数据接口
delay(50);
write_com(0x0c);                                                          //0000        1100                 显示开关及光标设置,开显示,不显示光标,光标不闪烁
delay(10);
write_com(0x06);                                                         //0000        0110                 输入模式设置,光标右移,文字不移动
delay(10);
write_com(0x01);                                                         //0000        0001                液晶全清屏指令
}
void convertx()
{
uint temp;
temp=x1;
table[8]=(temp/100)+'0'; //液晶第9位字符为坐标的百位数,例如120度的1
table[9]=((temp/10)%10)+'0'; //液晶的第10位字符为坐标的十位,例如2
table[10]=(temp%10)+'0';         //液晶的第11位字符为坐标的个位,例如0
}
void converty()
{
uint tem;
tem=y1;
table1[8]=(tem/100)+'0'; //液晶第9位字符为坐标的百位数,例如120度的1
table1[9]=((tem/10)%10)+'0'; //液晶的第10位字符为坐标的十位,例如2
table1[10]=(tem%10)+'0';         //液晶的第11位字符为坐标的个位,例如0
}
void main()
{
x1=0xb5;
y1=0xb2;
delay(30);  
init();
convertx();
//液晶的第一行开始地址
for(num=0;num<16;num++) //显示16位数据,后面的几位没有用到就不写到16,以免后面的几位会出现一个随机数据显示乱码
{a=0x80+num;
write_com(a);  
write_data(table[num]); //液晶需要显示的内容
}
converty();
for(num1=0;num1<16;num1++) //显示16位数据,后面的几位没有用到就不写到16,以免后面的几位会出现一个随机数据显示乱码
{b=0xc0+num1;
write_com(b);
write_data(table1[num1]); //液晶需要显示的内容
}
while(1);
}


从图上看 字母和数字可以显示  那么你屏蔽Y的字符  先从X查起来

先显示一个点试试,在固定的坐标上显示.

我分别屏蔽了X和Y之后就成了这样。屏蔽了Y后能显示出数来,但是屏蔽了X后显示的就是Y跑到了第一行,数在第二行。


屏蔽X后,显示Y在第一行,数在第二行


把X后面的:换成:(全角)
问题出在:上,液晶会把半角的:转成全角的:但是它是按照汉字处理,首地址必须是偶数0,2,4之类的。你看看液晶上的:占几个格

在x后面加空格 x :或者在x前面加空格试试

试了,没效果啊,依然是X的值与Y的值是混着显的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top