/***************************************************************************************************
工程名稱: 1602自造字
功能描述: 實現1602液晶顯示,液晶第一行顯示" Welcome ",第二行顯示" BV4WD "。
自造字「向上箭頭」「順時鐘旋轉」圖樣,放在第一行兩側
第1个~第8个CGRAM地址分别时40H,48H,50H,58H,60H,68H,70H,78H
維護記錄: 2012-7-2
***************************************************************************************************/
#include <pic.h> //頭文件在HI-TECH安裝目錄下\HI-TECH Software\PICC\std\9.60\include
#define uchar unsigned char
#define uint unsigned int
#define rs RD5 //命令/數據選擇
#define rw RD4 //讀寫口
#define e RD3 //鎖存控制
#define Dataport PORTB //數據口定義
uchar dis1[18]={" Welcome "}; //顯示兩行
uchar dis2[18]={" BV4WD "};
char wod1[8];
//***********************************************************************************
//延時
//***********************************************************************************
void delay(uint time)
{
uint i,j;
for(i = 0;i < time; i++)
{
for(j = 0;j < 30; j++);
}
}
//***********************************************************************************
//IO初始化操作
//***********************************************************************************
void IO_init(void)
{
TRISB=0x00; //RB設置為輸出
PORTB=0xff; //初始化為高
TRISD=0x00; //RD設置為輸出
PORTD=0xff; //初始化為高
}
//**************************************************************************************************
//向LCD寫一命令
//**************************************************************************************************
wcode(uchar t)
{
rs=0; // 寫的是命令
rw=0; // 寫狀態
e=1; //使能
Dataport=t; //寫入命令
delay(20); //等待寫入,如果時間太短,會導致液晶無法顯示
e=0; //數據的鎖定
}
//**************************************************************************************************
//向LCD寫一數據
//**************************************************************************************************
wdata(uchar t)
{
rs=1; // 寫的是數據
rw=0; // 寫狀態
e=1; //使能
Dataport=t; //寫入數據
delay(20); //等待寫入,如果時間太短,會導致液晶無法顯示
e=0; //數據的鎖定
}
//**************************************************************************************************
//寫入自造字 第一字 / 第二字
//**************************************************************************************************
w_oneword(void)
{
uchar i;
//****** word 1 ****
wod1[0]=0b00000100;
wod1[1]=0b00001110;
wod1[2]=0b00010101;
wod1[3]=0b00010101;
wod1[4]=0b00000100;
wod1[5]=0b00000100;
wod1[6]=0b00000100;
wod1[7]=0b00000000;
wcode(0x40); //设定自定义字符的CGRAM地址//第1个~第8个CGRAM地址分别时40H,48H,50H,58H,60H,68H,70H,78H
for(i=0;i<8;i++) //循環8次,寫完1一個字
{
wdata(wod1[i]); //寫入該行數據
}
//****** word 2 ****
wod1[0]=0b00001110;
wod1[1]=0b00010001;
wod1[2]=0b00000101;
wod1[3]=0b00001001;
wod1[4]=0b00011111;
wod1[5]=0b00001000;
wod1[6]=0b00000100;
wod1[7]=0b00000000;
wcode(0x48); //設置第二字寫入地址
for(i=0;i<8;i++) //循環8次,寫完1一個字
{
wdata(wod1[i]); //寫入該行數據
}
}
//**************************************************************************************************
//LCD顯示第一行
//**************************************************************************************************
xian1(void)
{
uchar i;
wcode(0x80); //設置第一行顯示地址
for(i=0;i<16;i++) //循環16次,寫完1行
{
wdata(dis1[i]); //寫入該行數據
}
}
//**************************************************************************************************
//LCD顯示第二行
//**************************************************************************************************
xian2(void)
{
uchar i;
wcode(0xc0); //設置第二行顯示地址
for(i=0;i<16;i++) //循環16次,寫完1行
{
wdata(dis2[i]); //寫入該行數據
}
}
//**************************************************************************************************
//LCD 初始化
//**************************************************************************************************
InitLCD(void)
{
wcode(0x01); //清屏
wcode(0x06); //輸入方式控制,增量光標不移位
wcode(0x0e); //顯示開關控制
wcode(0x38); //功能設定:設置16x2顯示,5x7顯示,8位數據接口
}
//**************************************************************************************************
//主函數
//**************************************************************************************************
main()
{
__CONFIG(XT&WDTDIS&LVPDIS);//配置,設置為晶振XT方式振蕩,禁看門狗,禁低電壓編程
IO_init(); //IO初始化
InitLCD(); //初始化1602
w_oneword();
while(1) //進入while死循環
{
wcode(0x01); //清屏
dis1[0]=0b00000000;
dis1[15]=0b00000001;
xian1(); //顯示第一行
xian2(); //顯示第二行
delay(5000); //延時
}
}