LCD
顯示特殊字符時候(天線形式)其他區(qū)域也回出現(xiàn)亂點,不知道怎么解決???
源程序如下(主函數(shù)):
#include
#include "derivative.h"
#include "LLD_LCD.h"
#include "LLD_KEY.h"
void PerphInit()
{
SOPT1 = 0x00; //關(guān)閉看門狗
MCGC1 = 0xB8;
MCGC1_IRCLKEN = 1; //開啟參考時鐘,TRIM微調(diào)量沒有設(shè)置
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);*/
}
//======主函數(shù)=====
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,"發(fā)送中...");
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字節(jié)是自定義CGRAM,實際只有8個字節(jié)可用.它的字符碼是00H---07H這8個地址,從指令表看可以看到RS=0;RW=0;DB7與DB6分別為01,只有DB0--DB6 六位為地址為,DB6 DB5 DB4都為0代表這8個自定義字符,后3位是8個字模數(shù)據(jù)的地址;
CGRAM地址: 01000000 0x40 首地址,代表字模數(shù)據(jù)從第一行開放入
01000001 0x41 從第二行開始,上一行空出來
01000010 0x42
01000011 0x43
01000100 0x44
01000101 0x45
01000110 0x46
01000111 0x47
舉例說明:我們向這8個字節(jié)寫入字模數(shù)據(jù),顯示個"日"字;如果CGRAM地址設(shè)置為0x40:則"日"字的第一行就是從8行最上面開始寫,即0x1f就是放到了最上面
如果開始設(shè)置CGRAM地址寫入0x41:這樣的話"日"字的第一行就放在了8行的第二行
//LCD1602顯示自定義字符測試程序
//STC89C52RC 12MHz
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P3^5;//1602數(shù)據(jù)命令選擇線
//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) //延時函數(shù) 用延時函數(shù)代替忙檢測
{
uint x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}/*********************************************/
void lcd_wcom(uchar com) //1602寫命令函數(shù)
{
rs=0;
//rw=0;
P0=com;
delay(5);
en=1;
en=0;
}
void lcd_wdat(uchar dat)//1602寫數(shù)據(jù)函數(shù)
{
rs=1;
//rw=0;
P0=dat;
delay(5);
en=1;
en=0;
}void lcd_init()
{
lcd_wcom(0x38);//8位數(shù)據(jù),5*8字形
lcd_wcom(0x0c);//開啟顯示屏,關(guān)光標,光標不閃爍
lcd_wcom(0x06);//顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位
lcd_wcom(0x01);//清屏
}
void main()
{
uchar i;
lcd_init();
lcd_wcom(0x40);//設(shè)置CGRAM地址,設(shè)置為00處,從8行中第一行開始 ①第一步設(shè)置CGRAM地址
for(i=0;i<64;i++)//寫入數(shù)組中數(shù)據(jù) ②裝入數(shù)組里要顯示的數(shù)據(jù)
{
lcd_wdat(table);
}
lcd_wcom(0x80); //設(shè)置字符顯示位置 第一行第一個位置 ③設(shè)置顯示地址,然后發(fā)送數(shù)據(jù) lcd_wdat(0x00); //給1602發(fā)送字符數(shù)據(jù) 顯示℃
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);
}