📄 1113752134.asm
字号:
;*************************************************
;* 本程序包含控制外部液晶面板的4-BIT控制模式子 *
;* 程序。这些程序是专门为 MCU201 workshop演示板 *
;* 设计的。但它也可作为其他类型的使用 KS0066U控 *
;* 制器的液晶面板的控制程序。 *
;* 程序包括: *
;* - InitLCD 初始化液晶面板子程序 *
;* - putcLCD 将字符写入 LCD的子程序 *
;* - SendCmd 将命令写入 LCD的子程序 *
;* - clrLCD 清 LCD显示 *
;* - L1homeLCD 显示指针指向第1行 *
;* - L2homeLCD 显示指针指向第2行 *
;************************************************
;* 说明:这只是一个程序构架,您应按此构架的提示 *
;* 合理添加程序,以使其正常运行。 *
;************************************************
;************************************************
;* 接着LAB3,我们将在Lab4 里使用 A/D转换来控制 *
;* LCD 面板的背光。我们将预先设定一个极限值,当 *
;* A/D 采样的值大于这个极限值时关闭背光,否则则 *
;* 开启背光。 *
;************************************************
include <p16f877.inc>
; 定义 LCD数据& 控制I/O口
LCD_DATA equ PORTB
LCD_CNTL1 equ PORTB
LCD_CNTL2 equ PORTA
; 定义 LCD控制相应的I/O引脚
RS equ 1
E equ 5
; LCD 模块命令代码
DISP_ON EQU 0x00C ; 开显示
DISP_ON_C EQU 0x00E ; 开显示, 开指针
DISP_ON_B EQU 0x00F ; 开显示, 开指针,开闪烁
DISP_OFF EQU 0x008 ; 关显示
CLR_DISP EQU 0x001 ; 清显示的操作数
ENTRY_INC EQU 0x006 ; 操作数,由左向右显示
ENTRY_INC_S EQU 0x007 ; 操作数,显示和读取均向右
ENTRY_DEC EQU 0x004 ; 操作数,由右向左显示
ENTRY_DEC_S EQU 0x005 ; 操作数,显示和读取均向左
DD_RAM_ADDR EQU 0x080 ; 初始化第一行显示的操作数
DD_RAM_UL EQU 0x0c0 ; 初始化第二行显示的操作数
;
;**************************************
; 请设置显示相关寄存器 *
;**************************************
Byte RES 1
Count RES 1
Count1 RES 1
Count2 RES 1
LCD_DATA1 RES 1
;**************************************
_WREG res 1
_STATUS res 1
;**************************************
ORG 0
GOTO Start
org 10
Start
call InitLCD ;初始化 LCD
;****************************************************
;* 提示:将code0替换成你的程序,完成以下功能: *
;* - 调用L1homeLCD子程序,使指针定位在第一行 *
;* - 显示第一行字符,最多为16字 *
;* - 调用L2homeLCD子程序,使指针定位在第二行 *
;* - 显示第二行字符,最多为16字 *
;* 请先阅读相关子程序的说明,以明了其作用。对LCD *
;* 模块感兴趣的朋友可以根据本程序所提供的数据来修改 *
;* 各子程序的操作数,从而改变LCD的显示方式 *
;****************************************************
code0
;**************************************************
;* 提示:将code1替换成你的程序,依次完成以下功能: *
;* - 初始化 A/D 转换器 *
;* - 设置转换速率为Fosc/8 *
;* - 选定通道2 *
;* - A/D使能 *
;* - 设定 PORTE,0 脚电平为1 *
;* - 设定 PORTE,0 脚为输出 *
;**************************************************
code1
Main
;**************************************************
;* 提示:将code2替换成你的程序,依次完成以下功能: *
;* - 启动 A/D 转换 *
;* - 等待转换完成 *
;* - 将转换所得数据与设定值比较 *
;* - 如果大于设定值 *
;* - 使 RE0 输出电平关闭背光 *
;* - 如果小于设定值 *
;* - 使 RE0 输出电平开启背光 *
;**************************************************
code2
goto Start
;*******************************************************************
;* LCD 模块子程序 *
;*******************************************************************
;InitLCD——初始化LCD模块 *
;*******************************************************************
InitLCD
bcf STATUS,RP0 ; Bank 0
bcf STATUS,RP1
clrf LCD_DATA ; 清 LCD 数据 & 控制位
bsf STATUS,RP0 ; Bank 1
movlw 0xc1 ; 设置RB1~RB5为输出
movwf LCD_DATA
bcf TRISA,5
bcf STATUS,RP0 ;
movlw 0x08 ;
movwf LCD_DATA
bsf LCD_CNTL2, E
bcf LCD_CNTL2, E
call LongDelay
call LongDelay
movlw b'00101000'
call SendCmd
movlw DISP_ON ; 开显示
call SendCmd
movlw ENTRY_INC ; 设置指针移动方式
call SendCmd
movlw DD_RAM_ADDR ; 设置起始地址
call SendCmd
InitLCDEnd ;
bcf STATUS,RP0 ;
call clrLCD
return
;*******************************************************************
;*putcLCD—— 将字符数据送入 LCD *
;* 本程序将字符数据分成了高半字节和低半字节分别输入 *
;* 先送入的是高半字节 *
;*******************************************************************
putcLCD
movwf Byte ; 存 WREG 到 Byte 寄存器
swapf Byte,W ; 写入高半字节
movwf LCD_DATA1
rlf LCD_DATA1,1
rlf LCD_DATA1,1
movlw 0x3c
andwf LCD_DATA1,1
movf LCD_DATA1,w
movwf LCD_DATA
bsf LCD_CNTL1, RS ; 设置为送数据模式
bsf LCD_CNTL2, E ; 发送数据信号
bcf LCD_CNTL2, E
movf Byte,W ; 接着送低半字节
movwf LCD_DATA1
rlf LCD_DATA1,1
rlf LCD_DATA1,1
movlw 0x3c
andwf LCD_DATA1,1
movf LCD_DATA1,w
movwf LCD_DATA
bsf LCD_CNTL1, RS ; 设置为送数据模式
bsf LCD_CNTL2, E ; 发送数据信号
bcf LCD_CNTL2, E
call Delay
return
;*******************************************************************
;* SendCmd - 送命令到 LCD *
;* 本程序将命令数据分成了高半字节和低半字节分别输入 *
;* 先送入的是高半字节 *
;*******************************************************************
SendCmd
movwf Byte ; 存 WREG 到 Byte 寄存器
swapf Byte,W ; 送入命令的高字节
movwf LCD_DATA1
rlf LCD_DATA1,1
rlf LCD_DATA1,1
movlw 0x3c
andwf LCD_DATA1,1
movf LCD_DATA1,w
movwf LCD_DATA
bcf LCD_CNTL1,RS ; 设置为送命令模式
bsf LCD_CNTL2,E ; 发送数据信号
bcf LCD_CNTL2,E
movf Byte,W ; 接着送命令的低字节
movwf LCD_DATA1
rlf LCD_DATA1,1
rlf LCD_DATA1,1
movlw 0x3c
andwf LCD_DATA1,1
movf LCD_DATA1,w
movwf LCD_DATA
bcf LCD_CNTL1,RS ; 设置为送命令模式
bsf LCD_CNTL2,E ; 发送数据信号
bcf LCD_CNTL2,E
call Delay
return
;*******************************************************************
;* clrLCD - 清除 LCD 显示 *
;*******************************************************************
clrLCD
movlw CLR_DISP ;
call SendCmd
return
;*******************************************************************
;* L1homeLCD - 将显示指针定位在第一行 *
;*******************************************************************
L1homeLCD
movlw DD_RAM_ADDR ;
call SendCmd ;
return
;*******************************************************************
;* L2homeLCD - 将显示指针定位在第二行 *
;*******************************************************************
L2homeLCD
movlw DD_RAM_UL ;
call SendCmd ;
return
;*******************************************************************
;* Delay - 延时子程序 *
;*******************************************************************
Delay ; call指令占用2个指令周期
clrf Count ; 清 Count占用1个指令周期
Dloop
decfsz Count,f ; 这两行指令将延时
goto Dloop ; (256 * 3) -1 个指令周期
return ; return占用2个指令周期
;*******************************************************************
;* LongDelay - 长延时子程序 *
;*******************************************************************
LongDelay
clrf Count
clrf Count1
movlw 0x03
movwf Count2
LDloop
decfsz Count,f
goto LDloop
decfsz Count1,f
goto LDloop
decfsz Count2,f
goto LDloop
return
;*********************************
END
;****************************************************
;Written by : Yamato Tel:0591-3375855-721 *
;****************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -