[求救文]嗚~這程式應該怎樣改 8051的程式碼Orz..

酷愛藍天

榮譽會員
已加入
5/19/05
訊息
1,601
互動分數
0
點數
0
年齡
38
就是= =~老師出了這道習題
把以下的8051單鏡片的程式碼修改成倒數模式
以及把16進制改成10進制
這是一個16進制的七段顯示器的計數程式
有大大可以教一下嗎?

怎樣改 還有改成這樣的用意在哪q口q?
我不想只要答案 我還想知道改的用意Q口Q~
因為我也想要學Q_Q~~
還有當中的
MOV TH0,#High(DelayCnt)
MOV TL0,#Low(DelayCnt)

這兩段程式是在做啥的阿Q口Q?


--------------------------我是國界-----------------------------------

ICE_START EQU 1000H
Crystal EQU 11059200
DelayCnt EQU 65536-(8000/108*100)
Addr7seg EQU 0F900H
D7SEG EQU 20H
DATA_7SEGx1 EQU 30H
DATA_7SEGx10 EQU 31H
NUMCNT EQU 33H
ORG ICE_START
AJMP RESET
ORG ICE_START+0BH
AJMP TIMER0
;掃描顯示
TIMER0:
PUSH PSW
PUSH ACC
PUSH DPL
PUSH DPH
MOV TH0,#High(DelayCnt)
MOV TL0,#Low(DelayCnt)
MOV DPTR,#Addr7seg
MOV A,#0FFH
MOVX @DPTR,A
CPL D7SEG.4
CPL D7SEG.5
MOV C,D7SEG.4
MOV P1.4,C
MOV C,D7SEG.5
MOV P1.5,C
ACALL DESPLAY_7seg
POP DPH
POP DPL
POP ACC
POP PSW
RETI

RESET:
;初始化
MOV SP,#70H
MOV D7SEG,#0EFH
MOV TMOD,#01H
MOV TH0,#High(DelayCnt)
MOV TL0,#Low(DelayCnt)
ANL P1,#0CFH
ORL P1,#10H
MOV DATA_7SEGx1,#0
MOV DATA_7SEGx10,#0
SETB EA
SETB ET0
SETB TR0

MAIN: INC R1
MOV A,R1
ANL A,#0FH
MOV DPTR,#NumTAB
MOVC A,@A+DPTR
MOV DATA_7SEGx1,A
MOV A,R1
SWAP A
ANL A,#0FH
MOV DPTR,#NumTAB
MOVC A,@A+DPTR
MOV DATA_7SEGx10,A
MOV R5,#2
Loop: DJNZ R7,Loop
DJNZ R6,Loop
DJNZ R5,Loop
AJMP MAIN

;顯示
DESPLAY_7seg:
DESPLAY0:
JB P1.4,DESPLAY1
PUSH ACC
MOV A,DATA_7SEGx1
JMP DESPLAY
DESPLAY1:
JB P1.5,DESPLAY_Exit
PUSH ACC
MOV A,DATA_7SEGx10
JMP DESPLAY
DESPLAY:
PUSH DPL
PUSH DPH
MOV DPTR,#Addr7seg
MOVX @DPTR,A
POP DPH
POP DPL
POP ACC
DESPLAY_Exit:
RET
NumTAB:
DB 0C0H ;0
DB 0F9H ;1
DB 0A4H ;2
DB 0B0H ;3
DB 099H ;4
DB 092H ;5
DB 082H ;6
DB 0F8H ;7
DB 080H ;8
DB 090H ;9
DB 088H ;A
DB 083H ;B
DB 0C6H ;C
DB 0A1H ;D
DB 086H ;E
DB 08EH ;F

END

--------------------------我是國界------------------------

可以請大大教小弟我嗎Q口Q~~小弟查課本查半天真的想不出所以然來Q_Q~
 

ST-15K.3

