📄 sub.asm
字号:
.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 //请设定炖汤时间//
.define voice_bw 06 //保温//
.define voice_down 07 //定时减//
.define voice_up 08 //定时加//
.define voice_off 09 //返回//
.define voice_alarm 10 //请放入内锅//
.define voice_ok 11 //请享用//
.define voice_set 12 //请设定//
.define voice_high 13 //注意温度过高//
//*******************************************//
// 系统初始化子程序 //
//*******************************************//
.public _System_Initial
_System_Initial:.proc
r1=0x0002
[P_SystemClock]=r1 //初始化系统时钟//
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 //时基选择//
[P_TimeBase_Setup]=r1
int off //关中断//
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 //加热标志//
.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 //调用功率输出子程序//
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
//***********************************************//
// 预置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
//***********************************************//
// 预置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
//******************************************//
// 计时子程序 //
//******************************************//
.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] //取第一个数据//
r1+=[T1_2] //第一个数据和第二个数据相加//
r1+=[T1_3] //前三个数据相加//
r1+=[T1_4] //前四个数据相加//
cmp r1,0 //和与0相比较//
je Time2_Count //等于0转到定时2的计数//
r1=[_end_120]
cmp r1,120 //是否到了120次//
jne ADD_1 //不到转向ADD_1继续相加//
r1=0x00
[_end_120]=r1 //到了清0为下次中断作准备//
call _Time_count_down1 //调用预置减子程序//
jmp Time_Count_Over
ADD_1: r1=r1+1
[_end_120]=r1
Time_Count_Over:
r1=[P_IOA_Buffer] //一次中断计时后秒点反相//
r2=0x8000
r1^=r2
[P_IOA_Data]=r1
jmp Count_end
Time2_Count:r1=[T2_1] //取第一个数据//
r1+=[T2_2] //第一个数据和第二个数据相加//
r1+=[T2_3] //前三个数据相加//
r1+=[T2_4] //前四个数据相加//
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度时报警并跳到程序的开始//
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 //播放索引存储单元//
.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; //去抖延时循环次数//
.ram
.var Key_Buff; //本次键值存储单元//
.var Key_Debounce; //计数单元//
.code
.public _KeyScan;
_KeyScan:.proc
r2=[P_IOA_Data]
r2&=0x001F //读键口//
jnz F_SomeKeyIsPressed //有键按下跳转进行按键比较//
r1=0x0000
[Key_Buff]=r1
retf
F_SomeKeyIsPressed: //按键比较//
r1=[Key_Buff] //读上次键值//
[Key_Buff]=r2 //存本次键值//
cmp r1,r2
je L_KS_StableTWOSample //若按键相同跳转进行去抖延时//
r1=C_DebounceCnt //初始化计数单元//
[Key_Debounce]=r1
r1=0x0010
retf
L_KS_StableTWOSample: //去抖延时//
r1=[Key_Debounce]
jz L_KS_StableOverDebounce //计数结束跳转形成键码//
r1-=1
[Key_Debounce]=r1
r1=0x0010
retf
L_KS_StableOverDebounce: //形成键码//
r1=[Key_Buff]
retf
.endp
//******************************************//
// 设置子程序 //
//******************************************//
.iram
.public _LED_FLASH_STATUS
.var _LED_FLASH_STATUS=0
.public _WHICH_TIME
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -