?? main.asm
字號:
;CPU時鐘用RC 4.0MHz,WDT:enable;LVR:enable;LVR range:low;=================================================================;6月27日的版本修改以下的項目:;1:調節MODE鍵直接可以調頻道 ;已調整,待確認;2:兩個版本的:其中一個上電后即PLAY, 另外一個要壓下按鍵后才開始播放 ;現在還是PLAY中,待改;3:LED指示燈指示工作狀態,如果是在PLAY中,則LED閃爍,停止時LED常亮 ;;4:遙控,暫時不加;5:對于不同的存儲器(MP3與U盤),上電后可以開始的時間不一樣,如何更好的處理?;增加上電后聲音的記憶功能;LIST P=69P20CROMSIZE=0x03FF;=================================================================;================================================================= ORG 0000H JMP RESET JMP RESET JMP RESET ;T0中斷用查詢的方式,用于顯示刷新與定時 JMP RESET JMP RESET;================================================================= ORG 0005HRESET: NOP NOP;=================================================================;=================================================================;================================================================= INT_SYS_SYSTEM:; LDI PFCNT ,1101B ;PF.0為輸出;PF.1為輸入(為狀態HST_STS輸入腳); LDI PECNT ,1111B ;PE.0~PE.3為輸出 LDI PDCNT ,0001B ;PD.2為輸出 LDI PCCNT ,1111B ;PC3,PC2為輸出;PC1,PC0外接晶振 LDI PBCNT ,0000B ;PB.0,PB1,PB.2為輸出,PB.3為按鍵輸入腳 LDI PACNT ,1111B ;PA.0~PA.3都為輸出 LDI PA ,1111B LDI PB ,1111B LDI PC ,1011B LDI PD ,1111B LDI PULL ,1100B ;上拉電阻打開,下降沿中斷INT_T0_REG: ;T0為2MS定時器,用于LED的刷新 LDI T0MODE ,0101B ANDIM IRQ ,1011B LDI TL0 ,06H ;06H LDI TH0 ,00H ;中斷為500uS;=================================================================CLR_RAM: ;RAM清零:RAM范圍是030H-BFH的所有RAM全部清零,這個;***************************************************************** LDI DPL ,00H ;清除RAM從030H開始 LDI DPM ,02H LDI DPH ,00HRAM_CLEAR_1: LDI INX ,00H SBI DPM ,07H BNZ $+3 SBI DPL ,0FH BAZ INT_PORT ADIM DPL ,01H BNZ RAM_CLEAR_1 ADIM DPM ,01H BNz RAM_CLEAR_1INT_PORT: ;初始化IO,將LCD與背光LED關閉 LDI PA_TMP ,1111B ; STA PA LDI PB_TMP ,1111B ; STA PB LDI PC_TMP ,1011B STA PC LDI PD_TMP ,1111B STA PD LDI IRQ,0000B LDI IE,0000B ;;上電后,先不開端口中斷,T0中斷用查詢的方法.端口中斷需等上電穩定后(100MS后);發送一個波形,通知外設測試治具已準備好,同時打開端口中斷;================================================================= LDI IRQ ,0000B LDI IE ,0000B ;開機顯示步步高小寫的標志 LDI WDT ,08H;=================================================================MAIN_START: ;開機的主程式;1:先發出命令關掉MP3;2:接下來再發出讀命令讀24C02相應的位置;3;讀出值的判定:先判斷以前是否常寫過24C02(如果寫入過,特定的值是C5);4:如果以前寫入過24C02,根據此值設定發身頻率; ;再調用命令將以前的文件夾編號與文件編號送給M ;然后再發送命令讀M的狀態,如果M的狀態不是ERRO,則發送命令PLAY ;如果以前沒有寫入過24C02 ;初始化24C02,設發射頻率為默認的頻率,文件為頭一個,然后寫入 ;24C02 ;發送命令PLAY;24C02 EEPROM內部的說明:00H------對應的是有無寫入的識別碼,如果寫入,此值為C4; 01H------發射頻率碼; 02H------文件夾的編號; 03H------文件的編號; 04H------音階 CALL DELAY_20MS LDI DATA_ADDRH,00H LDI DATA_ADDRL,00H CALL READ_DATA ;讀出識別寫入碼 LDA I2C_ERRO_CNT,00H BAZ $+4 SBI I2C_ERRO_CNT,03H BNC $-6 JMP I2C_NO_WRITE SBI READ_DATAL,04H BNZ I2C_NO_WRITE ;如果讀的第1位不是C4,則認為沒有寫入 SBI READ_DATAH,0CH BNZ I2C_NO_WRITE ;是新機,還沒有用過的測試方法 JMP I2C_NO_WRITE I2C_WRITE: ;以前24C02寫入過;4:如果以前寫入過24C02,根據此值設定發身頻率; ;再調用命令將以前的文件夾編號與文件編號送給M ;然后再發送命令讀M的狀態,如果M的狀態不是ERRO,則發送命令PLAY LDI DATA_ADDRH,00H LDI DATA_ADDRL,01H CALL READ_DATA ;讀出發射頻率碼 LDA I2C_ERRO_CNT,00H BAZ $+4 SBI I2C_ERRO_CNT,03H BNC $-6 ;如果讀發生錯誤的次數小于三次,再讀 JMP I2C_FRE_CHANGE ;如果連續三次讀錯,則使用默認頻道 SBI READ_DATAL,07H LDI R0 ,00H SBC READ_DATAH,00H BC I2C_FRE_CHANGE ;如果存入的頻道值大于8,則認為頻道錯,用默認頻道 ;如果以前存入的頻率值合法,則設定發射頻率 LDA READ_DATAL ;頻率值沒有改變,則將此值改為默認的 STA FRE_MODE ;將發射碼的值保存 STA PC_TMP ORIM PC_TMP ,1000B STA PC CALL DELAY_5S LDI SEND_COM,03H CALL SEND_COMMAND ;先發送一個停止的指令給BU9432 JMP I2C_WJ_CHECK I2C_FRE_CHANGE:;如果以前存入的頻率值不合法,則設定頻率為默認的頻率 LDI FRE_MODE,03H LDI DATA_L,03H LDI DATA_H,00H ;設定寫入I2C的值 LDI DATA_ADDRL,01H LDI DATA_ADDRH,00H ;寫入頻率的位置為01H CALL WRITE_DATA ;將默認訴頻率值寫入給I2C,以便記憶 CALL DELAY_5MS LDI PC_TMP ,1011B STA PC CALL DELAY_5S LDI SEND_COM,03H CALL SEND_COMMAND ;先發送一個停止的指令給BU9432 LDI DATA_ADDRH,00H LDI DATA_ADDRL,02H LDI DATA_H ,00H LDI DATA_L ,01H CALL WRITE_DATA ;寫入初始文件夾的編號,為01H CALL DELAY_5MS LDI DATA_ADDRH,00H LDI DATA_ADDRL,03H LDI DATA_H ,00H LDI DATA_L ,01H CALL WRITE_DATA ;寫入初始文件的編號,為01H CALL DELAY_5MS ;延時5MS的子程式I2C_WJ_CHECK: LDI SEND_COM,01H CALL SEND_COMMAND ;發送命令01H(開始的命令) CALL DELAY_5MS ;每寫完1位延時5MS CALL DELAY_5MS ;每寫完1位延時5MS CALL DELAY_5MS ;每寫完1位延時5MS CALL DELAY_20MS ;每寫完1位延時5MS LDI DATA_ADDRL,02H LDI DATA_ADDRH,00H CALL READ_DATA ;先讀文件夾的編號,再讀文件的編號 LDA I2C_ERRO_CNT,00H BAZ $+4 SBI I2C_ERRO_CNT,03H BNC $-6 JMP SEND_START ;如果連續三次讀錯誤文件,則取消記憶 LDA READ_DATAL,00H STA DIR_L,00H STA DIR_BACK_L,00H ;備份文件夾的編號 LDA READ_DATAH,00H STA DIR_H,00H ;文件夾的編號高位 STA DIR_BACK_H,00H SEND_DIR_NO: ;發送命令確定文件夾的編號 LDA DIR_H ,00H BNZ SEND_DIR_1 SBI DIR_L ,01H BAZ SEND_FILE_CHECKSEND_DIR_1: SBIM DIR_L,01H LDI R0,00H SBCM DIR_H,00H ;如果文件夾的編號為0,則發送文件的編號 LDI SEND_COM,06H 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 SEND_DIR_NOSEND_FILE_CHECK: CALL DELAY_5MS ;每寫完1位延時5MS LDI DATA_ADDRL,03H LDI DATA_ADDRH,00H CALL READ_DATA ;再讀文件的編號 LDA I2C_ERRO_CNT,00H BAZ $+4 SBI I2C_ERRO_CNT,03H BNC $-6 JMP SEND_START ;如果連續三次讀錯誤文件,則取消記憶 LDA READ_DATAL,00H STA FILE_L,00H STA FILE_BACK_L,00H ;備份文件的編號 LDA READ_DATAH,00H ;文件的編號高位 STA FILE_H,00H STA FILE_BACK_H,00H ;備份文件的編號 CALL DELAY_5MS ;每寫完1位延時5MS;'; CALL DELAY_5MS ;每寫完1位延時5MS; call DELAY_20MSSEND_FILE_NO: ;發送命令確定文件的編號 LDA FILE_H ,00H ;如果文件編號為0,則發送文件的編號 BNZ SEND_FILE_1 ;如果文件夾的編號為0,則發送文件的編號 SBI FILE_L,01H BAZ SEND_STARTSEND_FILE_1: SBIM FILE_L,01H LDI R0,00H SBCM FILE_H,00H LDI SEND_COM,04H 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 SEND_FILE_NOSEND_START:; LDI SEND_COM,01H; CALL SEND_COMMAND ;發送命令01H LDI SEND_COM,09H CALL SEND_COMMAND ;發送完文件編號后,再送一個PLAY命令,再讀狀態 CALL DELAY_5MS LDA RD_STATUS14 ;如果狀態錯誤,則返回原程式的地方再次執行 BA3 MAIN1; BA3 READ_ERRO ;如果錯誤位為1,則說明讀錯; JMP MAIN1 ;如果沒有錯誤,則進入主程式開始循環READ_ERRO:; LDI SEND_COM,03H; CALL SEND_COMMAND ;先發送一個停止的命令 CALL DELAY_5MS LDI SEND_COM,01H CALL SEND_COMMAND ;再發送一個重新開始的命令 CALL DELAY_5MS JMP MAIN1 ;如果沒有錯誤,進入主程式開始循環 I2C_NO_WRITE: ;以前24C02沒有寫入過; LDI DATA_ADDRH,00H; LDI DATA_ADDRL,00H; LDI DATA_H ,0CH; LDI DATA_L ,04H; CALL WRITE_DATA ;讀出識別寫入碼; CALL DELAY_5MS ;延時5MS的子程式 LDI FRE_MODE,03H ;將頻率開始置為3檔 LDI DATA_L,03H LDI DATA_H,00H ;設定寫入I2C的值 LDI DATA_ADDRL,01H LDI DATA_ADDRH,00H ;寫入頻率的位置為01H CALL WRITE_DATA ;將默認訴頻率值寫入給I2C,以便記憶 CALL DELAY_5MS LDI PC_TMP ,1011B STA PC CALL DELAY_5S LDI SEND_COM,03H CALL SEND_COMMAND ;先發送一個停止的指令給BU9432 LDI DATA_L ,01H LDI DATA_H ,00H ;設定寫入I2C的值(初始文件夾編號) LDI DATA_ADDRL,02H LDI DATA_ADDRH,00H ;寫入頻率的位置為00H CALL WRITE_DATA CALL DELAY_5MS ;每寫完一位延時5MS LDI DATA_L ,01H LDI DATA_H ,00H ;設定寫入I2C的值(初始文件編號為01) LDI DATA_ADDRL,03H LDI DATA_ADDRH,00H ;寫入頻率的位置為01H CALL WRITE_DATA; CALL DELAY_5MS ;每寫完1位延時5MS; CALL DELAY_5MS ;確定完頻率后再發送一個開始命令就可以了; CALL DELAY_5MS; CALL DELAY_5MS; CALL DELAY_5MS ;確定完頻率后再發送一個開始命令就可以了; CALL DELAY_5MS; CALL DELAY_5MS ;確定完頻率后再發送一個開始命令就可以了; CALL DELAY_5MS; CALL DELAY_5MS ;確定完頻率后再發送一個開始命令就可以了; CALL DELAY_5MS; CALL DELAY_5MS ;確定完頻率后再發送一個開始命令就可以了; CALL DELAY_5MS CALL DELAY_20MS CALL DELAY_20MS CALL DELAY_20MS LDI SEND_COM,01H CALL SEND_COMMAND ;發送一個一始命令 CALL DELAY_20MS CALL DELAY_20MS LDI DATA_ADDRH,00H LDI DATA_ADDRL,00H LDI DATA_H ,0CH LDI DATA_L ,04H CALL WRITE_DATA ;讀出識別寫入碼 CALL DELAY_5MS ;延時5MS的子程式 CALL DELAY_5MS LDI WORK_FLAG,0001B ;說明上電初始化后是在工作中 ; JMP MAIN1 ;進入主程式開始循環;=================================================================MAIN1: ;上電后不開始,先關斷再說 NOP NOP; ORIM WORK_FLAG,0001B ANDIM WORK_FLAG,1110B LDI SEND_COM,02H CALL SEND_COMMAND CALL DELAY_5MSMAIN: LDI WDT ,08H LDA WORK_FLAG,00H BA0 $+2 ;如果是在工作中,則調整聲音 JMP $+2 JMP VOICE ;調整聲音的子程序MAIN_VOICE: LDI WDT ,08H JMP KEY_SCAN ;按鍵掃描的子程式MAIN_KEY_SCAN: LDI WDT ,08H JMP INT_TIMER0 ;調用時間的查詢子程式MAIN_INT_TIMER0: LDI WDT ,08H; CALL SEND_COMMAND ;發送命令的子程式 JMP MAIN;=================================================================VOICE: ;如果是在工作中,檢查聲音是否已調整過,如果調整過,則結束 LDA WORK_FLAG,00H BA3 VOICE_EXIT ORIM WORK_FLAG,1000B ;設置已調整過的標志 LDI DATA_ADDRH,00H LDI DATA_ADDRL,04H CALL READ_DATA ;讀出音階 LDA I2C_ERRO_CNT,00H BAZ $+4 SBI I2C_ERRO_CNT,03H BNC $-6 JMP VOICE_NO_CHANGE ;如果連續三次讀錯誤文件,則取消記憶 SBI READ_DATAL,0AH ;如果是大于32,則音階不合法,用28D LDI R0 ,02H SBC READ_DATAH,00H BC VOICE_NO_CHANGE ;使用80%音階VOICE_CHANGE: LDA READ_DATAL,00H STA VOICE_BACK_L,00H STA VOICE_CNT_L ,00H LDA READ_DATAH,00H STA VOICE_BACK_H,00H STA VOICE_CNT_H ,00H SBI VOICE_BACK_L,00H LDI R0 ,01H SBC VOICE_BACK_H,00H BC VOICE_CHANGE_ADD SBI VOICE_BACK_L,0FH LDI R0 ,00H SBC VOICE_BACK_H,00H BNC VOICE_CHANGE_DEC JMP VOICE_EXIT ;如果存入的音量為10,則不改變VOICE_CHANGE_DEC: LDI R0 ,0FH LDA VOICE_BACK_L,00H SUBM R0 ,00H STA VOICE_BACK_L,00H LDI VOICE_BACK_H,00HVOICE_DEC: LDA VOICE_BACK_H ,00H BNZ VOICE_ADJUST_ING LDA VOICE_BACK_L ,00H BAZ VOICE_EXIT
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -