📄 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 + -