This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;------------------------------------------ | |
; ================================== | |
; == 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 |
沒有留言:
張貼留言
文章有誤或有問題麻煩您留言告知! 謝謝您~~