📄 tlcd.asm
字号:
;* 本程序包含控制外部液晶面板的4-BIT控制模式子程序。
;*这些程序是专门为演示板设计的。但它也可作为其他类
;*型的使用 KS0066U控制器的液晶面板的控制程序。
;* 占用I/O RB1-RB5,RA5
;* 使用RAM 2个字节
;* 程序包括:
;* - InitLCD 初始化液晶面板函数
;* - putcLCD 将字符写入 LCD的函数
;* - SendCmd 将命令写入 LCD的函数
;* - clrLCD 清 LCD显示函数
;* 入口参数 WREG
;* 出口参数 无
;*LCD显示RAM地址:第一行0x80~8F;第二行0xC0~CF
;************************************************
#include p16f877a.inc ;定义所用单片机的头文件
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数据& 控制I/O口 ;可以用任意的6个普通的I/O管脚定义;实际连线依据该部分定义
;*******************************************************************************
#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 ;对应的方向寄存器定义
#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 ; 开显示
#define DISP_ON_C 0x00E ; 开显示, 开指针
#define DISP_ON_B 0x00F ; 开显示, 开指针,开闪烁
#define DISP_OFF 0x008 ; 关显示
#define CLR_DISP 0x001 ; 清显示的操作数
#define ENTRY_INC 0x006 ; 操作数
#define ENTRY_INC_S 0x007 ; 操作数
#define ENTRY_DEC 0x004 ; 操作数
#define ENTRY_DEC_S 0x005 ; 操作数
#define DD_RAM_ADDR 0x080 ; 初始化第一行显示的操作数
#define DD_RAM_UL 0x0c0 ; 初始化第二行显示的操作数
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 ;初始化相关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 ;清数据线
bcf LCD_E
bsf LCD_DB5 ;设置LCD工作方式
bsf LCD_E
bcf LCD_E
call LongDelay
movlw 0x28 ;再次设置工作方式
call SendCmd ;四位数据总线,两行显示,5X7点阵字符
movlw DISP_ON ;开显示
call SendCmd
movlw ENTRY_INC ;设置指针移动方式
call SendCmd
movlw DD_RAM_ADDR ;设置起始地址
call SendCmd
call clrLCD ;清屏
return
;*putcLCD 将字符数据送入 LCD *
;* 本程序将字符数据分成了高半字节和低半字节分别输入 *
;* 先送入的是高半字节 *
PUTCLCD
bsf LCD_RS ;设置为送数据模式
movwf Byte ;存 WREG 到 Byte 寄存器
call write ;写入高半字节
swapf Byte,F ;送入数据的低字节
call write ;接着送低半字节
call Delay
return
;*******************************************************************
;* SendCmd - 送命令到 LCD *
;* 本程序将命令数据分成了高半字节和低半字节分别输入 *
;* 先送入的是高半字节 *
;*******************************************************************
SendCmd
bcf LCD_RS ;设置为送命令模式,与PUTCLCD仅相差此行
movwf Byte ;存 WREG 到 Byte 寄存器
call write ;送入命令的高字节
swapf Byte,F ;送入命令的低字节
call write
call Delay
return
;*******************************************************************
;* clrLCD - 清除 LCD 显示 *
;*******************************************************************
clrLCD
movlw CLR_DISP ;
call SendCmd
return
;*******************************************************************
;*write - 送半个字节数据
;******************************************************************
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 ;写入半字节
;bsf LCD_DB7
;btfsc Byte,6
;bsf LCD_DB6
;btfsc Byte,5
;bsf LCD_DB5
;btfsc Byte,4
;bsf LCD_DB4
bsf LCD_E ;发送数据信号
bcf LCD_E
return
;***********************************************************
Delay ; call指令占用2个指令周期
clrf Count ; 清 Count占用1个指令周期
Dloop
decfsz Count,f ; 这两行指令将延时
goto Dloop ; (256 * 3) -1 个指令周期
return ; return占用2个指令周期
LongDelay ; call指令占用2个指令周期
clrf Count ; 清 Count占用1个指令周期
clrf Count1 ; 清 Count1占用1个指令周期
movlw 0x03 ;占用1个指令周期
movwf Count2 ;占用1个指令周期
LDloop
decfsz Count,f ; 这两行指令将延时
goto LDloop ; (256 * 3) -1 个指令周期
decfsz Count1,f
goto LDloop
decfsz Count2,f
goto LDloop
return
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -