📄 st7920.asm
字号:
;st7920演示程序
;寄存器
lcd_data equ 25h ;LCD数据
lcd_com equ 26h ;LCD指令
addr_ddram equ 27h
addr_hanzi1 equ 28h
addr_hanzi2 equ 29h
;标志位
bit_ASCII equ 00h ;=1时写8*16点阵,=0时写16*16汉字
;管脚定义
rs equ p3.2
r_w equ p3.3
e equ p3.4
lcd_db equ p1
;rs equ p0.5
;r_w equ p0.6
;e equ p0.7
;lcd_db equ p2
org 0000h
sjmp start
org 0040h
start: mov sp,#60h
call init_lcd
; clr p2.0
; jmp main11
mov r7,#64
clr bit_ASCII
mov addr_ddram,#0h ;设定DDRAM的位址第一行从0到9
;第二行从10h到19h
mov addr_hanzi1,#0b3h ;汉字代码高字节,8*16点阵代码02h-7fh(bit_ASCII=1)
mov addr_hanzi2,#0a1h ;汉字代码低字节,写8*16点阵时不用置0
main1: call write_lcd ;写字符(汉字)程序
inc addr_ddram
inc addr_hanzi2
; push 07h
; call delay_1s
; pop 07h
djnz r7,main1
; clr p2.1
sjmp $
main11: mov r7,#16
setb bit_ASCII
mov addr_ddram,#10h
mov ADDR_HANZI1,#30h
mov addr_hanzi2,#0
main2: call write_lcd
inc addr_ddram
inc addr_hanzi1
push 07h
call delay_1s
pop 07h
djnz r7,main2
clr p2.2
; sjmp $
;-----------------------------------------------------------------------
;以下程序为用图形区显示
;-----------------------------------------------------------------------
MOV lcd_COM, #3eH ;set 8 bit option开绘图显示
call wc
mov r4,#0
w1: mov r5,#0
w2:
MOV lcd_COM, #3eH ;set 8 bit option开绘图显示
call wc
clr rs
clr r_w
mov a,r4
orl a,#80h
mov lcd_db,a ;Y curcor
setb e
clr e
mov a,r5
orl a,#80h
mov lcd_db,a;#82h ;X curcor,以16个点为单位
setb e
clr e
call delay_50ms
mov lcd_data,#0f0h ;写入数据,横向,从左到右
call wd
call wd
call wd
call wd
inc r5
mov a,r5
cjne a,#16,w2
inc r4
mov a,r4
cjne a,#128,w1
sjmp $
write_lcd: mov a,addr_ddram
setb acc.7
mov lcd_com,a
call wc
mov a,addr_hanzi1
mov lcd_data,a
call wd
jb bit_ASCII,write_lend
mov a,addr_hanzi2
mov lcd_data,a
call wd
write_lend: ret
init_lcd: mov p0,#0ffh
mov p1,#0ffh
mov p2,#0ffh
mov p3,#0ffh
call delay_50ms
; clr r_w
; clr rs
mov lcd_db,#38h
call wc
; setb e
; clr e
LCALL DELAY_50ms
MOV lcd_db,#38H
call wc
; SETB E
; CLR E
call delay_50ms
MOV lcd_db,#38H
call wc
; SETB E
; CLR E
call delay_50ms
MOV lcd_COM, #38H ;set 8 bit option
call wc
call delay_50ms
MOV lcd_COM, #01H ;Clear display
LCALL WC
call delay_50ms
MOV lcd_COM, #06H ;Entry Mode set curcor right move
LCALL WC
call delay_50ms
MOV lcd_COM, #0ch;#0C0H ;Display on/off set: Cursor on,Blinks on,Display on
LCALL WC
call delay_50ms
ret
wc: ;Write command instructions
CLR RS
SETB R_W
WC1: MOV lcd_db,#0FFH ; **Please set this interface to "1" before MCU read Busy Flag.
SETB E
MOV A,lcd_db
CLR E
JB aCC.7,WC1 ;Test busy
CLR R_W ;Write command
MOV lcd_db,lcd_COM
SETB E
CLR E
ret
WD: CLR RS
SETB R_W
WD1: MOV lcd_db,#0FFH
SETB E
MOV A,lcd_db
CLR E
JB ACC.7,WD1
SETB RS
CLR R_W
MOV lcd_db,lcd_data
SETB E
CLR E
RET
delay_50ms: mov r7,#10
delay1: mov r6,#98
delay2: mul ab
mul ab
djnz r6,delay2
djnz r7,delay1
ret
delay_1s: mov r5,#20
delay_1s1: call delay_50ms
djnz r5,delay_1s1
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -