?? tlcd.asm
字號(hào):
;* 本程序包含控制外部液晶面板的4-BIT控制模式子程序。
;*這些程序是專門(mén)為演示板設(shè)計(jì)的。但它也可作為其他類
;*型的使用 KS0066U控制器的液晶面板的控制程序。
;* 占用I/O RB1-RB5,RA5
;* 使用RAM 2個(gè)字節(jié)
;* 程序包括:
;* - InitLCD 初始化液晶面板函數(shù)
;* - putcLCD 將字符寫(xiě)入 LCD的函數(shù)
;* - SendCmd 將命令寫(xiě)入 LCD的函數(shù)
;* - clrLCD 清 LCD顯示函數(shù)
;* 入口參數(shù) WREG
;* 出口參數(shù) 無(wú)
;*LCD顯示RAM地址:第一行0x80~8F;第二行0xC0~CF
;************************************************
#include p16f877a.inc ;定義所用單片機(jī)的頭文件
COUNT EQU 0X20
Count EQU 0X20;
COUNT1 EQU 0X21
Count1 EQU 0x21;
COUNT2 EQU 0X22
Count2 EQU 0x22;
LCD_TEMP EQU 0X23
Byte EQU 0X24
BYTE EQU 0X24
LCD_DATA1 EQU 0X25
BYTESH EQU 0X26
;* 定義 LCD數(shù)據(jù)& 控制I/O口 ;可以用任意的6個(gè)普通的I/O管腳定義;實(shí)際連線依據(jù)該部分定義
;*******************************************************************************
#define LCD_DB7 PORTB,5 ;占用的I/O口定義
#define LCD_DB6 PORTB,4 ;該行硬件連接:LCD的DB6與RB4連接,其它類推
#define LCD_DB5 PORTB,3 ;
#define LCD_DB4 PORTB,2 ;
#define LCD_E PORTA,5 ;
#define LCD_RS PORTB,1 ;
#define LCD_DB7_DIR TRISB,5 ;對(duì)應(yīng)的方向寄存器定義
#define LCD_DB6_DIR TRISB,4 ;
#define LCD_DB5_DIR TRISB,3 ;
#define LCD_DB4_DIR TRISB,2 ;
#define LCD_E_DIR TRISA,5 ;
#define LCD_RS_DIR TRISB,1 ;
;******************************************************************************
; LCD 模塊命令
#define DISP_ON 0x00C ; 開(kāi)顯示
#define DISP_ON_C 0x00E ; 開(kāi)顯示, 開(kāi)指針
#define DISP_ON_B 0x00F ; 開(kāi)顯示, 開(kāi)指針,開(kāi)閃爍
#define DISP_OFF 0x008 ; 關(guān)顯示
#define CLR_DISP 0x001 ; 清顯示的操作數(shù)
#define ENTRY_INC 0x006 ; 操作數(shù)
#define ENTRY_INC_S 0x007 ; 操作數(shù)
#define ENTRY_DEC 0x004 ; 操作數(shù)
#define ENTRY_DEC_S 0x005 ; 操作數(shù)
#define DD_RAM_ADDR 0x080 ; 初始化第一行顯示的操作數(shù)
#define DD_RAM_UL 0x0c0 ; 初始化第二行顯示的操作數(shù)
ORG 0X0;
NOP;
NOP;
NOP;
clrf INTCON
call InitLCD
call InitLCD
call InitLCD
call clrLCD
call clrLCD
call clrLCD
MOVLW 'H';
CALL PUTCLCD;
MOVLW 'A';
CALL PUTCLCD;
MOVLW 'P';
CALL PUTCLCD;
MOVLW 'P';
CALL PUTCLCD;
MOVLW 'Y';
CALL PUTCLCD;
MOVLW 'E';
CALL PUTCLCD;
MOVLW 'V';
CALL PUTCLCD;
MOVLW 'E';
CALL PUTCLCD;
MOVLW 'R';
CALL PUTCLCD;
MOVLW 'Y';
CALL PUTCLCD;
MOVLW 'D';
CALL PUTCLCD;
MOVLW 'A';
CALL PUTCLCD;
MOVLW 'Y';
CALL PUTCLCD;
GOTO $;
;InitLCD 初始化LCD模塊
InitLCD
bsf STATUS,RP0 ;Bank 1
bcf STATUS,RP1 ;初始化相關(guān)I/O引腳
MOVLW B'11000001';
ANDWF TRISB,F;
;bcf LCD_DB7_DIR
;bcf LCD_DB6_DIR
;bcf LCD_DB5_DIR
;bcf LCD_DB4_DIR
;bcf LCD_RS_DIR
bcf LCD_E_DIR
MOVLW 0X07
MOVWF 0X1C;CMCON=7
bcf STATUS,RP0 ;Bank 0
MOVLW B'11000001';
ANDWF TRISB,F;
;bcf LCD_DB7
;bcf LCD_DB6
;bcf LCD_DB5
;bcf LCD_DB4
;bcf LCD_RS
bcf LCD_E
bsf LCD_E ;清數(shù)據(jù)線
bcf LCD_E
bsf LCD_DB5 ;設(shè)置LCD工作方式
bsf LCD_E
bcf LCD_E
call LongDelay
movlw 0x28 ;再次設(shè)置工作方式
call SendCmd ;四位數(shù)據(jù)總線,兩行顯示,5X7點(diǎn)陣字符
movlw DISP_ON ;開(kāi)顯示
call SendCmd
movlw ENTRY_INC ;設(shè)置指針移動(dòng)方式
call SendCmd
movlw DD_RAM_ADDR ;設(shè)置起始地址
call SendCmd
call clrLCD ;清屏
return
;*putcLCD 將字符數(shù)據(jù)送入 LCD *
;* 本程序?qū)⒆址麛?shù)據(jù)分成了高半字節(jié)和低半字節(jié)分別輸入 *
;* 先送入的是高半字節(jié) *
PUTCLCD
bsf LCD_RS ;設(shè)置為送數(shù)據(jù)模式
movwf Byte ;存 WREG 到 Byte 寄存器
call write ;寫(xiě)入高半字節(jié)
swapf Byte,F ;送入數(shù)據(jù)的低字節(jié)
call write ;接著送低半字節(jié)
call Delay
return
;*******************************************************************
;* SendCmd - 送命令到 LCD *
;* 本程序?qū)⒚顢?shù)據(jù)分成了高半字節(jié)和低半字節(jié)分別輸入 *
;* 先送入的是高半字節(jié) *
;*******************************************************************
SendCmd
bcf LCD_RS ;設(shè)置為送命令模式,與PUTCLCD僅相差此行
movwf Byte ;存 WREG 到 Byte 寄存器
call write ;送入命令的高字節(jié)
swapf Byte,F ;送入命令的低字節(jié)
call write
call Delay
return
;*******************************************************************
;* clrLCD - 清除 LCD 顯示 *
;*******************************************************************
clrLCD
movlw CLR_DISP ;
call SendCmd
return
;*******************************************************************
;*write - 送半個(gè)字節(jié)數(shù)據(jù)
;******************************************************************
write
MOVF BYTE,W;
MOVWF BYTESH;
BTFSS PORTB,1;JUGDE RS,AND SAVE TO BYTESH,3
GOTO BCFRS;
BSF BYTESH,3;
GOTO GOGOGO;
BCFRS BCF BYTESH,3;
GOGOGO
;MOVLW B'11000011'
;ANDWF PORTB,F;
;bcf LCD_DB7
;bcf LCD_DB6
;bcf LCD_DB5
;bcf LCD_DB4
MOVLW 0XF8;
ANDWF BYTESH,F;
BCF STATUS,C;
RRF BYTESH,F;
RRF BYTESH,F;
MOVF BYTESH,W;
MOVWF PORTB;
;CALL DELAY
;btfsc Byte,7 ;寫(xiě)入半字節(jié)
;bsf LCD_DB7
;btfsc Byte,6
;bsf LCD_DB6
;btfsc Byte,5
;bsf LCD_DB5
;btfsc Byte,4
;bsf LCD_DB4
bsf LCD_E ;發(fā)送數(shù)據(jù)信號(hào)
bcf LCD_E
return
;***********************************************************
Delay ; call指令占用2個(gè)指令周期
clrf Count ; 清 Count占用1個(gè)指令周期
Dloop
decfsz Count,f ; 這兩行指令將延時(shí)
goto Dloop ; (256 * 3) -1 個(gè)指令周期
return ; return占用2個(gè)指令周期
LongDelay ; call指令占用2個(gè)指令周期
clrf Count ; 清 Count占用1個(gè)指令周期
clrf Count1 ; 清 Count1占用1個(gè)指令周期
movlw 0x03 ;占用1個(gè)指令周期
movwf Count2 ;占用1個(gè)指令周期
LDloop
decfsz Count,f ; 這兩行指令將延時(shí)
goto LDloop ; (256 * 3) -1 個(gè)指令周期
decfsz Count1,f
goto LDloop
decfsz Count2,f
goto LDloop
return
END
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -