?? 19長數顯示清無效零.asm
字號:
;本程序需要觀看LED顯示,請將CZ2和P1口用排線連接起來
org 00h
mov r1,#0
mov 30h,#0
mov 31h,#1
mov 32h,#2
mov 33h,#3
mov 34h,#4
mov 35h,#5
mov 36h,#6
mov 37h,#7 ;先將要顯示的數放入寄存器內,以后做產品時,你要顯示什么數就由你的程序自動計算自動放進這里
main:;LED動態掃描程序顯示開始,說明有8只LED數碼管,就需要分別顯示8只數碼管,r7表示是輪到顯示第幾只
cc:mov a,30h
cjne a,#0,cced
mov 30h,#16
mov a,31h
cjne a,#0,cced
mov 31h,#16
mov a,32h
cjne a,#0,cced
mov 32h,#16
mov a,33h
cjne a,#0,cced
mov 33h,#16
mov a,34h
cjne a,#0,cced
mov 34h,#16
mov a,35h
cjne a,#0,cced
mov 35h,#16
mov a,36h
cjne a,#0,cced
mov 36h,#16
cced:
inc r7
disp0:cjne r7,#8,disp1
mov r7,#0
disp1:cjne r7,#0,disp2
mov 38h,#10000000b ;將要顯的那只數碼管的共陽極數據,通過串行口向74HC164發送數據,只讓一個數碼管的陽極有電,即只點亮一只數碼管
mov 39h,30h ;將要顯示的數碼管的筆畫數據
call ddpp ;調用顯示子程序,對上面的數碼管數據顯示
disp2:cjne r7,#1,disp3
mov 38h,#01000000b ;將要顯的那只數碼管的共陽極數據,通過串行口向74HC164發送數據,只讓一個數碼管的陽極有電,即只點亮一只數碼管
mov 39h,31h ;將要顯示的數碼管的筆畫數據
call ddpp ;調用顯示子程序,對上面的數碼管數據顯示
disp3:cjne r7,#2,disp4
mov 38h,#00100000b ;將要顯的那只數碼管的共陽極數據,通過串行口向74HC164發送數據,只讓一個數碼管的陽極有電,即只點亮一只數碼管
mov 39h,32h ;將要顯示的數碼管的筆畫數據
call ddpp ;調用顯示子程序,對上面的數碼管數據顯示
disp4:cjne r7,#3,disp5
mov 38h,#00010000b ;將要顯的那只數碼管的共陽極數據,通過串行口向74HC164發送數據,只讓一個數碼管的陽極有電,即只點亮一只數碼管
mov 39h,33h ;將要顯示的數碼管的筆畫數據
call ddpp ;調用顯示子程序,對上面的數碼管數據顯示
disp5:cjne r7,#4,disp6
mov 38h,#00001000b ;將要顯的那只數碼管的共陽極數據,通過串行口向74HC164發送數據,只讓一個數碼管的陽極有電,即只點亮一只數碼管
mov 39h,34h ;將要顯示的數碼管的筆畫數據
call ddpp ;調用顯示子程序,對上面的數碼管數據顯示
disp6:cjne r7,#5,disp7
mov 38h,#00000100b ;將要顯的那只數碼管的共陽極數據,通過串行口向74HC164發送數據,只讓一個數碼管的陽極有電,即只點亮一只數碼管
mov 39h,35h ;將要顯示的數碼管的筆畫數據
call ddpp ;調用顯示子程序,對上面的數碼管數據顯示
disp7:cjne r7,#6,disp8
mov 38h,#00000010b ;將要顯的那只數碼管的共陽極數據,通過串行口向74HC164發送數據,只讓一個數碼管的陽極有電,即只點亮一只數碼管
mov 39h,36h ;將要顯示的數碼管的筆畫數據
call ddpp ;調用顯示子程序,對上面的數碼管數據顯示
disp8:cjne r7,#7,disp9
mov 38h,#00000001b ;將要顯的那只數碼管的共陽極數據,通過串行口向74HC164發送數據,只讓一個數碼管的陽極有電,即只點亮一只數碼管
mov 39h,37h ;將要顯示的數碼管的筆畫數據
call ddpp ;調用顯示子程序,對上面的數碼管數據顯示
disp9:
cc1:mov a,30h
cjne a,#16,cced1
mov 30h,#0
mov a,31h
cjne a,#16,cced1
mov 31h,#0
mov a,32h
cjne a,#16,cced1
mov 32h,#0
mov a,33h
cjne a,#16,cced1
mov 33h,#0
mov a,34h
cjne a,#16,cced1
mov 34h,#0
mov a,35h
cjne a,#16,cced1
mov 35h,#0
mov a,36h
cjne a,#16,cced1
mov 36h,#0
cced1:
call key
run:mov a, r1
cjne a,40h,rend0 ;看看和上次掃描的鍵值是否相等?不相等就跳到run1,確保下次時鍵值是相等;相等的話就往下面執行.
jb 00h,rend1 ;保證只執行一次,高電平跳過全部的功能執行
setb 00h ;保證只執行一次,以下是跟據鍵值執行
run1:cjne r1,#0,run2
call yw
run2:cjne r1,#1,run3
call yw
run3:cjne r1,#2,run4
call yw
run4:cjne r1,#3,run5
call yw
run5:cjne r1,#4,run6
call yw
run6:cjne r1,#5,run7
call yw
run7:cjne r1,#6,run8
call yw
run8:cjne r1,#7,run9
call yw
run9:cjne r1,#8,run10
call yw
run10:cjne r1,#9,run11
call yw
run11:cjne r1,#10,run12
call yw
run12:cjne r1,#11,run13
call yw
run13:cjne r1,#12,run14
call yw
run14:cjne r1,#13,run15
call yw
run15:cjne r1,#14,run16
call yw
run16:cjne r1,#15,run17
call yw
run17:jmp rend1
rend0:mov 40h,r1 ;這里很關鍵,當按鍵放開后,或者按了鍵后,總會執行到這里來,
clr 00h;將00h變低,允許下一次程序執行,因此,本程序總是會可靠的只執行一次,達到消抖動和防止執行多次的目的
rend1:
djnz r6,$;延時,讓兩次的鍵盤掃描時間間隔長一些,大于10ms比較好,但不要太長,以免有時按鍵時間太短檢測不到有按鍵
djnz r6,$;延時,讓兩次的鍵盤掃描時間間隔長一些,大于10ms比較好,但不要太長,以免有時按鍵時間太短檢測不到有按鍵
djnz r6,$;延時,讓兩次的鍵盤掃描時間間隔長一些,大于10ms比較好,但不要太長,以免有時按鍵時間太短檢測不到有按鍵
djnz r6,$;延時,讓兩次的鍵盤掃描時間間隔長一些,大于10ms比較好,但不要太長,以免有時按鍵時間太短檢測不到有按鍵
djnz r6,$;延時,讓兩次的鍵盤掃描時間間隔長一些,大于10ms比較好,但不要太長,以免有時按鍵時間太短檢測不到有按鍵
djnz r6,$;延時,讓兩次的鍵盤掃描時間間隔長一些,大于10ms比較好,但不要太長,以免有時按鍵時間太短檢測不到有按鍵
djnz r6,$;延時,讓兩次的鍵盤掃描時間間隔長一些,大于10ms比較好,但不要太長,以免有時按鍵時間太短檢測不到有按鍵
djnz r6,$;延時,讓兩次的鍵盤掃描時間間隔長一些,大于10ms比較好,但不要太長,以免有時按鍵時間太短檢測不到有按鍵
jmp main
key:;這是站長后來經常用的鍵盤掃描程序,現在也只用了四種指令,以前的要占58行,現在的程序只有39行
;;說明:五一電子提供的本例子程序不是從書上和網上抄的,甚至思路都是原創的,寫程序是想到哪兒就寫到哪兒,最后才寫成這樣,
;所以,請大家學習和理解這其中的思路,如果跟某些書上、網上的思路或者代碼有相同或者近似,純屬巧合!
mov p0,#00001111b
mov a,p0
mov p0,#11110000b
add a,p0
mov r1,#51
kn0:cjne a,#01110111b,kn1
mov r1,#0
kn1:cjne a,#10110111b,kn2
mov r1,#1
kn2:cjne a,#11010111b,kn3
mov r1,#2
kn3:cjne a,#11100111b,kn4
mov r1,#3
kn4:cjne a,#01111011b,kn5
mov r1,#4
kn5:cjne a,#10111011b,kn6
mov r1,#5
kn6:cjne a,#11011011b,kn7
mov r1,#6
kn7:cjne a,#11101011b,kn8
mov r1,#7
kn8:cjne a,#01111101b,kn9
mov r1,#8
kn9:cjne a,#10111101b,kn10
mov r1,#9
kn10:cjne a,#11011101b,kn11
mov r1,#10
kn11:cjne a,#11101101b,kn12
mov r1,#11
kn12:cjne a,#01111110b,kn13
mov r1,#12
kn13:cjne a,#10111110b,kn14
mov r1,#13
kn14:cjne a,#11011110b,kn15
mov r1,#14
kn15:cjne a,#11101110b,kend
mov r1,#15
kend:ret
ledtab: db 11101101b,00000101b,11100011b,01100111b,00001111b,01101110b,11101110b,00100101b,11101111b,01101111b,10101111b,11001110b,11101000b,11000111b,11101010b,10101010b,0b
ddpp: mov a,38h ;通過串行口向74HC164發送數據,只讓一個數碼管的陽極有電,即只點亮一只數碼管
mov p1,#0ffh ;向74HC164送數據前要先熄滅LED數碼管顯示,否則,會出"鬼影",因為要確保每一位管對應每一位管的數據
mov sbuf,a
nop
nop
nop
nop
mov a,39h ;累加器讀入要顯示的第一個數
mov dptr,#ledtab
movc a,@a+dptr ;這是唯一的查表指令,作用就是讀出DPTR中的表名中的第幾個數的數據.
cpl a ;可以顯示陰文或者陽文,ledtab是順序存放的0123456789abcdef的LED筆畫關系,根據數碼管的共陰或者共陽,有時高電平是點亮,有時低電平是點亮.
mov p1,a ;放到P1口,顯示出字符
ret
yw:mov a,r1
xch a,37h
xch a,36h
xch a,35h
xch a,34h
xch a,33h
xch a,32h
xch a,31h
xch a,30h
ret
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -