?? main.asm
字號:
VOICE_DEC_ING: SBIM VOICE_BACK_L,01H LDI R0,00H SBCM VOICE_BACK_H,00H LDI SEND_COM,0DH CALL SEND_COMMAND ;如果文件夾的編號還沒有減到0,則再發送一個 CALL DELAY_20MS ;每寫完1位延時5MS CALL DELAY_20MS ;每寫完1位延時5MS CALL DELAY_20MS ;每寫完1位延時5MS CALL DELAY_20MS ;每寫完1位延時5MS CALL DELAY_5MS ;每寫完1位延時5MS CALL DELAY_5MS ;每寫完1位延時5MS JMP VOICE_DECVOICE_CHANGE_ADD: SBIM VOICE_BACK_L,0FH LDI R0 ,00H SBCM VOICE_BACK_H,00H ;減去初始音量 JMP VOICE_ADJUST VOICE_NO_CHANGE: LDI DATA_L,0AH LDI DATA_H,01H ;設定寫入I2C的值 LDI DATA_ADDRL,04H LDI DATA_ADDRH,00H ;寫入頻率的位置為01H CALL WRITE_DATA ;將默認訴頻率值寫入給I2C,以便記憶 CALL DELAY_5MS ; LDI DATA_ADDRH,00H; LDI DATA_ADDRL,04H; CALL READ_DATA ;讀出音階 LDI VOICE_CNT_L,0AH LDI VOICE_BACK_L,00H LDI VOICE_CNT_H,01H LDI VOICE_BACK_H,01H VOICE_ADJUST:;調整音階的子程序 LDA VOICE_BACK_H ,00H BNZ VOICE_ADJUST_ING LDA VOICE_BACK_L ,00H BAZ VOICE_EXITVOICE_ADJUST_ING: SBIM VOICE_BACK_L,01H LDI R0,00H SBCM VOICE_BACK_H,00H LDI SEND_COM,0CH CALL SEND_COMMAND ;如果文件夾的編號還沒有減到0,則再發送一個 CALL DELAY_20MS ;每寫完1位延時5MS CALL DELAY_20MS ;每寫完1位延時5MS CALL DELAY_20MS ;每寫完1位延時5MS CALL DELAY_20MS ;每寫完1位延時5MS CALL DELAY_5MS ;每寫完1位延時5MS CALL DELAY_5MS ;每寫完1位延時5MS JMP VOICE_ADJUST VOICE_EXIT: JMP MAIN_VOICE;-----------------------------------------------------------------INT_TIMER0: ; ;這里發個波形是為了檢測2MS波形是否標準 LDA IRQ ,00H BA2 $+2 JMP TIMER_CNT_EXIT ANDIM IRQ ,1011B ADIM KEY_TIMER,01H ;發送按鍵的時間定時器 ADIM TIMER_10MS,01H SBI TIMER_10MS,0AH BNZ TIMER_CNT_EXIT LDI TIMER_10MS,00H adim TIMER_100MS,01H SBI TIMER_100MS,0AH BNC TIMER_CNT_EXIT LDI TIMER_100MS,00H ADIM KEY_CONT_TIMER,01H LDA WORK_FLAG ,00H ;如果是在上電中,則LED閃爍,否則常亮 BA0 LED_DISPLAY JMP LED_NO_DISLED_DISPLAY: ADIM DISPLAY_TIMER,01H SBI DISPLAY_TIMER,05H BNC LED_DIS_END LDI DISPLAY_TIMER,00H EORIM PC_TMP ,1000B STA PC JMP LED_DIS_ENDLED_NO_DIS: LDI DISPLAY_TIMER,00H ORIM PC_TMP ,1000B STA PCLED_DIS_END: adim TIMER_1S,01H SBI TIMER_1S,05H ;每500MS讀1次 BNC TIMER_CNT_EXIT LDI TIMER_1S,00H ; EORIM PC_TMP ,1000B; STA PC; ADIM ADJUST_TIMER,01H ;此句因為已經把程序中的MODE鍵取消,故不用; SBI ADJUST_TIMER,05H; BNC TIMER_CNT_EXIT; ANDIM WORK_FLAG,1101B LDI SEND_COM,09H CALL SEND_COMMAND ;讀出MP3的狀態 CALL DELAY_5MS ;比較文件夾與文件是否與以前一樣 LDA RD_STATUS10,00H SUB DIR_BACK_H,00H BNZ INT_BACK_DIR_FILE LDA RD_STATUS9,00H SUB DIR_BACK_L,00H BNZ INT_BACK_DIR_FILE LDA RD_STATUS6,00H SUB FILE_BACK_H BNZ INT_BACK_DIR_FILE LDA RD_STATUS5,00H SUB FILE_BACK_L BAZ TIMER_CNT_EXITINT_BACK_DIR_FILE:;如果4項里有任何一個不相同,則備份數據,寫入24C01 LDA RD_STATUS10,00H STA DIR_BACK_H,00H LDA RD_STATUS9,00H STA DIR_BACK_L,00H LDA RD_STATUS6,00H STA FILE_BACK_H,00H LDA RD_STATUS5,00H STA FILE_BACK_L,00H LDI DATA_ADDRL,02H LDI DATA_ADDRH,00H ;寫入頻率的位置為01H LDA DIR_BACK_L,00H STA DATA_L,00H LDA DIR_BACK_H,00H STA DATA_H,00H ;設定寫入I2C的值 CALL WRITE_DATA ;將默認訴頻率值寫入給I2C,以便記憶 CALL DELAY_5MS LDI DATA_ADDRL,03H LDI DATA_ADDRH,00H ;寫入頻率的位置為01H LDA FILE_BACK_L,00H STA DATA_L,00H LDA FILE_BACK_H,00H STA DATA_H,00H ;設定寫入I2C的值 CALL WRITE_DATA ;將默認訴頻率值寫入給I2C,以便記憶 CALL DELAY_5MS TIMER_CNT_EXIT: JMP MAIN_INT_TIMER0;=================================================================;KEY_TIMER equ 00h ;掃描按鍵的定時器;KEY_SCAN_CNT equ 00h ;按鍵掃描次數計數器;KEY_VAL1 equ 00H ;按鍵值的寄存器1;KEY_VAL1.0 ;PLWY/PAUSE的標志;KEY_VAL1.1 ;PAUSE的標志;KEY_VAL1.2 ;FB+或ADD的標志;KEY_VAL1.3 ;FB-或DEC的標志;KEY_VAL2 equ 00H ;按鍵值寄存器2;KEY_VAL1.3 ;MODE的標志;SEND_COM equ 00h ;按鍵壓下后發送的命令類型;=================================================================KEY_SCAN: SBI KEY_TIMER,02H BNC KEY_SCAN_EXIT LDI KEY_TIMER,00H ;再等2MS重新掃鍵 NOP NOP NOP LDA PB STA R0 ,00H EORIM R0 ,1111B;----------------------------------------------------------------- LDA KEY_VAL,00H SUB R0 ,00H BAZ KEY_SAMEKEY_DIF: LDA R0 ,00H STA KEY_VAL ,00H ;兩次檢測的按鍵值并不相同,則備份 LDI KEY_CNT,00H JMP KEY_SCAN_EXITKEY_SAME: ADIM KEY_CNT ,01H SBI KEY_CNT ,05H ;如果按鍵相同的次數有8次相同,則檢查 BNC KEY_SCAN_EXIT LDI KEY_CNT ,00H KEY_SCAN100: LDA KEY_VAL ,00H BAZ KEY_OFF_ALL ;如果按鍵值為零,則設定按鍵松開的標志 LDA KEY_VAL ,00H STA KEY_VAL_BACK ;備份按鍵值 ORIM KEY_FLAG,0100B ;按鍵壓下,按鍵待處理,與連續的標志 SBI KEY_VAL,02H BAZ KEY_SCAN_CONT SBI KEY_VAL,04H BAZ KEY_SCAN_CONT ;連續按鍵的子程序 JMP KEY_SCAN_EXITKEY_SCAN_CONT: ;如果是ADD/DEC壓下去的話,那么檢查是否設定連續鍵標志? LDA KEY_FLAG,00H BA1 KEY_CONT_ON ;如果設定了連續鍵標志,去處理 ORIM KEY_FLAG,0010B ;連續鍵待處理的標志 LDI KEY_CONT_TIMER,00H;連續鍵壓下的時間清零 JMP KEY_SCAN_EXITKEY_CONT_ON: SBI KEY_CONT_TIMER,04H BNC KEY_SCAN_EXIT ;如果壓下去沒有500MS,不形成連續按鍵 LDI KEY_CONT_TIMER,00H;下一個500MS再響應一次 SBI KEY_VAL,02H BAZ KEY_VOL_ADD ;聲音連續的標志 SBI KEY_VAL,04H BAZ KEY_VOL_DEC ;聲音連續減的命令 ANDIM KEY_FLAG,0101B ;如果不是單獨壓下,取消連續 JMP KEY_SCAN_EXITKEY_VOL_ADD: ORIM KEY_FLAG,1000B ;已經響應連續按鍵的標志 LDI SEND_COM,0CH ;發送聲音加的命令 CALL SEND_COMMAND CALL DELAY_5MS SBI VOICE_CNT_L,0AH LDI R0 ,02H SBC VOICE_CNT_H,00H BC KEY_SCAN_EXIT ;如果音量已調入最大,則不改變 ADIM VOICE_CNT_L,01H LDI R0 ,00H ADCM VOICE_CNT_H,00H ;音階數加1 LDA VOICE_CNT_L,00H STA DATA_L ,00H LDA VOICE_CNT_H,00H STA DATA_H ,00H LDI DATA_ADDRH,00H LDI DATA_ADDRL,04H CALL WRITE_DATA ;寫入調整后的音量 CALL DELAY_5MS JMP KEY_SCAN_EXITKEY_VOL_DEC: ORIM KEY_FLAG,1000B ;已經響應連續按鍵的標志 LDI SEND_COM,0DH ;發送聲音減的命令 CALL SEND_COMMAND CALL DELAY_5MS LDA VOICE_CNT_L,00H BNZ $+3 LDA VOICE_CNT_H,00H BAZ KEY_SCAN_EXIT ;如果音量調整到0則結束 SBIM VOICE_CNT_L,01H LDI R0 ,00H SBCM VOICE_CNT_H,00H ;音階數減1 LDA VOICE_CNT_L,00H STA DATA_L ,00H LDA VOICE_CNT_H,00H STA DATA_H ,00H LDI DATA_ADDRH,00H LDI DATA_ADDRL,04H CALL WRITE_DATA ;寫入調整后的音量 JMP KEY_SCAN_EXITKEY_OFF_ALL: LDA KEY_FLAG,00H BA3 KEY_OFF_END ;如果以前響應了連續按鍵則結束 BA2 KEY_OFF_CHULI ;如果以前設定了待處理按鍵的標志,則去處理 JMP KEY_OFF_ENDKEY_OFF_CHULI: LDA KEY_FLAG,00H BA0 $+2 JMP KEY_OFF_END ANDIM KEY_FLAG,1110B SBI KEY_VAL_BACK,01H ;PLAY/PAUSE鍵壓下去 BAZ KEY_SCAN110 ; SBI KEY_VAL_BACK,02H ;ADD/FB+鍵壓下去 BAZ KEY_SCAN120 SBI KEY_VAL_BACK,04H ;DEC/FB-鍵壓下去 BAZ KEY_SCAN130 SBI KEY_VAL_BACK,08H ;MODE鍵壓下去 BAZ KEY_SCAN140KEY_OFF_END: LDI KEY_FLAG,0001B JMP KEY_SCAN_EXIT;-----------------------------------------------------------------;WORK_FLAG: ;工作狀態寄存器;WORK_FLAG.0 ;1:PLAY中;0:STOP;WORK_FLAG.1 ;1:調整的是文件與文件夾的 1:調整的是頻率KEY_SCAN110: ;PLAY/STOP按鍵壓下去 EORIM WORK_FLAG,0001B ;轉換9432的工作狀態 LDA WORK_FLAG,00H BA0 KEY_SCAN_PLAYKEY_SCAN_STOP: LDI SEND_COM,02H ;發送STOP命令 JMP KEY_PL_ST_SENDKEY_SCAN_PLAY: LDI SEND_COM,01H ;發送PLAY命令KEY_PL_ST_SEND: CALL SEND_COMMAND ;將命令發送出去 CALL DELAY_5MS JMP KEY_SCAN_EXITKEY_SCAN120: ;ADD鍵壓下; LDA WORK_FLAG,00H ;檢查是在調整頻率的過程中嗎?; BA1 KEY_ADD_FRE ;調整頻率的過程中 LDI SEND_COM,04H ;發送上一首的命令; LDI SEND_COM,0CH ;發送聲音加的命令 CALL SEND_COMMAND CALL DELAY_5MS JMP KEY_SCAN_EXIT ;KEY_ADD_FRE:; LDI ADJUST_TIMER,00H;如果5S沒有調整頻率,則認為頻率結束; SBI FRE_MODE,06H; BC KEY_SCAN_EXIT ;如果頻率調到最大值,則結束; ADIM FRE_MODE,01H ;將頻率加一檔,;KEY_CHANGE_FRE: ;改變頻率(什么時候將其保存在24C02?); LDA FRE_MODE,00H; STA PC_TMP; ORIM PC_TMP ,1000B ; STA PC; CALL DELAY_5MS ; LDI DATA_ADDRH,00H; LDI DATA_ADDRL,01H; LDI DATA_H ,00H; LDA FRE_MODE,00H; STA DATA_L ,00H; CALL WRITE_DATA ;讀出識別寫入碼; CALL DELAY_5MS ;延時5MS的子程式; JMP KEY_SCAN_EXITKEY_SCAN130: ;DEC/FB-按鍵壓下去; LDA WORK_FLAG,00H ;檢查是在調整頻率的過程中嗎?; BA1 KEY_DEC_FRE ;調整頻率的過程中 LDI SEND_COM,05H ;發送下一首的命令; LDI SEND_COM,0dH ;發送聲音減的命令 CALL SEND_COMMAND CALL DELAY_5MS JMP KEY_SCAN_EXIT ;KEY_DEC_FRE:; LDI ADJUST_TIMER,00H;如果5S沒有調整頻率,則認為頻率結束; LDA FRE_MODE,00H; BAZ KEY_SCAN_EXIT ;如果頻率已調到最小,則不再調整; SBIM FRE_MODE,01H; STA PC_TMP ,00H; ORIM PC_TMP ,1000B; STA PC; CALL DELAY_5MS ;存儲變更后的頻率碼 ; LDI DATA_ADDRH,00H; LDI DATA_ADDRL,01H; LDI DATA_H ,00H; LDA FRE_MODE,00H; STA DATA_L ,00H; CALL WRITE_DATA ;讀出識別寫入碼; CALL DELAY_5MS ;延時5MS的子程式; JMP KEY_SCAN_EXITKEY_SCAN140:; EORIM WORK_FLAG,0010B ;如果是調整頻率中,則改為調整上/下首; LDI ADJUST_TIMER,00H SBI FRE_MODE,06H BC $+3 ;如果頻率調到最大值,則結束 ADIM FRE_MODE,01H ;將頻率加一檔, JMP KEY_CHANGE_FRE LDI FRE_MODE,00H ;如果頻率調整到最大,則從頭開始調整KEY_CHANGE_FRE: ;改變頻率(什么時候將其保存在24C02?) LDA PC_TMP ,00H STA R0 LDA FRE_MODE,00H STA PC_TMP LDA R0 ,00H BA3 $+2 JMP $+2 ORIM PC_TMP ,1000B LDA PC_TMP ,00H; ORIM PC_TMP ,1000B STA PC CALL DELAY_5MS LDI DATA_ADDRH,00H LDI DATA_ADDRL,01H LDI DATA_H ,00H LDA FRE_MODE,00H STA DATA_L ,00H CALL WRITE_DATA ;讀出識別寫入碼 CALL DELAY_5MS ;延時5MS的子程式 JMP KEY_SCAN_EXIT KEY_SCAN_EXIT: JMP MAIN_KEY_SCAN;=================================================================;-----------------------------------------------------------------;在發送命令的過程中,如何處理顯示?;1.1將顯示放中中斷,但是在顯示的時候只改變;發送PLAY的波形;以下為發送的步驟:;1)先將發送的數字送給HST_DATA1/2,然后調用發送命令的子程式,發送出去;1.1發送命令的子程式,先發送一個起始標志,發送完成后再將D7(就是發送數的最高位)送到DATA上,;1.2DATA放上去后,然后再發生兩次中斷后,就再發送D6位,以此類推,直至8個數發送完畢.;=================================================================SEND_COMMAND: ;發送命令的子程式(HST_SCL=PE.3,HST_DATA=PE.2) ANDIM PA_TMP ,1011B ORIM PA_TMP ,1000B STA PA ;將SCL置為低,SDA置為高, CALL DELAY_1MS ;延時1MS LDI R0 ,05HSEND_SYNC: ;發送同步波形的子程式 EORIM PA_TMP ,0100B ;CLK置為低 STA PA CALL DELAY_1MS ;延時1MS SBIM R0 ,01H BNZ SEND_SYNC ;如果沒有發送5個,則再延時發送
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -