⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1113752134.asm

📁 LCD driving program for character or matrix type LCM
💻 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 + -