LCD1602A的使用
/*************LCD1602A簡(jiǎn)介**********************************************
◆ 控制器接口說明(HD44780 及兼容芯片):
1 基本操作時(shí)序:
1.1 讀狀態(tài):輸入:RS=L,RW=H,E=H 輸出:D0~D7=狀態(tài)字
1.2 寫指令:輸入:RS=L,RW=L,D0~D7=指令碼,E=高脈沖輸出:無
1.3 讀數(shù)據(jù):輸入:RS=H,RW=H,E=H 輸出:D0~D7=數(shù)據(jù)
1.4 寫數(shù)據(jù):輸入:RS=H,RW=L,D0~D7=數(shù)據(jù),E=高脈沖輸出:無
2 狀態(tài)字說明
STA7 STA6 STA5 STA4 STA3 STA2 STA1 STA0
D7 D6 D5 D4 D3 D2 D1 D0
STA0-6 當(dāng)前數(shù)據(jù)地址指針的數(shù)值
STA7 讀寫操作使能 1: 禁止0: 允許
注:對(duì)控制器每次進(jìn)行讀寫操作之前,都必須進(jìn)行讀寫檢測(cè),確保STA7 為0
3 RAM 地址映射圖
控制器內(nèi)部帶有80X8 位(80字節(jié))的RAM緩沖區(qū),對(duì)應(yīng)關(guān)系如右圖所示:
4 指令說明
4.1 初始化設(shè)置
4.1.1 顯示模式設(shè)置
指令碼 功能
0 0 1 1 1 0 0 0 設(shè)置16X2 顯示,5X7 點(diǎn)陣,8 位數(shù)據(jù)接口
4.1.2 顯示開/關(guān)及光標(biāo)設(shè)置
指令碼 功能
0 0 0 0 1 D C B
D=1 開顯示; D=0 關(guān)顯示
C=1 顯示光標(biāo);C=0 不顯示光標(biāo)
B=1 光標(biāo)閃爍;B=0 光標(biāo)不閃爍
0 0 0 0 0 1 N S
N=1 當(dāng)讀或?qū)懸粋€(gè)字符后地址指針加一,且光標(biāo)加一
N=0 當(dāng)讀或?qū)懸粋€(gè)字符后地址指針減一,且光標(biāo)減一
S=1 當(dāng)寫一個(gè)字符,整屏顯示左移(N=1)或右移(N=0),以得到光標(biāo)不移動(dòng)而屏LCD幕移動(dòng)的效果。
S=0 當(dāng)寫一個(gè)字符,整屏顯示不移動(dòng)
4.2 數(shù)據(jù)控制
控制器內(nèi)部設(shè)有一個(gè)數(shù)據(jù)地址指針,用戶可通過它們來訪問內(nèi)部的全部 80 字節(jié)RAM。
4.2.1 數(shù)據(jù)指針設(shè)置
指令碼 功能
80H+ 地址碼( 0-27H ,40H-67H)設(shè)置數(shù)據(jù)地址指針
4.2.2 讀數(shù)據(jù):見1.3 節(jié)
4.2.3 寫數(shù)據(jù):見1.4 節(jié)
4.2.4 其他設(shè)置
指令碼 功能
01H 顯示清屏:1.數(shù)據(jù)指針清零
2.所有顯示清零
02H 顯示回車:1.數(shù)據(jù)指針清零
5 初始化過程(復(fù)位過程)
5.1 延時(shí)15ms
5.2 寫指令38H(不檢測(cè)忙信號(hào))
5.3 延時(shí)5ms
5.4 寫指令38H(不檢測(cè)忙信號(hào))
5.5 延時(shí)5ms
5.6 寫指令38H(不檢測(cè)忙信號(hào))
5.7 (以后每次寫指令、讀/寫數(shù)據(jù)操作之前均需檢測(cè)忙信號(hào))
5.8 寫指令38H:顯示模式設(shè)置
5.9 寫指令08H:顯示關(guān)閉
5.10 寫指令01H:顯示清屏
5.11 寫指令06H:顯示光標(biāo)移動(dòng)設(shè)置
5.12 寫指令0CH:顯示開及光標(biāo)設(shè)置
*********************************************************************/
//LCD1602的使用
//★★★★★★★★★L(fēng)CD1602的使用★★★★★★★★★★★\
//單片機(jī)型號(hào):PIC16F877A,LCD1602A
//功能描述:LCD循環(huán)顯不web和tel中的數(shù)據(jù)
//硬件要求:LCD直接與單片機(jī)的A口和D口相連接
#include
__CONFIG(0xf73a); //芯片配置字
#define rs RA1 //定義LCD1602數(shù)據(jù)/命令選擇端(H/L)
#define rw RA2 //定義LCD1602讀寫控制信號(hào)(H/L)
#define e RA3 //定義LCD1602使能信號(hào)
const char web[]={' ',' ','I',' ',' ','L','O','V','E',' ',' ','Y','O','U',' ',' ',' ',' ','I',' ',' ','L','O','V','E',' ',' ','Y','O','U',' ',' ',' ',' ','I',' ',' ','L','O','V','E',' ',' ','Y','O','U',' ',' '};
//要顯示的數(shù)據(jù)
const char tel[]={'t','e','l','0','7','5','5','-','2','8','1','8','7','9','7','5','t','e','l','0','7','5','5','-','2','8','1','8','7','9','7','5','t','e','l','0','7','5','5','-','2','8','1','8','7','9','7','5'};
//要顯示的數(shù)據(jù)
void init(); //申明I/O口初始化函數(shù)
void lcd_init(); //申明LCD初始化函數(shù)
void write_web(); //申明顯示web函數(shù)
void write_tel(); //申明顯示tel函數(shù)
void write(char X); //申明顯示1字節(jié)數(shù)據(jù)函數(shù)
void lcd_enable(); //申明LCD顯示設(shè)置函數(shù)
void delay(); //申明延時(shí)函數(shù)
//===============================================================================
//函數(shù)功能:主函數(shù)
//函數(shù)名稱:void main()
void main()
{
while(1)
{
init();
lcd_init();
write_web();
PORTD=0xc0;
lcd_enable();
write_tel();
}
}
//===============================================================================
//函數(shù)功能:初始化函數(shù)
//函數(shù)名稱:void init()
void init()
{
ADCON1=0x07; //設(shè)置A口為普通I/O口
TRISA=0x00; //設(shè)置A口為輸出
TRISD=0x00; //設(shè)置D口為輸出
}
//===============================================================================
//函數(shù)功能:LCD初始化函數(shù)
//函數(shù)名稱:void lcd_init()
void lcd_init()
{
//PORTD=0x1; //清除顯示
//lcd_enable();
PORTD=0x38; //8位2行5*7點(diǎn)陣
lcd_enable();
PORTD=0x0c; //顯示開,光標(biāo)關(guān),不閃爍
lcd_enable();
PORTD=0x07; //文字不動(dòng),光標(biāo)右移,整屏顯示左移
lcd_enable;
PORTD=0x1b; //(設(shè)置數(shù)據(jù)地址指針)80H+ 地址碼
lcd_enable();
}
//===============================================================================
//函數(shù)功能:顯示web函數(shù)
//函數(shù)名稱:void write_web()
void write_web()
{
int i;
for (i=0;i<0x30;i++) //一共48字節(jié)數(shù)據(jù)
{
write(web[i]); //查表獲取數(shù)據(jù)并調(diào)用寫一個(gè)字節(jié)數(shù)據(jù)函數(shù)送LCD顯示
}
}
//===============================================================================
//函數(shù)功能:顯示tel函數(shù)
//函數(shù)名稱:void write_tel()
void write_tel()
{
int i;
for(i=0;i<0x30;i++) //一共48字節(jié)數(shù)據(jù)
{
write(tel[i]); //查表獲取數(shù)據(jù)并調(diào)用寫一個(gè)字節(jié)數(shù)據(jù)函數(shù)送LCD顯示
}
}
//===============================================================================
//函數(shù)功能:寫一個(gè)字節(jié)數(shù)據(jù)函數(shù)
//函數(shù)名稱:void write(char X)
void write(char X)
{
PORTD=X; //待顯示數(shù)據(jù)送PORTD口
rs=1; //該字節(jié)數(shù)據(jù)為數(shù)據(jù),而不是命令
rw=0; //此次操作為寫,而不是讀
e=0; //拉低使能信號(hào)
delay(); //保持使能信號(hào)為低一段時(shí)間
e=1; //拉高使能信號(hào),建立LCD操作所需要的上升沿
}
//===============================================================================
//函數(shù)功能:LCD顯示設(shè)置函數(shù)
//函數(shù)名稱:void lcd_enable()
void lcd_enable()
{
rs=0; //該字節(jié)數(shù)據(jù)為命令,而不是數(shù)據(jù)
rw=0; //此次操作為寫,而不是讀
e=0; //拉低使能信號(hào)
delay(); //保持使能信號(hào)為低一段時(shí)間
e=1; //拉高使能信號(hào),建立LCD操作所需要的上升沿
}
//===============================================================================
//函數(shù)功能:延時(shí)子程序
//函數(shù)名稱:void delay()
void delay()
{
int i;
for(i=0;i<200;i++);
}