📄 lcm12232zk.asm
字号:
------用8051 为MPU 时钟6MHZ
若时钟较高注意调整相应延时时间满足时序要求
;;=================!!!!!!!!!!!!!====================
LCM12232ZK 间接控制方式-
;;8 位并行接口-汉字显示演示程序
;;========!! 口线定义必须与硬件一致!!! =============
D_PORT EQU P1
RS EQU P3.1
RW EQU P3.2
E EQU P3.3
BF EQU ACC.7
PROG SEGMENT CODE
STACK SEGMENT IDATA
RSEG STACK
DS 10H ; 16 Bytes Stack
CSEG AT 0
USING 0 ; Register-Bank 0
;Execution starts at address 0 on power-up.
JMP START
RSEG PROG
START:
MOV SP,#STACK-1 ;;set 堆栈指针
lcall _init_lcm ;;液晶模块初始化
mov dptr,#string1
lcall put_string ;;显示字符串
ljmp $
string1:
DB "北京青云创新科",0
;;***************************************************
;;in: DPTR=string addr
;; R7=ddram addr
;;***************************************************
put_string:
mov a,r7
orl a,#80h
mov r7,a
lcall _write_command
disp_str_loop:
mov a,#0
movc a,@a+DPTR
cjne a,#0,cont_str_disp
ret
cont_str_disp:
mov R7,a
lcall _write_data
inc DPTR
sjmp disp_str_loop
;;***************************************************
;;input:no
;;output:no
;;***************************************************
_init_lcm:
;;delay >40ms
mov r6,#0
mov r7,#40
lcall _delay_ms
;;8-bit parall
;;select basic instruction
;;RS RW D7 D6 D5 D4 D3 D2 D1 D0
;; 0 0 0 0 1 1 x 0 x x
mov R7,#00110000B
lcall _write1_command
;;delay >100us
mov r6,#0
mov r7,#1
lcall _delay_us
;;set basic mode
;;RS RW D7 D6 D5 D4 D3 D2 D1 D0
;; 0 0 0 0 1 1 x 0 x x
mov R7,#00110000B
lcall _write1_command
;;delay>37us
mov r6,#0
mov r7,#1
lcall _delay_us
;;turn on lcd
;;RS RW D7 D6 D5 D4 D3 D2 D1 D0
;; 0 0 0 0 0 0 1 D C B D=1 整体显示ON
;; C=1 游标ON B=1 游标位置ON
mov r7,#00001100B
lcall _write_command
;;delay >100us
mov r6,#0
mov r7,#1
lcall _delay_us
;;clr screen text
;;RS RW D7 D6 D5 D4 D3 D2 D1 D0 将DDRAM
;;添满20H 且设定DDRAM 位址计数器AC=0
;; 0 0 0 0 0 0 0 0 0 1
mov r7,#00000001B
lcall _write_command
;;delay>10ms
mov r6,#0
mov r7,#40
lcall _delay_ms
;;enter dot setup
;;RS RW D7 D6 D5 D4 D3 D2 D1 D0 指定在资料的读
取与写入时游标的移动方向及指定显示的移位
;; 0 0 0 0 0 0 0 1 I/D S
mov r7,#00000110B
lcall _write_command
ret
;;***************************************************
_wait_free:
push acc
mov P1,#0FFH ;;set read active
clr RS
setb RW
_loop_busy:
setb E
mov a,P1
clr E
jb BF,_loop_busy
clr RS
clr RW
pop acc
ret
;;***************************************************
;;input:r7
;;output:NO
*********** _write_command:
lcall _wait_free
_write1_command:
clr RS ;;RS RW= 0 0 ,write command
clr RW
setb E
mov D_PORT,R7
clr E
ret
;;***************************************************
;;input:R7
;;output:acc=bit address(b6~b0)
;;***************************************************
_write_data:
lcall _wait_free
setb RS ;;RS RW= 1 0,write data
clr RW
setb E
mov D_PORT,R7
clr E
ret
;;***************************************************
;;input:R7,R6
;;output:none
;;***************************************************
_delay_ms:
nop ;;1
delay:
mov acc,#250 ;;1
del:
;;4*250=1000*(12*1/12M)=1ms
nop ;;1
nop ;;1
djnz acc,del ;;2
djnz r7,delay ;;2
mov a,r6 ;;1
jz exit ;;2
djnz r6,delay ;;2
exit:
ret
;;***************************************************
;;input:R7,R6
;;output:none
;;*********************************************
_delay_us:
nop ;;1
delayus:
mov acc,#25 ;;1
delus:
;;4*25=100*(12*1/12M)=100us
nop ;;1
nop ;;1
djnz acc,delus ;;2
djnz r7,delayus ;;2
mov a,r6 ;;1
jz exitus ;;2
djnz r6,delayus ;;2
exitus:
ret
END
;;================!!!!!!!!!!!!!================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -