?? diangfang.asm
字號(hào):
.include hardware.inc
.include S480.inc
.include Resource.inc
.define voice_start 00 //開始//
.define voice_cool 01 //煮飯//
.define voice_fcool 02 //快煮//
.define voice_bz 03 //煲粥//
.define voice_dt 04 //燉湯//
.define voice_time 05 //請?jiān)O(shè)定燉湯時(shí)間//
.define voice_bw 06 //保溫//
.define voice_down 07 //定時(shí)減//
.define voice_up 08 //定時(shí)加//
.define voice_off 09 //返回//
.define voice_alarm 10 //請放入內(nèi)鍋//
.define voice_ok 11 //請享用//
.define voice_set 12 //請?jiān)O(shè)定//
.define voice_high 13 //注意溫度過高//
//*******************************************//
// 系統(tǒng)初始化子程序 //
//*******************************************//
.public _System_Initial
_System_Initial:.proc
r1=0x0002
[P_SystemClock]=r1 //初始化系統(tǒng)時(shí)鐘//
r1=0xFF80
[P_IOA_Dir]=r1
r1=0xFFE0
[P_IOA_Attrib]=r1
r1=0xFFE0
[P_IOA_Data]=r1 //初始化A口//
r1=0xFFFB
[P_IOB_Dir]=r1
r1=0xFFFF
[P_IOB_Attrib]=r1
r1=0x0004
[P_IOB_Data]=r1 //初始化B口//
r1=0x0004 //時(shí)基選擇//
[P_TimeBase_Setup]=r1
int off //關(guān)中斷//
r1=0x0105
[P_INT_Ctrl]=r1 //初始化中斷//
int fiq,irq //開中斷//
retf
.endp
//*********************************************//
// 段顯子程序 //
//*********************************************//
.DATA
Show_tabble: .dw 0x003F,0x0006,0x005B,0x004F,0x0066
.dw 0x006D,0x007D,0x0007,0x007F,0x006F
.code
.public _Show
_Show:.proc
BP=Show_tabble
r1+=BP //求顯示碼的地址//
r1=[r1] //求出顯示碼//
r1=r1 lsl 4
r1=r1 lsl 4 //移至高8位//
r2=[P_IOA_Buffer]
r2&=0x8000
r1|=r2
[P_IOA_Data]=r1 //輸出顯示//
retf
.endp
//***********************************************//
// 中斷子程序IRQ6 //
//***********************************************//
.iram
.public T1_1,T1_2,T1_3,T1_4
.public T2_1,T2_2,T2_3,T2_4
.public _STATUS
.public loop_count
.var T1_1=0,T1_2=0,T1_3=0,T1_4=0
.var T2_1=0,T2_2=0,T2_3=0,T2_4=0
.var _STATUS=0
.var loop_count=0
.text
.public _IRQ6
_IRQ6:
push r1,r5 to [sp]
r1=0x0001
test r1,[P_INT_Ctrl];
jnz IRQ6_Is_TMB2
r1=0x0002
[P_INT_Clear]=r1
pop r1,r5 from [sp]
reti
IRQ6_Is_TMB2:
[P_INT_Clear]=r1
r1=[_WHICH_TIME]
cmp r1,1
je Show_T2
r1=[loop_count]
cmp r1,0x00
je IS_T1_1
cmp r1,0x01
je IS_T1_2
cmp r1,0x02
je IS_T1_3
r1=[T1_4]
r4=0x8000
jmp Start_Show
IS_T1_1:
r1=[T1_1]
r4=0x1000
jmp Start_Show
IS_T1_2:
r1=[T1_2]
r4=0x2000
jmp Start_Show
IS_T1_3:
r1=[T1_3]
r4=0x4000
jmp Start_Show
Show_T2:
r1=[loop_count]
cmp r1,0x00
je IS_T2_1
cmp r1,0x01
je IS_T2_2
cmp r1,0x02
je IS_T2_3
r1=[T2_4]
r4=0x8000
jmp Start_Show
IS_T2_1:
r1=[T2_1]
r4=0x1000
jmp Start_Show
IS_T2_2:
r1=[T2_2]
r4=0x2000
jmp Start_Show
IS_T2_3:
r1=[T2_3]
r4=0x4000
Start_Show:
call _Show //把BCD的段碼輸出顯示//
r2=[loop_count]
r3=[P_IOB_Buffer] //不影響IOB的低12位,高四位選通一位//
r3&=0x0FFF
r3=r3|r4
[P_IOB_Data]=r3 //位選通//
r2+=1
cmp r2,0x0004
jne show_add
r2=0x00
show_add:
[loop_count]=r2
r1=[_STATUS]
cmp r1,0x01
jne No_Start
call _KeyScan
cmp r1,0x0018
jne No_Start
r1=0x00
[_STATUS]=r1
r1=voice_off
[_Announce_Buff]=r1
call _PlayRespond
pc=0x0000
No_Start:
pop r1,r5 from [sp]
reti
//***********************************************//
// 功率輸出子程序 //
//***********************************************//
.iram
.public cool_status //加熱標(biāo)志//
.var cool_status=0
.code
.public _F_Export
_F_Export:.proc
r1=[cool_status]
cmp r1,0
je Exit_off
r1=[_MODEL]
cmp r1,5
jne Export_Both
r1=[P_IOB_Data]
r1&=0xFFFD
r1|=0x0001
[P_IOB_Data]=r1
jmp Exit
Export_Both:
r1=[P_IOB_Data]
r1&=0xffFC
r1|=0x0003
[P_IOB_Data]=r1
jmp Exit
Exit_off: r1=[P_IOB_Data]
r1&=0xFFFD
r1|=0x0000
[P_IOB_Data]=r1
Exit: retf
.endp
//*************************************************//
// 中斷子程序IRQ3 //
//*************************************************//
.text
.public _IRQ3
_IRQ3:
push r1,r5 to [sp]
r1=0x0080
r1&=[P_INT_Ctrl]
jnz IRQ3_Is_Key
r1=0x0100
r1&=[P_INT_Ctrl]
jnz IRQ3_Is_Exit1
r1=0x0200
r1&=[P_INT_Ctrl]
jnz IRQ3_Is_Exit2
IRQ3_Is_Key:
[P_INT_Clear]=r1
pop r1,r5 from [sp]
reti
IRQ3_Is_Exit1:
[P_INT_Clear]=r1
call _F_Export //調(diào)用功率輸出子程序//
pop r1,r5 from [sp]
reti
IRQ3_Is_Exit2:
[P_INT_Clear]=r1
pop r1,r5 from [sp]
reti
//*****************************************//
// LED閃亮子程序 //
//*****************************************//
.code
.public _LED_Flash
_LED_Flash:.proc
r1=[_LED_FLASH_STATUS]
cmp r1,0x00
je Stop_Flash
r1=[_MODEL]
cmp r1,0x01
je LED1_Flash
cmp r1,0x02
je LED2_Flash
cmp r1,0x03
je LED3_Flash
cmp r1,0x04
je LED4_Flash
cmp r1,0x05
je LED5_Flash
jmp Stop_Flash
LED1_Flash:r1=[P_IOB_Buffer]
r1&=0xF00B
r1^=0x0008
[P_IOB_Data]=r1
jmp Stop_Flash
LED2_Flash:r1=[P_IOB_Buffer]
r1&=0xF013
r1^=0x0010
[P_IOB_Data]=r1
jmp Stop_Flash
LED3_Flash:r1=[P_IOB_Buffer]
r1&=0xF023
r1^=0x0020
[P_IOB_Data]=r1
jmp Stop_Flash
LED4_Flash:r1=[P_IOB_Buffer]
r1&=0xF043
r1^=0x0040
[P_IOB_Data]=r1
jmp Stop_Flash
LED5_Flash:r1=[P_IOB_Buffer]
r1&=0xF083
r1^=0x0080
[P_IOB_Data]=r1
Stop_Flash:retf
.endp
//***********************************************//
// 預(yù)置2減子程序 //
//***********************************************//
.public _Time_count_down2
_Time_count_down2: .proc
r1=[T2_4]
cmp r1,0 //判斷第四位是否為0//
jne out2_4
r1=9
[T2_4]=r1
r1=[T2_3] //判斷第三位是否為0//
cmp r1,0
jne out2_3
r1=5
[T2_3]=r1
r1=[T2_2]
cmp r1,0
jne out2_2
r1=9
[T2_2]=r1
r1=[T2_1]
r1-=1
[T2_1]=r1
jmp out_two
out2_4: r1-=1
[T2_4]=r1
jmp out
out2_3: r1-=1
[T2_3]=r1
jmp out
out2_2: r1-=1
[T2_2]=r1
jmp out
out_two: retf
.endp
//***********************************************//
// 預(yù)置1減子程序 //
//***********************************************//
.public _Time_count_down1
_Time_count_down1: .proc
r1=[T1_4]
cmp r1,0 //判斷第四位是否為0//
jne out4
r1=9
[T1_4]=r1
r1=[T1_3] //判斷第三位是否為0//
cmp r1,0
jne out3
r1=5
[T1_3]=r1
r1=[T1_2]
cmp r1,0
jne out2
r1=9
[T1_2]=r1
r1=[T1_1]
r1-=1
[T1_1]=r1
jmp out
out4: r1-=1
[T1_4]=r1
jmp out
out3: r1-=1
[T1_3]=r1
jmp out
out2: r1-=1
[T1_2]=r1
jmp out
out: retf
.endp
//******************************************//
// 計(jì)時(shí)子程序 //
//******************************************//
.iram
.public _end_120
.var _end_120=0
.code
.public _Time_Count
_Time_Count: .proc
r1=[_STATUS]
cmp r1,0
je Count_end
r1=[T1_1] //取第一個(gè)數(shù)據(jù)//
r1+=[T1_2] //第一個(gè)數(shù)據(jù)和第二個(gè)數(shù)據(jù)相加//
r1+=[T1_3] //前三個(gè)數(shù)據(jù)相加//
r1+=[T1_4] //前四個(gè)數(shù)據(jù)相加//
cmp r1,0 //和與0相比較//
je Time2_Count //等于0轉(zhuǎn)到定時(shí)2的計(jì)數(shù)//
r1=[_end_120]
cmp r1,120 //是否到了120次//
jne ADD_1 //不到轉(zhuǎn)向ADD_1繼續(xù)相加//
r1=0x00
[_end_120]=r1 //到了清0為下次中斷作準(zhǔn)備//
call _Time_count_down1 //調(diào)用預(yù)置減子程序//
jmp Time_Count_Over
ADD_1: r1=r1+1
[_end_120]=r1
Time_Count_Over:
r1=[P_IOA_Buffer] //一次中斷計(jì)時(shí)后秒點(diǎn)反相//
r2=0x8000
r1^=r2
[P_IOA_Data]=r1
jmp Count_end
Time2_Count:r1=[T2_1] //取第一個(gè)數(shù)據(jù)//
r1+=[T2_2] //第一個(gè)數(shù)據(jù)和第二個(gè)數(shù)據(jù)相加//
r1+=[T2_3] //前三個(gè)數(shù)據(jù)相加//
r1+=[T2_4] //前四個(gè)數(shù)據(jù)相加//
cmp r1,0
je Count_end
r1=[_end_120]
cmp r1,120
jne ADD_2
r1=0x00
[_end_120]=r1
call _Time_count_down2
jmp Count_end
ADD_2: r1+=1
[_end_120]=r1
Count_end: retf
.endp
//**********************************************//
// 過溫檢測子程序 //
//**********************************************//
.public _Over_Temp
_Over_Temp:.proc
r1=[_STATUS]
cmp r1,1
jne t_exit
r1=[_Tempreature_value]
cmp r1,36
jnb t_exit //與36即150度比較,溫度超過150度時(shí)報(bào)警并跳到程序的開始//
r1=voice_high
[_Announce_Buff]=r1
call _PlayRespond
r1=0
[_STATUS]=r1
pc=0x0000
t_exit: retf
.endp
//*********************************************//
// 溫度采集子程序 //
//*********************************************//
.ram
.public _Tempreature_value
.var _Tempreature_value
.code
.public _ReadAD
_ReadAD:.proc
r3=900
[_Tempreature_value]=r3
retf
.endp
//***************************************************//
// 中斷子程序IRQ5 //
//***************************************************//
.text
.public _IRQ5
_IRQ5:
push r1,r4 to [sp]
r1=[P_INT_Ctrl]
test r1,0x0004
jnz IRQ5_Is_2
r1=0x0008
[P_INT_Clear]=r1
pop r1,r4 from [sp]
reti
IRQ5_Is_2:
[P_INT_Clear]=r1
call _Time_Count
Call _LED_Flash
call _ReadAD
CALL _Over_Temp
r1=0x01
[P_Watchdog_Clear]=r1
pop r1,r4 from [sp]
reti
//**********************************************//
// FIQ中斷(聲音播放背景程序) //
//**********************************************//
.text
.public _FIQ;
_FIQ:
PUSH r1,r4 to [sp];
r1=0x2000;
test r1,[P_INT_Ctrl];
jnz L_FIQ_TimerA;
r1=0x0800;
test r1,[P_INT_Ctrl];
jnz L_FIQ_TimerB;
L_FIQ_PWM:
r1=C_FIQ_PWM;
[P_INT_Clear]=r1;
POP R1,R4 from[sp];
reti;
L_FIQ_TimerA:
[P_INT_Clear]=r1;
call F_FIQ_Service_SACM_S480;
pop r1,r4 from [sp];
reti;
L_FIQ_TimerB:
[P_INT_Clear]=r1;
pop r1,r4 from [sp];
reti;
//**************************************************//
// 語音播放前景子程序 /
//**************************************************//
.ram
.public _Announce_Buff //播放索引存儲(chǔ)單元//
.var _Announce_Buff
.code
.public _PlayRespond
_PlayRespond:.proc
r1=0x01
call F_SACM_S480_Initial
r1=[_Announce_Buff]
r2=0x01
r3=0x03
call F_SACM_S480_Play
p_loop: call F_SACM_S480_Status
test r1,0x01
jz p_exit
call F_SACM_S480_ServiceLoop
jmp p_loop
p_exit: call F_SACM_S480_Stop
retf
.endp
//***************************************//
// 鍵盤掃描子程序 //
//***************************************//
.define C_DebounceCnt 5; //去抖延時(shí)循環(huán)次數(shù)//
.ram
.var Key_Buff; //本次鍵值存儲(chǔ)單元//
.var Key_Debounce; //計(jì)數(shù)單元//
.code
.public _KeyScan;
_KeyScan:.proc
r2=[P_IOA_Data]
r2&=0x001F //讀鍵口//
jnz F_SomeKeyIsPressed //有鍵按下跳轉(zhuǎn)進(jìn)行按鍵比較//
r1=0x0000
[Key_Buff]=r1
retf
F_SomeKeyIsPressed: //按鍵比較//
r1=[Key_Buff] //讀上次鍵值//
[Key_Buff]=r2 //存本次鍵值//
cmp r1,r2
je L_KS_StableTWOSample //若按鍵相同跳轉(zhuǎn)進(jìn)行去抖延時(shí)//
r1=C_DebounceCnt //初始化計(jì)數(shù)單元//
[Key_Debounce]=r1
r1=0x0010
retf
L_KS_StableTWOSample: //去抖延時(shí)//
r1=[Key_Debounce]
jz L_KS_StableOverDebounce //計(jì)數(shù)結(jié)束跳轉(zhuǎn)形成鍵碼//
r1-=1
[Key_Debounce]=r1
r1=0x0010
retf
L_KS_StableOverDebounce: //形成鍵碼//
r1=[Key_Buff]
retf
.endp
//******************************************//
// 設(shè)置子程序 //
//******************************************//
.iram
.public _LED_FLASH_STATUS
.var _LED_FLASH_STATUS=0
.public _WHICH_TIME
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -