LCD
显示特殊字符时候(天线形式)其他区域也回出现乱点,不知道怎么解决???
源程序如下(主函数):
#include
#include "derivative.h"
#include "LLD_LCD.h"
#include "LLD_KEY.h"
void PerphInit()
{
SOPT1 = 0x00; //关闭看门狗
MCGC1 = 0xB8;
MCGC1_IRCLKEN = 1; //开启参考时钟,TRIM微调量没有设置
MCGC2 = 0x36;
MCGC3 = 0x00; //PLLS=0
while(!(MCGSC&0x02));
}
void tianxian(void)//显示天线形
{
LcdCommand(0x36);
LcdCommand(0x80);//垂直地址范围
LcdCommand(0x80);//水平地址范围
LcdDataWrite(0x80);
LcdCommand(0x81);//垂直地址范围
LcdCommand(0x80);//水平地址范围
LcdDataWrite(0x2a);
LcdCommand(0x82);//垂直地址范围
LcdCommand(0x80);//水平地址范围
LcdDataWrite(0x1c);
LcdCommand(0x83);//垂直地址范围
LcdCommand(0x80);//水平地址范围
LcdDataWrite(0x08);
LcdCommand(0x84);//垂直地址范围
LcdCommand(0x80);//水平地址范围
LcdDataWrite(0x08);
LcdCommand(0x85);//垂直地址范围
LcdCommand(0x80);//水平地址范围
LcdDataWrite(0x08);
LcdCommand(0x86);//垂直地址范围
LcdCommand(0x80);//水平地址范围
LcdDataWrite(0x08);
LcdCommand(0x87);//垂直地址范围
LcdCommand(0x80);//水平地址范围
LcdDataWrite(0x08);
LcdCommand(0x88);//垂直地址范围
LcdCommand(0x80);//水平地址范围
LcdDataWrite(0x08);
LcdCommand(0x88);//垂直地址范围
LcdCommand(0x70);//水平地址范围
LcdDataWrite(0x07);*/
}
//======主函数=====
void main(void)
{
PerphInit(); //外围初始化
LCD_Init(); //液晶...
EnableInterrupts;
CLR_Screen();
while(1)
{ uchar key = 0x00; //按键标志符赋初值
do {
key = Get_Key(); //读取按键
}while(!key);
switch(key)
{
case UP:
CLR_Screen();
DisplayChar(0,0,"发送中...");
break;
case DOWN:
CLR_Screen();
DisplayChar(0,0,"接收中...");
break;
case BACK:
tianxian(); //天线字形
Delay(1000);
break;
default:
break;
} //end switch
}//end while
}
要让LCD1602显示自定义字符,就得用到CGRAM指令,CGROM字码表中最左边16字节是自定义CGRAM,实际只有8个字节可用.它的字符码是00H---07H这8个地址,从指令表看可以看到RS=0;RW=0;DB7与DB6分别为01,只有DB0--DB6 六位为地址为,DB6 DB5 DB4都为0代表这8个自定义字符,后3位是8个字模数据的地址;
CGRAM地址: 01000000 0x40 首地址,代表字模数据从第一行开放入
01000001 0x41 从第二行开始,上一行空出来
01000010 0x42
01000011 0x43
01000100 0x44
01000101 0x45
01000110 0x46
01000111 0x47
举例说明:我们向这8个字节写入字模数据,显示个"日"字;如果CGRAM地址设置为0x40:则"日"字的第一行就是从8行最上面开始写,即0x1f就是放到了最上面
如果开始设置CGRAM地址写入0x41:这样的话"日"字的第一行就放在了8行的第二行
//LCD1602显示自定义字符测试程序
//STC89C52RC 12MHz
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P3^5;//1602数据命令选择线
//sbit rw=P3^6;rw=0;rw直接接GND 一直写不读
sbit en=P3^4;//1602使能控制线/*P0口接1602的D0-D7********************/
uchar code table[]={
0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00, //℃,代码 0x00
0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00, //一,代码 0x01
0x00,0x00,0x00,0x0e,0x00,0xff,0x00,0x00, //二,代码 0x02
0x00,0x00,0xff,0x00,0x0e,0x00,0xff,0x00, //三,代码 0x03
0x00,0x00,0xff,0xf5,0xfb,0xf1,0xff,0x00, //四,代码 0x04
0x00,0xfe,0x08,0xfe,0x0a,0x0a,0xff,0x00, //五,代码 0x05
0x00,0x04,0x00,0xff,0x00,0x0a,0x11,0x00, //六,代码 0x06
0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00, //日,代码 0x07
};
void delay(uint t) //延时函数 用延时函数代替忙检测
{
uint x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}/*********************************************/
void lcd_wcom(uchar com) //1602写命令函数
{
rs=0;
//rw=0;
P0=com;
delay(5);
en=1;
en=0;
}
void lcd_wdat(uchar dat)//1602写数据函数
{
rs=1;
//rw=0;
P0=dat;
delay(5);
en=1;
en=0;
}void lcd_init()
{
lcd_wcom(0x38);//8位数据,5*8字形
lcd_wcom(0x0c);//开启显示屏,关光标,光标不闪烁
lcd_wcom(0x06);//显示地址递增,即写一个数据后,显示位置右移一位
lcd_wcom(0x01);//清屏
}
void main()
{
uchar i;
lcd_init();
lcd_wcom(0x40);//设置CGRAM地址,设置为00处,从8行中第一行开始 ①第一步设置CGRAM地址
for(i=0;i<64;i++)//写入数组中数据 ②装入数组里要显示的数据
{
lcd_wdat(table);
}
lcd_wcom(0x80); //设置字符显示位置 第一行第一个位置 ③设置显示地址,然后发送数据 lcd_wdat(0x00); //给1602发送字符数据 显示℃
delay(5);
lcd_wcom(0x81);
lcd_wdat(0x01); // 显示"一"
delay(5);
lcd_wcom(0x82); lcd_wdat(0x02); //显示"二"
delay(5);
lcd_wcom(0x83);
lcd_wdat(0x03); //显示"三"
delay(5);
lcd_wcom(0x84);
lcd_wdat(0x04); //显示"四"
delay(5);
lcd_wcom(0x85);
lcd_wdat(0x05); //显示"五"
delay(5);
lcd_wcom(0x86);
lcd_wdat(0x06); //显示"六"
delay(5);
lcd_wcom(0x87);
lcd_wdat(0x07); //显示"日"
delay(5);
while(1);
}