advertisement

2014年12月29日

LCD 應用控制 8051 assembly

;------------------------------------------
; ===================================
; == lcd 應用控制 ==
; == 2014/12/29 ==
; == 蘇偉諺 4a037052 ==
; ===================================
;------------------------------------------
;開機後,lcd第一列顯示'0123456789abcdef',並閃爍3次,接著每個字元依序跳至第二列顯示
;-----------------------------------------------------------------------------
; 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
; call clrlcd
; mov r7,#20
; call delay50ms
; mov dptr,#str
; call prtstring
; mov r7,#20
; call delay50ms
; call clrlcd
; mov r7,#20
; call delay50ms
; mov dptr,#str
; call prtstring
; mov r7,#20
; call delay50ms
; call clrlcd
; mov r7,#20
; call delay50ms
; mov dptr,#str
; call prtstring
; mov r7,#20
; call delay50ms
mov r5,#3
glint: call clrlcd;;;;;;;
mov r7,#20
call delay50ms
mov dptr,#str
call prtstring
mov r7,#20
call delay50ms
djnz r5,glint
; mov a,#1
; mov b,#0
; call goxy
; mov a,#20h
; call wrdr
; mov a,#2
; mov b,#0
; call goxy
; mov dptr,#str
; mov a,#0
; movc a,@a+dptr
; call wrdr
; mov a,#1
; mov b,#1
; call goxy
; mov a,#20h
; call wrdr
; mov a,#2
; mov b,#1
; call goxy
; mov dptr,#str
; mov a,#1
; movc a,@a+dptr
; call wrdr
mov r3,#0
mov dptr,#str
appear: mov a,#1
mov b,r3
call goxy
mov a,#20h
call wrdr
mov a,#2
mov b,r3
call goxy
mov a,r3
movc a,@a+dptr
call wrdr
inc r3
mov r7,#20
call delay50ms
cjne r3,#16,appear
jmp $
str: db '0123456789abcdef','$'
;-----------------------------------------------------------------------------
; display string
;-----------------------------------------------------------------------------
prtstring: push acc ;
prtloop: clr a ;
movc a,@a+dptr ;
cjne a,#'$',next ;
sjmp endprt ;
next: acall wrdr ;
inc dptr ;
jmp prtloop ;
endprt: pop acc ;
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
;-----------------------------------------------------------------------------
; go x line, y char
;-----------------------------------------------------------------------------
goxy: anl b,#00001111b ;
cjne a,#1,chk1 ;
mov a,b ;
add a,#10000000b ;
call wrir ;
ret ;
chk1: mov a,b ;
add a,#11000000b ;
call wrir ;
ret ;
;-----------------------------------------------------------------------------
; write control word to instruction register
;-----------------------------------------------------------------------------
wrir: clr lcd_rs ;
setb lcd_enable ;
mov lcd_bus,a ;
clr lcd_enable ;
mov r7,#1 ;
call delay ;delay 50us
ret ;
;-----------------------------------------------------------------------------
; write data to data register
;-----------------------------------------------------------------------------
wrdr: setb lcd_rs ;
setb lcd_enable ;
mov lcd_bus,a ;
clr lcd_enable ;
mov r7,#1 ;
call delay ;delay 50us
ret ;
;-------------------------------------------------------------------------------
; delay time=r7*0.05ms
;-------------------------------------------------------------------------------
delay: mov tmod,#00010001b ;timer 0 : mode 1
loopdy: mov th0,#high(65536-50);
mov tl0,#low(65536-50);
setb tr0 ;
wait: jnb tf0,wait ;
clr tf0 ;
clr tr0 ;
djnz r7,loopdy ;
ret ;
;-------------------------------------------------------------------------------
; delay time=r7*50ms
;-------------------------------------------------------------------------------
delay50ms:
loopdy1: mov th0,#high(65536-50000)
mov tl0,#low(65536-50000)
setb tr0
jnb tf0,$
clr tf0
clr tr0
djnz r7,loopdy1
ret
end
view raw lcd.asm hosted with ❤ by GitHub

沒有留言:

張貼留言

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