📄 xianshi.asm
字号:
LIST P=16F877A
#INCLUDE <P16F877A.INC>
ERRORLEVEL 2
XCS EQU 20H ;显示器片选0=CS1,1=CS2 ;20H-2FH为位
BZPD EQU 21H ;0=上8X8半字,1=下8X8半字
HHBZ EQU 22H ;换行标志
HZDH EQU 23H
INDEX EQU 24H
LCDFLAG EQU 25H
R4 EQU 26H
R5 EQU 27H
R6 EQU 28H
R7 EQU 29H
R0 EQU 2AH ;0=显示汉字,1=显示动画
LCD_RW EQU 1
LCD_DI EQU 0
LCD_E EQU 2
LCD_CS1 EQU 3
LCD_CS2 EQU 4
LCD_RST EQU 5
LCD_OPEN EQU 30H
LCD_LINE EQU 31H
LCD_PAGE EQU 32H
LCD_Y EQU 33H
YCPD EQU 34H ;左右半屏溢出判断
HHPD EQU 35H ;换行判断
XWPD EQU 36H
R1 EQU 37H
R2 EQU 38H
R3 EQU 39H
INDEX1 EQU 42H
INDEX2 EQU 41H
INDEX3 EQU 43H
YCPD1 EQU 40H
;写完一整屏判断
ORG 0000H
NOP
GOTO MAIN
ORG 005H
MAIN:
BANKSEL TRISC
MOVLW 00H
MOVWF TRISC
MOVWF TRISD
BANKSEL PORTC
BCF PORTC,LCD_RST
CALL DLY10
CALL DLY10
BSF PORTC,LCD_RST
MOVLW 00H
MOVWF XCS
MOVLW 01H ;选择CS2
MOVWF LCD_OPEN ;开显示器1,关显示器
CALL LCDOPEN
CALL QINGPING
MOVLW 01H
MOVWF XCS
MOVLW 01H ;选择CS2
MOVWF LCD_OPEN ;开显示器1,关显示器
CALL LCDOPEN
CALL QINGPING
CALL HANZI
LOOPM: GOTO LOOPM
;********************************************************************
QINGPING:
MOVLW 00H
MOVWF LCD_LINE
CALL SETLINE ;设置起始
MOVLW 00H
MOVWF LCD_PAGE
CALL SETPAGE ;设置页地
MOVLW 00H
MOVWF LCD_Y
CALL SETY ;设置列地
;CS1
GOTO CLRST3
CLR0: INCF LCD_PAGE,F
CLRST3: CALL SETPAGE
MOVLW 40H
MOVWF R7
SDF: MOVLW 00H
MOVWF LCDFLAG
CALL LCDWRDATA
DECFSZ R7,F
GOTO SDF
MOVLW 0BFH
XORWF LCD_PAGE,W
BTFSS STATUS,Z
GOTO CLR0
RETURN
;初始化完毕
;*************************************************************************
HANZI:
BANKSEL PORTC
MOVLW 00H
MOVWF XWPD
HZ0: CLRF XCS
MOVLW 00H
MOVWF LCD_LINE
CALL SETLINE ;设置起始
MOVLW 00H
MOVWF LCD_PAGE
CALL SETPAGE ;设置页地
MOVLW 00H
MOVWF LCD_Y
CALL SETY
MOVLW 00H
MOVWF INDEX3
MOVWF INDEX2
MOVWF R1
JBO: MOVLW 00H
MOVWF HHPD
HZ7: MOVLW 00H
MOVWF YCPD
HZ8: CLRF BZPD
HZ3: MOVLW 08H
MOVWF R0 ;写左上8个Y列
HZ1:
MOVFW R1
CALL HZDOT
CLRF PCLATH
MOVWF LCDFLAG
CALL LCDWRDATA
INCF R1,F
LOOPAN:
INCF LCD_Y,F
DECFSZ R0,F
GOTO HZ1
LOOPQW
MOVLW 00H
XORWF BZPD,W
BTFSS STATUS,Z
GOTO HZ2
CLRF STATUS ;Y列减8, 即返回扫描
MOVLW 08H
SUBWF LCD_Y,F
CALL SETY
INCF LCD_PAGE ,F ;页地址加1,即换第2页扫描
CALL SETPAGE
MOVLW 01H
MOVWF BZPD
GOTO HZ3
HZ2:
DECF LCD_PAGE,F ;返回到第1页中,准备下一个半
CALL SETPAGE
INCF YCPD,F
MOVLW 08H
XORWF YCPD,W
BTFSS STATUS,Z
GOTO HZ8
MOVLW 01H
XORWF XCS,W
BTFSC STATUS,Z
GOTO HZ9
MOVLW 01H
MOVWF XCS ;换屏
MOVLW 0XB8
CALL SETPAGE
MOVLW 00H
MOVWF LCD_Y ;置列
CALL SETY
GOTO HZ7
HZ9:
CLRF XCS ;写完一行后从CS2返回到CS1
INCF LCD_PAGE,F
INCF LCD_PAGE,F
CALL SETPAGE ;下一行开始
MOVLW 00H
MOVWF LCD_Y
CALL SETY
INCF HHPD,F
MOVLW 03H
XORWF HHPD,Z
BTFSS STATUS,Z
GOTO HZ7
CLRF STATUS
INCF XWPD,F
MOVLW 01H
XORWF XWPD,W
BTFSS STATUS,Z
GOTO JBO
RETURN
LCDWRINST: NOP
BSF PORTC,LCD_RST
CLRF STATUS
MOVLW 01H
XORWF XCS,W
BTFSC STATUS,Z
GOTO INS0
BSF PORTC,LCD_CS1
BCF PORTC,LCD_CS2
GOTO INS1
INS0: BCF PORTC, LCD_CS1
BSF PORTC, LCD_CS2
INS1: BSF PORTC, LCD_E
BCF PORTC, LCD_DI
BCF PORTC, LCD_RW
MOVFW LCDFLAG
MOVWF PORTD
CALL DLY10
BCF PORTC, LCD_E
CALL DLY10
NOP
RETURN
LCDWRDATA: NOP
BSF PORTC,LCD_RST
CLRF STATUS
MOVLW 01H
XORWF XCS,W
BTFSC STATUS,Z
GOTO DAT0
BSF PORTC,LCD_CS1
BCF PORTC,LCD_CS2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -