; ==================================
; == LCD應用控制 ==
; == 2014/12/29 ==
; == 蘇偉諺 4A037052 ==
; ==================================
;------------------------------------------
;於LCD顯示第二列顯示'THIS IS 2ND LINE'並閃爍三次,然後由左而右依序清除
;------------------------------------------ | |
; ================================== | |
; == 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 |
;------------------------------------------ | |
; ================================== | |
; == 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 |
;------------------------------------------ | |
; ================================== | |
; == 4x4按鍵與lcd應用 == | |
; == 2014/12/28 == | |
; == 蘇偉諺 4a037052 == | |
; ================================== | |
;------------------------------------------ | |
; | |
;於lcd的第一列顯示'0123456789abcdef'並利用4x4keyport按鍵,按下數字後其lcd上相對應的數字會往下跳至第二列 | |
lcd_rs equ p2.1 | |
lcd_enable equ p3.7 | |
lcd_bus equ p0 | |
keypor equ p2 | |
keyflag equ 20h.2 | |
scancode equ 33h | |
keyno equ 34h | |
org 00h | |
mov sp,#5fh | |
call initlcd | |
mov dptr,#str | |
call prtstring | |
again: call keyin | |
jnb keyflag,again | |
push acc;;;;;;;;;;;;;; | |
mov b,a | |
mov a,#1 | |
call goxy | |
mov a,#20h | |
call wrdr | |
mov a,#2 | |
call goxy | |
pop acc;;;;;;;;;;;;;; | |
mov dptr,#str;;;;;; | |
movc a,@a+dptr | |
call wrdr | |
jmp again | |
str: db '0123456789ABCDEF','$' | |
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: mo a,r0 | |
setb keyflag | |
keyend: pop 01 | |
pop 00 | |
ret | |
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 | |
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 | |
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: mov tmod,#00010001b | |
dloop: mov th0,#high(65536-50) | |
mov tl0,#low(65536-50) | |
setb tr0 | |
jnb tf0,$ | |
clr tr0 | |
clr tf0 | |
djnz r7,dloop | |
ret | |
wrir: setb lcd_enable | |
clr lcd_rs | |
mov lcd_bus,a | |
clr lcd_enable | |
mov r7,#1 | |
call delay | |
ret | |
wrdr: setb lcd_enable | |
setb lcd_rs | |
mov lcd_bus,a | |
clr lcd_enable | |
mov r7,#1 | |
call delay | |
ret | |
end |
;------------------------------------------ | |
; =================================== | |
; == 喇叭與七段應用控制 == | |
; == 2014/12/29 == | |
; == 蘇偉諺 4a037052 == | |
; =================================== | |
;------------------------------------------ | |
;控制喇叭及七段顯示器 | |
; | |
spk equ p1.7; 定義spk等於p1.7 | |
seg equ p1; 定義seg等於p1,p1等於7段顯示器 | |
temp_h equ 30h;定義temp_h等於30h | |
temp_l equ 31h;定義temp_l等於31h | |
mov sp,#5fh;把5fh內的資料複製到sp | |
main: mov r0,#8;把8的值複製到r0 | |
mov dptr,#table_seg_tone;把table_seg的值複製到dptr,dptr=16位元暫存 | |
loop: clr a | |
movc a,@a+dptr;從rom把dptr的值取出和a的值相加,把相加的值放回a | |
mov seg,a;把a的值複製到seg,使7段顯示器顯示功能 | |
inc dptr | |
clr a | |
movc a,@a+dptr;從rom把dptr的值取出和a的值相加,把相加的值放回a | |
mov temp_h,a;把a的值複製到temp_h | |
inc dptr | |
clr a | |
movc a,@a+dptr;從rom把dptr的值取出和a的值相加,把相加的值放回a | |
mov temp_l,a;把a的值複製到temp_l | |
call music;呼叫music副程式 | |
mov r7,#100;把100的值複製到r7 | |
call delay;呼叫delay副程式 | |
inc dptr;將r1加1 | |
djnz r0,loop;將r0減1,若r0不為0就跳到loop | |
jmp main;程式結束 | |
music: mov tmod,#00010001b;將timer1跟timer0都設定成mode1:16位元 計時/計數器 | |
mov r3,#160;把160的值複製到r3 | |
lpmusic1: | |
mov th1,temp_h;把temp_h的值複製到th1 | |
mov tl1,temp_l;把temp_l的值複製到tl1 | |
setb tr1;將tr1設定成1 | |
wait1: jnb tf1,wait1;若tf1不為1就跳到wait1 | |
clr tr1;清除tr1 | |
clr tf1;清除tf1 | |
cpl p1.7;清除p1.7 | |
djnz r3,lpmusic1;把r3減1,若r3不為0就跳到lpmusic1 | |
ret | |
delay: mov th0,#high(65536-10000);將(65536-10000)的值放到th0,為了延遲0.01ms | |
mov tl0,#low(65536-10000);將(65536-10000)的值放到tl0,為了延遲0.01ms | |
setb tr0;將tr0設定成1 | |
wait0: jnb tf0,wait0;若tf0不為1就跳到wait0 | |
clr tf0;清除tf0 | |
clr tr0;清除tr0 | |
djnz r7,delay;把r7減1,若r7不為0就跳到delay | |
ret | |
table_seg_tone: | |
db 0xf9;7段顯示器顯示1 ,0 | |
dw 0fc44h ;do:a=0 1 | |
db 0xa4;7段顯示器顯示2 ,1 | |
dw 0fcadh ;re:a=2 3 | |
db 0xb0;7段顯示器顯示3 ,2 | |
dw 0fd0ah ;mi:a=4 5 | |
db 0x99;7段顯示器顯示4 ,3 | |
dw 0fd34h ;fa:a=6 7 | |
db 0x92;7段顯示器顯示5 ,4 | |
dw 0fd84h ;so:a=8 9 | |
db 0x82;7段顯示器顯示6 ,5 | |
dw 0fdc8h ;la:a=10 11 | |
db 0xd8;7段顯示器顯示7 ,6 | |
dw 0fe0bh ;si:a=12 13 | |
db 0x80;7段顯示器顯示8 ,7 | |
dw 0fe23h ;do:a=14 15 | |
end | |
;------------------------------------------ | |
; =================================== | |
; == 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 | |