4 軟件實(shí)現(xiàn)
軟件開發(fā)環(huán)境為ARM SDT V2.5。程序分為兩部分:首先為ARM初始化,使用匯編語(yǔ)言書寫。然后才是用C語(yǔ)言書寫的顯示主程序。
下面分別將兩部分結(jié)合原代碼略加說(shuō)明。
匯編語(yǔ)言部分:
IOPMOD EQU 0x3FF5000 ;定義IO口模式寄存器
IOPDATA EQU 0x3FF5008 ;定義IO口數(shù)據(jù)寄存器
IMPORT Main
AREA Init,CODE,READONLY
ENTRY
LDR R0, =0x3FF0000
LDR R1, =0xE7FFFF80 ;配置SYSCFG,片內(nèi)4Kcache,4KSRAM
STR R1, [R0]
LDR SP, =0x3FE1000 ;SP指向4KSRAM的尾地址,堆棧向下生成
LDR R0, =0X3FF5000
LDR R1, =0X000002A8 ;設(shè)置IO3,IO5,IO7,IO9為輸出模式
STR R1,[R0]
BL Main
B 。
END
C語(yǔ)言部分:因篇幅有限,這里就不完整的給出源程序了,只列出幾個(gè)子函數(shù)。
#include “typDef.h”
#define IOPMOD (*(volatile unsigned *)0x03FF5000)
#define IOPDATA (*(volatile unsigned *)0x03FF5008)
/*定義子函數(shù)如下*/
void clr_lcd_rst(void){ IOPDATA &=0XFDFF;} 清零復(fù)位引腳
void set_lcd_rst(void){ IOPDATA |=0X0200;} 置位復(fù)位引腳
void clr_lcd_sclk(void){IOPDATA &=0XFFF7;} 時(shí)鐘端置低
void set_lcd_sclk(void){IOPDATA |=0X0008;} 時(shí)鐘端置高
void clr_lcd_sid(void){IOPDATA &=0XFF7F;} 串行輸出數(shù)據(jù)0
void set_lcd_sid(void){IOPDATA |=0X0080;} 串行輸出數(shù)據(jù)1
void clr_lcd_cs(void){IOPDATA &=0XFFDF;} 清零使能端
void set_lcd_cs(void){IOPDATA |=0X0020;} 置位使能端
void print_led_p0(void){IOPDATA |=0X0001;} 使led0亮
void print_led_p1(void){IOPDATA |=0X0002;} 使led1亮
void off_led_p0(void){IOPDATA &=0XFFFE;} 使led0滅
/*液晶初始化部分*/
void Init_lcd(void)
{set_lcd_rst();
delay(4);
write_lcd(0,0x01); 清除顯示
delay(4);
write_lcd(0,0x0c); 顯示狀態(tài)設(shè)置
delay(4);
write_lcd(0,0x30); 設(shè)置為8位控制接口
delay(4);
}
圖2:串行寫操作時(shí)序圖
程序嚴(yán)格按照串行的寫操作時(shí)序(如圖2所示)。此外應(yīng)該注意當(dāng)模塊在接受指令前,微處理器必須先確認(rèn)模塊內(nèi)部處于非忙碌狀態(tài),即讀取BF標(biāo)志時(shí)BF需為0,方可接受新的指令;如果在送出一個(gè)指令前并不檢查BF標(biāo)志,那么在前一個(gè)指令和這個(gè)指令中間必須延遲一段較長(zhǎng)的時(shí)間,即是等待前一個(gè)指令確實(shí)執(zhí)行完成,指令執(zhí)行的時(shí)間請(qǐng)參考指令表中的個(gè)別指令說(shuō)明。
5結(jié)束語(yǔ):
本文介紹的方法可以實(shí)現(xiàn)漢字字符,英文字母,圖形顯示。除了上述的靜態(tài)顯示方式外,還可以通過(guò)編程來(lái)實(shí)現(xiàn)字符的動(dòng)態(tài)顯示及一些特效(如字符的移動(dòng),漸變,閃爍)顯示。達(dá)到了與內(nèi)置LCD控制器相同的功能。
評(píng)論