📄 speed stacks.asm
字号:
;*****************************************************; LIST P=SH66P13 ROMSIZE=4096;*****************************************************; SYSTEM REGISTER $00-$2FH BANK0;***************************************************** IE EQU 00H ;中断使能标志 IRQ EQU 01H ;中断请求标志 TM0 EQU 02H ;Timer0 模式寄存器 BTM EQU 03H ;BASE TIMER TL0 EQU 04H ;Timer0 数据寄存器低四位 TH0 EQU 05H ;Timer0 数据寄存器高四位 ;06-07Hreserved PORTA EQU 08H ;Port A 数据寄存器 PORTB EQU 09H ;Port B PORTC EQU 0AH ;bounding option PACR EQU 0BH PBCR EQU 0CH LPD EQU 0DH TBR EQU 0EH ;查表寄存器 INX EQU 0FH ;索引寄存器 DPL EQU 10H ;INX 数据指针低四位 DPM EQU 11H ;INX 数据指针中三位 DPH EQU 12H ;INX 数据指针高三位 ;$13-$14 RESERVED PULL EQU 13H ;PORTD MODE register OSC_CTL EQU 14H ;OSCillator type selected LCD_CTL EQU 15H ;LCD ON/OFF CONTRL LCD_SEGOUT EQU 16H ;LCD SEGMENT CONTRL OCTL EQU 17H ;CHANNCLE 1 LOW NIBBLE OCTH EQU 18H ;CHANNCLE 1 HIGH NIBBLE,BIT3:OCT:octave shift selected control PSG_CTL EQU 1EH ;(bit1-0)PSG MODE CONTRL&(bit3-2)clock source selected PSG_CHEN EQU 1DH ;PSG:$17-$1E ;1FH --Reserved;*****************************************************; SYSTEM REGISTER $20-$1fFH ($20-$7f::bank0);***************************************************** AcBak EQU 20H Temp EQU 21H MsReg0 EQU 22H ;毫秒寄存器L MsReg1 EQU 23H ;M MsReg2 EQU 24H ;H MsReg3 EQU 25H ;HH SecRegL EQU 26H ;秒 SecRegH EQU 27H MinRegL EQU 28H ;分钟 MinRegH EQU 29H TimeFlg EQU 30H ;ms30_flg=bit0 ;Min10_flg=bit1 ;Min5_flg=bit2(wait reset,wait touch) ; LedFFlg EQU 31H ;led flash flg=bit0 ;two touching input hold 1s flg=bit1 SysRunFlg EQU 32H ;run_flg=bit0 ;disp_flg=bit1 ;keyenb_flg=bit2 ;touch_procflg=bit3 TimKRegL EQU 33H TimKRegH EQU 34H TimSRegH EQU 35H TimSRegL EQU 36H Key1Temp EQU 37H Key2Temp EQU 38H Key3Temp EQU 39H Key4Temp EQU 3AH LastKeyL EQU 3BH LastKeyH EQU 3CH WaitTFlg EQU 3DH ;wait reset flg=bit0 ;wai touch input flg=bit1 ;保持1S计时标志=bit2 KeyTime EQU 3EH KeyTemp EQU 3FH Key_flg EQU 40H ;bit0=reset_keyflg ;bit1=touch_keyflg ;已触摸标志=bit2(计时开始标志) ;已触摸标志=bit3 Stop_flg EQU 41H Sec_flg EQU 42H ;bit0=sec_flg ;bit1=TEST_FLG ;BIT3=SYS_FLG Tc0Reg EQU 43H KeyPressL EQU 44H KeyPressH EQU 45H FlashReg EQU 46H JsReg1 EQU 47H JsReg2 EQU 48H JsReg3 EQU 49H JsReg4 EQU 4AH JsReg5 EQU 4BH DispRegL EQU 4CH DispRegH EQU 4DH SysTime1 EQU 4eH SysTime2 EQU 4fH SysTime3 EQU 50H DelayReg1 EQU 51H DelayReg2 EQU 52H XmJsFlg EQU 53H XmJsRegL EQU 54H XmJsRegM EQU 55H XmJsRegH EQU 56H AddReg EQU 57H touchreg EQU 58H TestFlg EQU 59H QickReg EQU 5aH testRegL EQU 5BH testRegM EQU 5CH testRegH EQU 5dH dispflg EQU 5EH; tflg EQU 5fH;*****************************************************; SYSTEM REGISTER $300-$321H BANK6(LCD);***************************************************** Seg1 EQU 00H Seg2 EQU 01H Seg3 EQU 02H Seg4 EQU 03H Seg5 EQU 04H Seg6 EQU 05H Seg7 EQU 06H Seg8 EQU 07H ;SEG8 寄存器 Seg9 EQU 08H ;SEG9 寄存器 Seg10 EQU 09H ;SEG10 寄存器 ;*****************************************************; VECTORS;***************************************************** ORG 0000H jmp Reset ;Jump to RESET service routine jmp INT0_Isp ;jump to INT0 service routine JMP Timer0_Isp ;timer0 interrupt service routine nop ;jump to base time service routine nop ;JMP TO INT1 service routine rtni ;*****************************************************; INITIALIZTION;*****************************************************Reset: nop nop nop ldi IRQ,00H ;清中断请求 ldi IE,00H ;关中断 nop ;上电稳定 nop nop nop ;*****************************************************;*****************************************************POWER_RESET: ;clear data ram ldi DPL,00H ;20H--1FFH ldi DPM,02H ;0-511(512) ldi DPH,00H POWER_RESET_1: ldi INX,00H adim DPL,01H ldi TBR,00H adcm DPM,00H ba3 POWER_RESET_2 jmp POWER_RESET_3POWER_RESET_2: adim DPH,01H andim DPM,07H ;clear bit3POWER_RESET_3: sbi DPH,04H bnz POWER_RESET_1; SBI DPM,04H; BNZ POWER_RESET_1CLR_LCD: ldi DPL,00H ;clear LCD ram ldi DPM,00H ldi DPH,06HCLR_LCD_1: ldi INX,00H adim DPL,01HCLR_LCD_2: sbi DPL,0aH ;10 seg bnz CLR_LCD_1 ;timer ldi TM0,1110B ldi TL0,07H ldi TH0,0DH ldi OSC_CTL,0000b ;PSG ldi PSG_CTL,0010b ldi OCTL,0001b ldi OCTH,1000b ldi PSG_CHEN,0101B ;LCD ldi LCD_CTL,0001B ldi LCD_SEGOUT,1000b ;I/O ldi PACR,1110B ldi PORTA,1101B ldi PBCR,0100B ldi PORTB,0100B ldi PULL,0010b ;bit3=close pull up,PA:bit1=PSG outpuT ;*****************************************************; MAIN;***************************************************** ldi IRQ,0 ;清中断请求 ldi IE,0100B ;开中断 call FnTestmode ;进入测试模式 lda TestFlg,0 ba0 qickcheck jmp sys_stopqickcheck: call FnQickcheck ;快检 call TestLcdproc call waitouchproc lda TestFlg,0 ba0 qickcheck jmp sys_stop main_loop_part: call FnTimeFP call FnKeyProc call FnTouchProc call FnLcdDispPrc call FnJustProc ;------------------------------------------------- lda XmJsFlg,0 ba1 sys_stop halt nop nop nop jmp main_loop_part sys_stop: andim XmJsFlg,0000b ;关机进入:stop ldi PORTB,0100B ;bit2=1关 ldi KeyTime,0 ldi IRQ,0000B ;清外部中断请求 ldi IE,1100b ;打开外部中断 stop nop nop nop ;I/O ldi PACR,1110B ;bit3:green,bit2:red led output; ldi PORTA,1101B ;bit1=PSG OUTPUT ldi PBCR,0100B ;key input,BIT2=OUTPUT ldi PORTB,0000B ;bit2=0开 ldi PULL,0010b ;bit3=close pull up,PA:bit1=PSG outpuT; lda PORTA,0; sta Temp,0; andim Temp,0001b; baz $+2; jmp sys_stop ; lda PORTA,0; sta Temp,0; andim Temp,0001b; baz $+2 ;有键; jmp sys_stopssys_on: adim KeyTime,1 orim SysRunFlg,0111b ldi LedFFlg,0000b ldi Stop_flg,0000b ldi Key_flg,0000b ldi JsReg1,0 ldi JsReg2,0 ldi JsReg3,0 ldi JsReg4,0 ldi JsReg5,0 ldi PBCR,0100B ldi PORTB,0000B orim PORTA,1100b lda MsReg1,0 or MsReg2,0 baz $+3wait_reset: orim WaitTFlg,0001b ;等待复位标志 jmp main_loop_part lda SecRegL,0 baz $+2 jmp wait_reset andim WaitTFlg,1110b ;不用等待复位 orim WaitTFlg,0010b ;等待TOUCH orim Key_flg,0001b jmp main_loop_part ;***************************************************** DELAY10MS: ;延时10MS ldi DelayReg1,03HjDelayReg1: ldi DelayReg2,08HjDelayReg2: sbim DelayReg2,1 baz $+2 jmp jDelayReg2 sbim DelayReg1,1 baz DELAY10MSend jmp jDelayReg1DELAY10MSend: rtni;***************************************************** ; test mode;***************************************************** FnTestmode: lda PORTB,0 ba3 FnTestmodend call DELAY10MS; call DELAY10MS lda PORTB,0 ba3 FnTestmodend orim TestFlg,0001bFnTestmodend: rtni;***************************************************** FnQickcheck: lda TestFlg,0 ba0 $+2 jmp FnQickcheckend lda TestFlg,0 ba1 FnQickcheckend lda Sec_flg,0 ba1 $+2 jmp FnQickcheckend andim Sec_flg,1101b orim dispflg,0001b adim QickReg,1 sbi QickReg,1 baz xian0 sbi QickReg,2 baz xian1 sbi QickReg,3 baz xian2 sbi QickReg,4 baz xian3 sbi QickReg,5 baz xian4 sbi QickReg,6 baz xian5 sbi QickReg,7 baz xian6 sbi QickReg,8 baz xian7 sbi QickReg,9 baz xian8 sbi QickReg,0ah baz xian9 sbi QickReg,0bh baz xianred sbi QickReg,0ch baz xiangreencloseAll: ldi QickReg,0 orim PORTA,1100B ldi DPL,00H ;clear LCD ram ldi DPM,00H ldi DPH,06HcloseLcd1: ldi INX,00H adim DPL,01H sbi DPL,0aH ;10 seg bnz closeLcd1 orim TestFlg,0010b ldi dispflg,0 jmp FnQickcheckendxian0: ldi Temp,0 call songSeg jmp FnQickcheckendxian1: ldi Temp,1 call songSeg jmp FnQickcheckend xian2: ldi Temp,2 call songSeg jmp FnQickcheckend xian3: ldi Temp,3 call songSeg jmp FnQickcheckendxian4: ldi Temp,4 call songSeg jmp FnQickcheckend xian5: ldi Temp,5 call songSeg jmp FnQickcheckendxian6: ldi Temp,6 call songSeg jmp FnQickcheckend xian7: ldi Temp,7 call songSeg jmp FnQickcheckendxian8: ldi Temp,8 call songSeg jmp FnQickcheckendxian9: ldi Temp,9 call songSeg jmp FnQickcheckend ;------------------------------------------------- songSeg: sta SecRegL,0 sta SecRegH,0 sta MsReg1,0 sta MsReg2,0 sta MinRegL,0 songSegend: rtni;------------------------------------------------------- xianred: ldi dispflg,0 ldi DPL,00H ;clear LCD ram ldi DPM,00H ldi DPH,06HcloseLcd: ldi INX,00H adim DPL,01H sbi DPL,0aH ;10 seg bnz closeLcd orim PORTA,1100b andim PORTA,1011B jmp FnQickcheckendxiangreen: ldi dispflg,0 orim PORTA,1100b andim PORTA,0111B ; jmp FnQickcheckend FnQickcheckend: rtni;***************************************************** waitouchproc: lda TestFlg,0 ba0 $+2 jmp waitouchped lda TestFlg,0 ba1 $+2 jmp waitouchped lda Sec_flg,0 ba1 $+2 jmp waitouchped andim Sec_flg,1101b orim PORTA,1100B lda TestFlg,0 ba2 $+2 jmp testproc1 lda TestFlg,0 ba3 $+2 jmp testproc2; orim TestFlg,1000b andim TestFlg,0000b jmp waitouchpedtestproc1: lda PORTB,0 ba0 $+2 jmp testproc2 lda TestFlg,0 ba2 waitouchped orim PORTA,1100B andim PORTA,0111b orim TestFlg,0100b jmp waitouchped testproc2: lda PORTB,0 ba1 $+2 jmp waitouchped lda TestFlg,0 ba3 waitouchped orim PORTA,1100B andim PORTA,1011b orim TestFlg,1000bwaitouchped: rtni ;***************************************************** ;*********** scan key process ;*************;***************************************************** FnScanKey: lda PORTB,0 sta Key1Temp,0 lda PORTA,0 sta Key3Temp,0 andim Key3Temp,0001b nop nop nop nop nop nop nop nop nop nop lda PORTA,0 sta Key4Temp,0 andim Key4Temp,0001b sub Key3Temp,0 bnz next_key lda Key4Temp,0 sta LastKeyH,0next_key: lda PORTB,0 sta Key2Temp,0 sub Key1Temp,0 bnz FnScanKeyEnd lda Key2Temp,0 sta LastKeyL,0FnScanKeyEnd: rtni ;***************************************************** ;*********** key process ;*************;***************************************************** FnKeyProc: lda SysRunFlg,0 ba2 $+2 ;keyenb_flg=1 jmp FnKeyProcEnd andim SysRunFlg,1011b call FnScanKey ;扫键 lda LastKeyL,0 sub KeyPressL,0 baz KEY_NOFREE lda LastKeyL,0 sta KeyPressL,0 andim KeyPressL,1000b
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -