?? asm.asm
字號:
;范例18 ;定點小數(shù)十翻二
CONV4: LDI R17,32 ;r12r13r14r15<--r8r9r10r11<--(r12r13r14r15)
MOV R7,R17 ;左移32次
CV4: CLC ;例:$0.FFFFFFD5<--0.99999999
MOV R16,R15 ;$0.FFFFFFFF92<--0.9999999999
RCALL LSDAA
MOV R15,R16
MOV R16,R14
RCALL LSDAA
MOV R14,R16
MOV R16,R13
RCALL LSDAA
MOV R13,R16
MOV R16,R12
RCALL LSDAA
MOV R12,R16 ;定點十進制小數(shù)左移并調整
ROL R11
ROL R10
ROL R9
ROL R8 ;定點二進制小數(shù)帶進位位左移一位
DEC R7
BRNE CV4
MOV R12,R8 ;最終結果轉入R12--R15
MOV R13,R9
MOV R14,R10
MOV R15,R11
RET
AVR實用程序
;范例19 ;等步距線性內插計算子程序
.EQU TBLGTH=10
CHETA: LDI R16,TBLGTH-1 ;r16<--表長(即字數(shù))-1
LDI R31,HIGH(chtbl*2);y0(函數(shù)初值)在r14r15,STEP(步長)在r10r11,自變量X在r12r13
LDI R30,LOW(chtbl*2+1);查表指針,首指數(shù)據(jù)表第1字之高位字節(jié)!
RCALL CPMR1 ;X與表中第一個字型數(shù)據(jù)(X0)比較
BRCC CHRET ;X<X0 查表結束,Y=Y0
CHET1: RCALL CMPR1 ;X與表中下一個數(shù)據(jù)比較
BRCC NX33 ;X<X(i+1) 找到插值區(qū)間
ADD R15,R11 ;否則Y0中加入一個STEP:Yk=Y0+k*step(步距為負時則
;減去|STEP|)
ADC R14,R10
DEC R16
BRNE CHET1 ;未查到表格終值,循環(huán);否則結束,Y取得最大值Yn
CHRET: RET
NX33: SBIW R30,5 ;指針退回(-5),指向Xi
MOV R8,R14
MOV R9,R15 ;保存Y0+i*STEP
RCALL SUBS ;(X-Xi)-->r16r17
MOV R15,R17
MOV R14,R16 ;轉入r14r15
RCALL MUL16 ;(X-Xi)*STEP-->r12r13r14r15
MOV R10,R12
MOV R11,R13 ;保存乘積高位字
LPM ;X(i+1)低位字節(jié)
MOV R13,R0
ADIW R30,1
LPM ;X(i+1)高位字節(jié)
MOV R12,R0
SBIW R30,3 ;指針指向Xi
RCALL SUBS ;X(i+1)-Xi-->r16r17
MOV R12,R10
MOV R13,R11 ;取回乘積高位字
MOV R10,R16
MOV R11,R17 ;X(i+1)-Xi-->r10r11
RCALL DIV165 ;(X-Xi)*STEP/[X(i+1)-Xi]-->r14r15
ADD R15,R9
ADC R14,R8 ;Y0+i*STEP+(X-Xi)*STEP/[X(i+1)-Xi]-->r14r15
RET ;若STEP為負值則改為計算(r8r9)減去(r14r15)之值
CMPR1: LPM ;取數(shù)據(jù)高位字節(jié)
ADIW R30,2 ;指向下一數(shù)據(jù)的高位字節(jié)
CP R0,R12 ;與X高位字節(jié)相比較
BRNE CPRT1 ;不相等即轉出
SBIW R30,3 ;否則調整指針
LPM ;取數(shù)據(jù)低位字節(jié)
ADIW R30,3 ;指向下一數(shù)據(jù)的高位字節(jié)
CP R0,R13 ;與X低位字節(jié)相比較
CPRT1: RET ;以進位C帶回比較結果
SUBS: LPM ;計算(X-Xi)或[X(i+1)-Xi]并送入r16r17
MOV R5,R0 ;取Xi低位字節(jié)
ADIW R30,1
LPM ;取Xi高位字節(jié)
SBIW R30,1 ;仍指向Xi低位字節(jié)
SUB R13,R5
MOV R17,R13
SBC R12,R0
MOV R16,R12 ;計算差并將其轉入R16R17
RET
;自變量x表長為12字
CHTBL:DW 19214,23404,27600,32799,37009,40211,45414,48618,51821,55029,57787,60070
;步距表長為11字
STEPT: DW 356,366,379,395,415,440,471,509,555,603,657
;不等步距線性內插計算子程序,步距表首址在R6R7中
;自變量X在R12R13之中, 函數(shù)初值Y0在R14R15中
;范例20 ;表長(字個數(shù))-1在R16中
CHTSTP: LDI R31,HIGH(chtbl*2)
LDI R30,LOW(chtbl*2+1);查表指針
LDI R16,LOW(stept*2)
MOV R7,R16
LDI R16,HIGH(stept*2)
MOV R6,R16 ;步距表指針
LDI R16,TBLGTH-1 ;r16<--表長(字個數(shù))-1
RCALL CMPR1 ;X與表首數(shù)據(jù)比較
BRCC CHSTPT ;X<X0 查表結束,有Y=Y0
CHSTP1: RCALL CMPR1 ;否則與表中下一數(shù)據(jù)比較
BRCC CHSTP3 ;X<X(i+1),找到插值區(qū)間!
RCALL GTSTP ;查表取STEP字型變量
ADD R15,R11 ;Y0<--Y0+STEPk
ADC R14,R10
DEC R16
BRNE CHSTP1 ;未查到表格終值循環(huán);否則結束,Y取得最大值Yn
CHSTPT: RET
CHSTP3: SBIW R30,5 ;指針退回,指向Xi低位字節(jié)
MOV R8,R14
MOV R9,R15 ;Y0+∑STEPk送入r14 r15
RCALL SUBS ;(X-Xi)->r16r17
MOV R15,R17
MOV R14,R16 ;(X-Xi)轉入R14R15
RCALL GTSTP ;查表取STEPi-->R10R11
RCALL MUL16 ;(X-Xi)*STEPi-->R12R13R14R15
MOV R10,R12
MOV R11,R13 ;保存積高位字
LPM
MOV R13,R0
ADIW R30,1
LPM
MOV R12,R0
SBIW R30,3
RCALL SUBS ;(X(i+1)-Xi)-->r16 r17
MOV R12,R10
MOV R13,R11
MOV R10,R16
MOV R11,R17 ;取回積高位字 &(X(i+1)-Xi)-->r10r11
RCALL DIV165 ;(X-Xi)*STEPi/[X(i+1)-Xi]-->r14r15
ADD R15,R9 ;
ADC R14,R8 ;Y0+∑STEPk+(X-Xi)*STEPi/[X(i+1)-Xi]-->r14r15
RET
GTSTP: MOV R5,R6 ;查取STEP字型變量/POINTER in r6r7!
MOV R6,R30
MOV R30,R5
MOV R5,R7
MOV R7,R31
MOV R31,R5 ;(r6r7)<-->Z
LPM
MOV R11,R0
ADIW R30,1
LPM
MOV R10,R0 ;STEPk取到r10r11
ADIW R30,1
MOV R5,R6
MOV R6,R30
MOV R30,R5
MOV R5,R7
MOV R7,R31
MOV R31,R5 ;指針增2后送回r6r7
RET
;范例21 ;功能表程序
FUNC2: LDS R16,$A3 ;use r0,r8,r9,r10,r11,r16&r17/& subprogram dspa
SBR R16,$80 ;功能表程序標志
STS $A3,R16
LDI YH,2
LDI YL,0 ;功能內容表SRAM地址
RCALL FLFUNC ;CLR r27!
LDI R16,2
ST X,R16 ;顯示'FUNC.2'
RCALL DL2S
CLR R9 ;功能內容尋址偏移量R9!
CLR R8 ;功能名稱尋址偏移量(R8)=(r9)*3
FFUNC0: RCALL DSF_ ;顯示'F- '
FF0: RCALL DSPA ;in subprogram dspy clr. r27!
CPI R16,11 ;回車鍵按下?
BRNE FF2P
FF0C: RCALL COMBNO ;合成功能名稱送入r16
CPI R16,20 ;是最后一個功能名稱?
BRNE FF1
CLR R9 ;是,兩偏移量初始化!
CLR R8
FF1: LDI ZH,HIGH(FTABL*2)
LDI ZL,LOW(FTABL*2);功能名稱表指針
ADD ZL,R8
ADC ZH,R27 ;(r27)=0 ALWAYS
LPM
MOV R16,R0
RCALL BRA3A ;分解新功能名稱到$6E/$6F
FF0G: LDI R28,0
ADD R28,R9 ;功能內容指針加偏移量
LD R16,Y
LDI R26,$72
RCALL BRAX ;將新功能內容分解到$72/$73
FF0A: RCALL DSPA ;顯示新功能名稱/內容
CPI R16,11
BRNE FF0B ;回車鍵按下?
INC R8
INC R8
INC R8 ;是,功能名稱尋址偏移量加3
INC R9 ;功能內容尋址偏移量加1
RJMP FF0C ;轉回
FF2P: RJMP FF2
FF0B: CPI R16,10
BRNE FF0D
RCALL DSF_ ;清除鍵按下,清除顯示區(qū)后,顯示‘F-’
FF1B: RCALL DSPA
CPI R16,11
BREQ FF1 ;轉恢復當前顯示
CPI R16,10
BRCC FF1B
RJMP FF2D ;只有數(shù)字鍵按下才轉出去處理
FF0D: CPI R16,10
BRCC FF0A
FF1D: LDI R17,$24 ;
STS $73,R17 ;數(shù)字鍵處理,先在緩存區(qū)內放一空白
FF0E: LDS R17,$73
STS $72,R17 ;鍵入數(shù)字左移
STS $73,R16 ;存入新數(shù)字
FF0F: RCALL DSPA
CPI R16,10
BREQ FF0G ;清除鍵按下,恢復顯示舊功能內容
BRCS FF0E ;鍵入數(shù)字左移更新
CPI R16,11
BRNE FF0F
LDS R26,$72 ;回車鍵按下
RCALL COMBA ;合成新功能內容(combin $72&$73 into binary(r16))
MOV R17,R8
INC R17
LDI ZH,HIGH(FTABL*2)
LDI ZL,LOW(FTABL*2)
ADD ZL,R17 ;取當前功能內容下限
ADC ZH,R27
FF1F: LPM
CP R16,R0
BRCS DSER2 ;新功能內容小于下限,錯誤
INC R17
LDI ZH,HIGH(FTABL*2)
LDI ZL,LOW(FTABL*2)
ADD ZL,R17 ;取當前功能內容上限
ADC ZH,R27
LPM
CP R0,R16
BRCS DSER3 ;新功能內容大于上限,錯誤
FF7: LDI R28,0
ADD R28,R9 ;功能內容表首地址為$200!
ST Y,R16 ;合法的新功能內容進入功能內容表
INC R9
INC R8
INC R8
INC R8 ;調整偏移量,進入下一個功能顯示
RJMP FF0C
FF1P: RJMP FF1
DSER2: RCALL FERR2 ;顯示'F Err.2'2秒
RCALL EXCH0
RJMP FF0G ;恢復原數(shù)據(jù)顯示
DSER3: RCALL FERR3 ;顯示'F Err.3'2秒
RCALL EXCH0
RJMP FF0G ;恢復原數(shù)據(jù)顯示
FF2: CPI R16,10
BRCS FF2D ;功能鍵按下,轉初始
RJMP FF0
FF2D: LDI R17,$24 ;數(shù)字鍵按下,在顯示緩存區(qū)內左移
STS $6F,R17 ;
FF3: LDS R17,$6F
STS $6E,R17
STS $6F,R16
FF4: RCALL DSPA
CPI R16,10
BRNE FF41
RCALL DSF_ ;清除數(shù)字,顯示‘F-’
FF40: RCALL DSPA
CPI R16,11
BREQ FF1P ;轉回顯示當前功能名稱及內容
CPI R16,10
BRCC FF40 ;無效鍵按下,轉回
RJMP FF2D ;否則轉數(shù)字處理
FF41: BRCS FF3
CPI R16,11
BRNE FF4
RCALL COMBNO ;合成新功能名稱
CLR R10 ;功能名稱偏移量計數(shù)器清除
CLR R11 ;功能內容偏移量計數(shù)器清除
SFFLP: LDI ZH,HIGH(FTABL*2)
LDI ZL,LOW(FTABL*2)
ADD ZL,R10
ADC ZH,R27
LPM
CP R0,R16 ;
BREQ SFFND ;在功能名稱表中找到新名稱
INC R11 ;
INC R10
INC R10
INC R10 ;調整偏移量
LDI R17,60
CP R10,R17 ;功能名稱指針偏移量超過59?
BRCS SFFLP ;否,繼續(xù)查功能名稱表
RCALL FERR1 ;查完功能名稱表未查到鍵入功能名稱!
RJMP FFUNC0 ;轉回恢復原顯示
SFFND: MOV R9,R11 ;得到功能內容指針偏移量
MOV R8,R10 ;得到功能名稱指針偏移量
RJMP FF0G ;轉顯示新功能名稱及內容
FTABL: .DB 1,0,1,2,1,8,3,0,2,4,0,1 5,1,2,6,0,4,7,1,4,8,1,2,9,2,7,10,1,5,11,1
.DB 5,12,0,5,13,1,2,14,1,7,15,1,10,16,1,4,17,2,4,18,2,5,19,1,2,20,1,3
COMBNO: LDI XL,$6E ;取$6E$6F中的BCD碼,合成新功能名稱子程序
COMBA: LD R16,X+
CPI R16,$24
BRNE CMBA
CLR R16
CMBA: MOV R0,R16
LSL R16
LSL R16
ADD R16,R0
LSL R16 ;高位BCD乘10
LD R0,X
ADD R16,R0 ;加低位BCD
RET
DSF_: RCALL FIL8 ;準備顯示'F- '
LDI R16,$0F
STS $6C,R16
LDI R16,$14
STS $6D,R16
RET
BRA3A: LDI XL,$6E ;二進制數(shù)轉換為兩位BCD碼并顯示
BRAX: LDI R17,$24 ;十位為0時顯示空白
ST X,R17
BRHOUR: CLR R0 ;
BRX0: SUBI R16,10 ;減10
BRCS BRX2
INC R0
RJMP BRX0
BRX2: SUBI R16,-10 ;不夠減恢復出十位BCD
TST R0
BREQ BRX1
ST X,R0 ;放入顯示區(qū)
BRX1: INC R26
ST X,R16
BRART: RET
FERR1: LDI XL,$71 ;顯示'F Err.1'
LDI R16,1
ST X,R16
RJMP FER123
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -