LCD1602 畫(造)字

/***************************************************************************************************

工程名稱: 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); //延時

}

}