我是恐龍..
已加入
9/18/03
訊息
21,569
互動分數
26
點數
48
年齡
45
網站
www.coolaler.com
單鏡片?
 

XD使者

高級會員
已加入
5/4/05
訊息
866
互動分數
0
點數
16
哪邊不懂啊??
PS...有必要寫到那麼複雜嘛= ="
很簡單的東西可以寫到那麼多真是無言
不過很久沒玩了XD
哈~~
有瞎到= ="
 

sean_robot

進階會員
已加入
7/15/07
訊息
458
互動分數
0
點數
16
如果是C我還比較OK...這整個看下來我只認出最後面的是資料庫而已(DATABASE)
 

sauce3794

一般般會員
已加入
10/26/07
訊息
94
互動分數
0
點數
6
如果是C我還比較OK...這整個看下來我只認出最後面的是資料庫而已(DATABASE)

其實後面是 Define Byte (DB) 不是 DATABASE ;smash;
一個 DB 可以定義一個位元組的資料
最後面的組合語言程式碼是用好幾個 DB 組成一個 NumTab
其中每一個DB 是代表七段顯示器顯示 0 ~ 9 所需要亮燈的編號
 
最後編輯:

sauce3794

一般般會員
已加入
10/26/07
訊息
94
互動分數
0
點數
6
樓主 您的sample 太長了 = =|||

我看程式碼的做法是將 R1 暫存器 拿來當累加器 (INC R1)
若要改成倒數計時
您可以先將 R1 設一個數值
例如 : mov R1, 064H
然後再對 R1 跑個迴圈
每次做遞減 ( DEC R1 )
即可達成倒數

自己改改看吧
台灣韌體開發的未來就靠你了 XD
 

酷愛藍天

榮譽會員
已加入
5/19/05
訊息
1,601
互動分數
0
點數
0
年齡
38
我目前發現的只有改倒數的方法= =
就是把最後面定義數字的資料
反過來就好了@@~
但是不知道怎樣把它定義成10進制系統 Orz...
老師整人= =~
課本上的10進位倒數系統就才不到一半的程式碼= =~
 

sauce3794

一般般會員
已加入
10/26/07
訊息
94
互動分數
0
點數
6
我目前發現的只有改倒數的方法= =
就是把最後面定義數字的資料
反過來就好了@@~
但是不知道怎樣把它定義成10進制系統 Orz...
老師整人= =~
課本上的10進位倒數系統就才不到一半的程式碼= =~

改table有點偷雞取巧 = =|||
那要是要做成上數與下數合併的功能
那你不就又暈了
還是老實自己把程式碼幹出來吧
上數用INC
下數用DEC

加油溜
 

cheug21891

初級會員
已加入
4/16/07
訊息
8
互動分數
0
點數
0
年齡
37
樓主 您的sample 太長了 = =|||

我看程式碼的做法是將 R1 暫存器 拿來當累加器 (INC R1)
若要改成倒數計時
您可以先將 R1 設一個數值
例如 : mov R1, 064H
然後再對 R1 跑個迴圈
每次做遞減 ( DEC R1 )
即可達成倒數

自己改改看吧
台灣韌體開發的未來就靠你了 XD

mov R1 064H?
是要把R1放到64H的記憶體上面嗎?
但是老師要我們做的是要放在30~32H裡面說
直接對累加器跑迴圈比較快吧
但是不知道怎嚜做阿
我試過的 但是重點是要把它改成10進位
就是遞減9次以後進位!
但是他還是跳16次= =
16進位倒數我還可以用偷吃步的方式(好像比較快)
但是現在就是不行改資料庫裡的東西(access學到走火?)
而且程式中的
mov tho #HIGH
mov tlo #LOW
這2行是有意義的嗎?
那main裡面要加迴圈的話~
可以教導一下嗎?
因為loop那裡不太懂
謝謝
其實我是他同學'= =';sorry;
 
▌延伸閱讀