advertisement

2014年12月29日

LCD應用控制 8051 assembly

;------------------------------------------
; ==================================
; == lcd應用控制 ==
; == 2014/12/29 ==
; == 蘇偉諺 ==
; ==================================
;------------------------------------------
;於lcd顯示第二列顯示'THIS IS 2ND LINE'並閃爍三次,然後由左而右依序清除
;-----------------------------------------------------------------------------
; parameter define
;-----------------------------------------------------------------------------
lcd_enable equ p3.7
lcd_rs equ p2.1
lcd_bus equ p0
;-----------------------------------------------------------------------------
; main program
;-----------------------------------------------------------------------------
org 00h
mov sp,#5fh
call initlcd
mov r5,#3
glint: call clrlcd;;;;;;;
mov r7,#20
call delay50ms
mov a,#1
mov b,#0
call goxy
mov dptr,#str
call prtstring
mov r7,#20
call delay50ms
djnz r5,glint
mov r4,#16
mov b,#15
clrrr: mov a,#1
call goxy
mov a,#20h
call wrdr
mov r7,#20
call delay50ms
dec b
djnz r4,clrrr
jmp $
str: db 'THIS IS 2ND LINE','$'
;-----------------------------------------------------------------------------
; go x line, y char
;-----------------------------------------------------------------------------
goxy: anl b,#00001111b
cjne a,#1,chk1
mov a,b
add a,#10000000b;setb a.7 orl 10000000b
call wrir
ret
chk1: mov a,b
add a,#11000000b
call wrir
ret
;-----------------------------------------------------------------------------
; initial lcd
;-----------------------------------------------------------------------------
initlcd: mov a,#38h
call wrir
mov a,#0dh
call wrir
mov a,#06h
call wrir
clrlcd: mov a,#01h
call wrir
mov r7,#40;清除需延遲2ms
call delay
ret
;-------------------------------------------------------------------------------
; delay time=r7*0.05ms
;-------------------------------------------------------------------------------
delay: mov tmod,#00100001b
dloop: mov th0,#high(65536-50)
mov tl0,#low(65536-50)
setb tr0
jnb tf0,$
clr tr0
clr tf0
djnz r7,dloop
ret
;-------------------------------------------------------------------------------
; delay time=r7*50ms
;-------------------------------------------------------------------------------
delay50ms:
dloop1: mov th0,#high(65536-50000)
mov tl0,#low(65536-50000)
setb tr0
jnb tf0,$
clr tr0
clr tf0
djnz r7,dloop1
ret
prtstring: push acc
prtloop: clr a
movc a,@a+dptr
cjne a,#'$',next
jmp endprt
next: call wrdr
inc dptr
jmp prtloop
endprt: pop acc
ret
;-----------------------------------------------------------------------------
; write control word to instruction register
;-----------------------------------------------------------------------------
wrir: setb lcd_enable
clr lcd_rs
mov lcd_bus,a
clr lcd_enable
mov r7,#1
call delay
ret
;-----------------------------------------------------------------------------
; write data to data register
;-----------------------------------------------------------------------------
wrdr: setb lcd_enable
setb lcd_rs
mov lcd_bus,a
clr lcd_enable
mov r7,#1
call delay
ret
end

沒有留言:

張貼留言

文章有誤或有問題麻煩您留言告知! 謝謝您~~