advertisement

2014年12月29日

UART、LCD與4x4鍵盤應用

;------------------------------------------
; ==================================
; == uart、lcd與4x4鍵盤應用 ==
; == 2014/12/28 ==
; == 蘇偉諺 4a037052 ==
; ==================================
;------------------------------------------
;按下按鍵後 該按鍵值會從lcd第一列最右邊慢慢移動至最左邊停止
;-----------------------------------------------------------------------------
; parameter define
;-----------------------------------------------------------------------------
lcd_rs equ p2.1
lcd_enable equ p3.7
lcd_bus equ p0
keyport equ p2
keyflag equ 20h.2
scancode equ 33h
keyno equ 34h;;????
rxdflag equ 20h.3
;-----------------------------------------------------------------------------
; main program
;-----------------------------------------------------------------------------
org 00h
mov sp,#5fh
call initlcd
call uartinit
; mov r0,#15
again: mov r0,#16
call keyin
jnb keyflag,again
call txd0
rrx: call rxd0
jnb rxdflag,rrx;;;這邊要到呼叫rxd0的之方,否則到again的話,或沒一次接收成功,會導致多傳兩次以上 8051可以多接收一位員組資料暫存 所以會傳副接收到暫存的資料
mov r3,a
;--------------------------------------------
; mov b,r0
; mov a,#1
; call goxy
; mov a,r3
; mov dptr,#str;;;;;;
; movc a,@a+dptr
; call wrdr
; mov r7,#??
; call delay
; mov b,r0
; mov a,#1
; call goxy
; mov a,#' '
; call wrdr
;
; mov b,r0
; mov a,#1
; call goxy
; mov a,r3
; mov dptr,#str
; movc a,@a+dptr
; call wrdr
; mov r7,#??
; call delay
; mov b,r0
; mov a,#1
; call goxy
; mov a,#' '
; call wrdr
;--------------------------------------------------
goprint: mov b,r0
mov a,#1
call goxy
mov a,#' '
call wrdr
dec r0
mov b,r0
mov a,#1
call goxy
mov a,r3
mov dptr,#str
movc a,@a+dptr
call wrdr
mov r7,#10
call delay50ms
cjne r0,#0,goprint
jmp again
;-----------string table------------------------
str: db '0123456789abcdef'
;-----------------------------------------------------------------------------
; scan keyboard
;-----------------------------------------------------------------------------
keyin: push 00
push 01
mov r0,#0
mov scancode,#11111110b
keyrow: mov keyport,scancode
mov r7,#4
call delay
mov a,keyport
mov r1,#4
swap a
kcol: rrc a
jnc keypressed
inc r0
djnz r1,kcol
mov a,scancode
rl a
mov scancode,a
jnb acc.4,nokey;;;;;;;;;;;;;;;;;;;;
jmp keyrow
nokey: clr keyflag
jmp keyend
keypressed: mov a,r0
setb keyflag
keyend: pop 01
pop 00
ret
;-----------------------------------------------------------------------------
; 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
;-----------------------------------------------------------------------------
; 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
rxd0: jnb ri,rxdret
mov a,sbuf
clr ri
setb rxdflag
ret
rxdret: clr rxdflag
ret
txd0: clr ti
mov sbuf,a
jnb ti,$
clr ti
ret
;------------------------------------------------------------------------------
; initial uart,timer1,timer0
;12mhz: timer1,th1
;-----------------------------------------------------------------------------
uartinit: mov scon,#01010000b ;uart:mode 1
mov tmod,#00100001b ;timer1:mode 2, timer0:mode 1
mov pcon,#10000000b ;(smod=1)
mov th1,#255 ;baud rate=62500 bits/sec
setb tr1 ;start timer1
; clr tr0
; clr tf0
clr ri
clr ti
ret
end

沒有留言:

張貼留言

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