?? asm.asm
字號:
SBRC R16,7
RJMP DSTTL ;任一鍵按下,結(jié)束顯示累加和
RJMP DEALK0 ;程序執(zhí)行完畢,轉(zhuǎn)回
DSCLS: RJMP DSCLOS ;轉(zhuǎn)去關(guān)顯示
SLFTS: ;.............
;.............
RJMP DEALK0 ; 自檢程序執(zhí)行完畢,轉(zhuǎn)回
FDPAP: ;.............
;.............
RJMP DEALK0 ; 走紙程序執(zhí)行完畢,轉(zhuǎn)回
PRSMP: ;.............
;.............
RJMP DEALK0 ; 打印采樣程序執(zhí)行完畢,轉(zhuǎn)回
PRTTL: ;.............
;.............
RJMP DEALK0 ;打印累加和程序執(zhí)行完畢,轉(zhuǎn)回
DSCLK: RCALL BRCLK ;分解系統(tǒng)時鐘送入顯示緩存區(qū)
RCALL DL1S ;延時1秒
RCALL DSPA ;顯示時鐘
SBRC R16,7 ;任一鍵按下,結(jié)束顯示時鐘
RJMP DSCLK
RJMP DEALK0 ;程序執(zhí)行完畢,轉(zhuǎn)回
;.............
;............. ;其他功能鍵處理略
;.............
;范例27 ;主顯子程序
DSPA: SBRC R16,7 ;USE R0,R2,R11,R12,r13,r14,r15,r16,r17&Z,X POINTERS
RJMP DSA2 ;無鍵按下,跳轉(zhuǎn)
DSA0: CLR R12
INC R12 ;有鍵按下,將計數(shù)器置1
DSA1: RCALL DSPY
DEC R12
BRNE DSA1 ;等待鍵釋放
DSA2: RCALL DSPY
LDS R16,$A3
SBRS R16,7 ;有進(jìn)入功能表程序標(biāo)志?
RET ;沒有返回
SBI PORTA,0 ;
SBIS PINA,0 ;退出功能表程序嗎?
RET
CBR R16,$80 ;是,清除進(jìn)入功能表程序標(biāo)志($A3,7)
STS $A3,R16
RCALL FIL2
LDI R16,$0F ;'F'
STS $6C,R16
LDI R16,$0E ;'E'
STS $6E,R16
LDI R16,$17 ;'n'
STS $6F,R16
LDI R16,$0D ;'d'
STS $70,R16 ;顯示‘F End'
RCALL DL2S ;2秒后
RJMP DIPA1 ;轉(zhuǎn)到主程序(包括對堆棧)初始化
DL2S: RCALL DL1S ;延時2秒子程序
DL1S: LDI R16,217 ;延時1秒子程序/4MHz clk
MOV R11,R16 ;4.618×217=1000ms
DLCOM: RCALL DSPA
DEC R11
BRNE DLCOM
RET
;范例28 ;基顯子程序,顯示緩存區(qū):$6C--$73,執(zhí)行時間4.618ms/晶振4MHZ
;主程序應(yīng)對看門狗初始化,設(shè)置溢出時間為0.49秒!
DSPY: LDI R17,$0F ;使用R0,R2,R12,R13,R14,R15,R16&R17/z&x pointer!
OUT DDRA,R15 ;PA7--PA4為鍵列值輸入
CLR R15
COM R15
OUT DDRB,R15
OUT DDRC,R15 ;口B:段選輸出,口C:位選輸出
OUT PORTC,R15 ;關(guān)顯
DPY1: LDI R26,$6C ;指向顯示緩存區(qū)首址:$6C
CLR R27
LDI R17,$7F
MOV R13,R17 ;位選初始化(首顯最高位)
L0D: LD R17,X+
LDI R31,HIGH(table*2)
LDI R30,LOW(table*2)
ADD R30,R17
ADC R31,R27
L0C: LPM ;取段選碼
OUT PORTB,R0 ;送段選口
OUT PORTC,R13 ;位選口
SEC ;
ROR R13 ;指下一位位選
LDI R17,3 ;4MHz(6 if 8MHz)
CLR R14
DLOP: DEC R14
BRNE DLOP
DEC R17
BRNE DLOP ;延時0.5762毫秒
IN R16,PORTA
ORI R16,$F0 ;保護(hù)PA3--PA0輸出
OUT PORTA,R16 ;提拉PA7-PA4
IN R14,PINA ;讀入列值
NEX: ROL R14 ;use high 4bits!
BRCC L1 ;有鍵按下,跳轉(zhuǎn)
NEX1: INC R17 ;指向下一列
CPI R17,4
BRNE NEX ;各列都查完?
NEX2: SER R17
OUT PORTC,R17 ;將$FF寫入位選口(關(guān)顯)
CPI R26,$74
BRNE L0D ;每位LED都顯示一遍??
MOV R16,R15 ;YES
INC R2 ;增一調(diào)DSPY次數(shù)寄存器
MOV R17,R2
CPI R17,100 ;到100次?
BRNE NEX3
CLR R2 ;清除看門狗定時器時間到計數(shù)器/4.618ms×100=0.462s(<0.49s)
WDR ;看門狗定時器復(fù)位
NEX3: RET
L1: LDS R16,$73 ;計算鍵值代碼/查鍵值
SUB R16,R26 ;$73-(r26)-->r16
LSL R16
LSL R16 ;行值*4
ADD R16,R17 ;鍵值代碼=行值*4+列值
LDI R30,LOW(TABL0*2)
ADD R30,R16
LDI R31,HIGH(TABL0*2)
ADC R31,R27
LA00: LPM ;查出鍵值
MOV R15,R0 ;放在R15
LA10: INC R12 ;計數(shù)器增1以備判斷鍵釋放
RJMP NEX1 ;轉(zhuǎn)回查下一列
TABL0: .DB 10,0,11,20,1,2,3,16,4,5,6,22,7,8,9,18,12,15,19,23,14,17,21,13
TABLE: .DB $3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$67,$77,$7C,$39 ;0--C
.DB $5E,$79,$71,$6F,$74,$04,$1F,$40,$38,$37,$54,$5C ;'d'---'o'
.DB $73,$67,$50,$6D,$78,$1C,$3E,$7E,$F8,$6E,$49,$00
.DB $48,$52,$D3,$76 ;$25(=),$26(/)$27(?) END AT $28(H)
.DB $BF,$86,$DB,$CF,$E6,$ED,$FD,$87,$FF,$E7;THE 0.($29)--9.($32)
.DB $D7,$C9,$80 ;THE 'X.' 'Z.' &'.'($33--$35)
.DB $DE,$EF,$B8,$F3,$E7,$D0,$DC,$ED,$86,$F9,$B9H,$F7,$F1,$B7,$D4
;the d.,g.,L.,p.,q.,r.,o.,s.,l.,E.,C.,A.,F.,M.,n.(36--44h)
;范例29 ;鍵入數(shù)字序列左移處理子程序
LSDD8: LDI R26,$6C ;8bcd碼($6C--$73H)
LDS R27,$A3
CBR R27,8 ;清$A3,3
STS $A3,R27
CLR R27
CPI R16,10 ;10為清除鍵
BRNE DDL
RCALL FIL2 ;清除顯示緩存區(qū)($6c-$73)!
LDS R16,$A3
SBR R16,8
STS $A3,R16 ;建清除顯示緩存區(qū)標(biāo)志$A3,3=1
RET
DDL: INC R26 ;數(shù)字鍵按下,序列左移
LD R16,X ;
SUBI R16,$29 ;數(shù)字帶小數(shù)點?
BRCC DD4 ;若帶則將其復(fù)原(參考DSPY子程序段碼表)
SUBI R16,$D7 ;恢復(fù)
DD4: ST -X,R16 ;移入左鄰單元
DD5: INC R26
CPI R26,$73
BRNE DDL ;各數(shù)字都左移了一位?
ST X,R15 ;新鍵入數(shù)字進(jìn)入數(shù)字序列末位
LDI R26,$6C
DEL: LD R16,X
CPI R16,10 ;是BCD碼?
BRCS DEL2
CPI R16,$29
BRCC DELRT ;大于$29為錯誤!
DELA: INC R26 ;0--9/$24/$14為有效!
CPI R26,$73
BRNE DEL ;緩存區(qū)檢查完畢?
RJMP DELRT
DEL2: CPI R16,0
BRNE DELRT
LDI R16,$24 ;0改為空白
ST X,R16
RJMP DELA ;
DELRT: LDS R16,$A0 ;小數(shù)點位置單元
TST R16
BREQ DDRET ;($a0)=0,無小數(shù)點
NEG R16
ADD R16,$73
MOV R26,R16 ;找到緩存區(qū)內(nèi)帶小數(shù)點的數(shù)據(jù)位
LD R16,X
SUBI R16,$D7 ;加上小數(shù)點
ST X,R16
CPI R16,$4D ;在空白碼加了小數(shù)點($24(空白)+$29=$4d)?
BRNE STLR1
LDI R16,$29
ST X,R16 ;是,將其改為'0.'
STLR1: CPI R26,$73
BREQ DDRET ;并將其后所有空白都改為0
INC R26
LD R16,X
CPI R16,$24
BRNE DDRET
CLR R16
ST X,R16
RJMP STLR1
DDRET: RET
FIL2: LDI R26,8 ;在顯示緩存區(qū)內(nèi)填充空白
MOV R14,R26
FIL2A: LDI R26,$6C
FIL: CLR R27
LDI R16,$24
FILP: ST X+,R16
DEC R14
BRNE FILP
RET
;范例30 ;雙鍵輸入檢查數(shù)據(jù)子程序,Ky1數(shù)據(jù)鍵/Ky2回車鍵
KYIN2: LDI R26,$60 ;寄存器地址:portb:$18/ddrb:$17/pinb:$16
CLR R27 ;指向數(shù)據(jù)區(qū)首地址
CBI DDRB,7
CBI DDRB,6 ;pb7和pb6皆為輸入口
SER R17
OUT DDRC,R17 ;c口為數(shù)據(jù)顯示口
LA0: LD R17,X ;取數(shù)據(jù)
CPI R17,$0A
BRCS LA1
CLR R17
LA1: LDI R31,HIGH(table*2)
LDI R30,LOW(table*2);DSPY段選碼表
ADD R30,R17
ADC R31,R27
LPM
COM R0 ;段選碼取出并取反
OUT PORTC,R0 ;送C口
SBI PORTB,7
SBIC $16,7
RJMP NXA1 ;數(shù)字鍵未按下,轉(zhuǎn)
RCALL DL50 ;否則延時
XA2: SBI PORTB,6
SBIC $16,6
RJMP XA0 ;只有數(shù)字鍵按下,轉(zhuǎn)
XA20: RCALL DL50 ;兩鍵都按下,先延時50mS
SBI PORTB,6
SBIS $16,6
RJMP XA20
SBI PORTB,7
SBIS $16,7
RJMP XA20 ;等兩鍵都釋放
RCALL DL50
XA21: SBI PORTB,6
SBIS $16,6
RJMP XA21 ;等待釋放
SBI PORTB,7
SBIS $16,7
RJMP XA21 ;再次等待釋放
RJMP NXA6 ;先按數(shù)字鍵,再按回車鍵,待2都鍵釋放后退出子程序
XA0: SBI PORTB,7
SBIS $16,7
RJMP XA2 ;等待數(shù)字鍵釋放
XA1: RCALL DL50 ;延時
SBI PORTB,7
SBIS $16,7
RJMP XA1 ;再次等待釋放
INC R17 ;數(shù)字增1
CPI R17,10
BRCS NXA1
CLR R17 ;超過10,將鍵值歸為0
NXA1: SBI PORTB,6
SBIC $16,6
RJMP LA1 ;回車鍵也未按下,重新查鍵
RCALL DL50 ;延時
NXA3: SBI PORTB,6
SBIS $16,6
RJMP NXA3 ;再次等待回車鍵釋放
RCALL DL50
SBI PORTB,6
SBIS $16,6
RJMP NXA3
ST X+,R17 ;數(shù)字轉(zhuǎn)入緩存區(qū)
SER R17
OUT PORTB,R17 ;關(guān)顯
RCALL DL50 ;
CPI R26,$70 ;到規(guī)定數(shù)字個數(shù)?
BRNE LA0 ;
LDI R17,$86 ;顯示'E'nd
OUT PORTC,R17 ;
NXA4: SBI PORTB,6
SBIS $16,6
RJMP NXA5 ;回車鍵按下,轉(zhuǎn)
SBI PORTB,7
SBIC $16,7 ;數(shù)字鍵按下,轉(zhuǎn)
RJMP NXA4 ;否則反復(fù)查鍵
NXA40: RCALL DL50
SBI PORTB,7
SBIS $16,7
RJMP NXA40
SBI PORTB,7
SBIS $16,7
RJMP NXA40 ;等待鍵釋放
RJMP KYIN2 ;轉(zhuǎn)檢查鍵入數(shù)據(jù)
NXA5: RCALL DL50
SBI PORTB,6
SBIS $16,6
RJMP NXA5
SBI PORTB,6
SBIS $16,6
RJMP NXA5 ;等回車鍵釋放
NXA6: SER R17
OUT PORTB,R17 ;關(guān)顯,結(jié)束子程序
RET
DL50: ;RCALL DL25 ;延時50毫秒子程序/8Mhz(去掉指令前“;”號)
DL25: CLR R14 ;延時50毫秒子程序/4Mhz
CLR R15
DL50L: DEC R15
NOP
BRNE DL50L
DEC R14
BRNE DL50L
RET
;范例31
LPRNT: SER R17 ;寬行打印機檢測及控打程序
OUT DDRC,R17 ;C口為打印機輸出口!
SBI DDRD,7
CBI DDRD,3 ;pd7為選通輸出口,pd3(INT1)查忙輸入口
SBI PORTD,3
SBIC PIND,3 ;查打印機忙信號
RJMP ERR5 ;打印機尚未工作忙信號即已為高,打印機不能打印
LDI R17,$0D ;寫回車命令給打印機
OUT PORTC,R17
CBI PORTD,7 ;發(fā)出選通信號
NOP
NOP
NOP
SBI PORTD,7 ;strobe
LDI R16,50
TSPRT: SBI PORTD,3
SBIc PIND,3
RJMP LPRT2 ;50次內(nèi)忙信號高起來為正常
DEC R16 ;否則為非正常狀態(tài)
BRNE TSPRT
ERR5: LDI R16,5
RCALL ERRX ;顯示5號錯誤
RJMP DIPA1 ;轉(zhuǎn)主程序初始化
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -