www.pudn.com > s3c9454.rar > seg_sam.src
include "C:\工程项目\seg_sam\seg_sam_head.src"
;================Interrupt vertor adderss================
ORG 0000H ;中断入口地址
VECTOR 00H,INT_9454
ORG 003cH
DB 00H ;必须初始化为0
DB 00H ;必须初始化为0
DB 0E7H ;允许低电压复位
DB 03H ;内部RC震荡3.2M
;=====================MAIN PROGRAM=======
org 0100h ;复位入口地址
Rest:
di ;关总中断DISwatchdog=10100010b ;7654位为1010时关看门狗
ld BTCON,#101000010b ;DISwatchdog ;BTCON为时基控制寄存器1010B=Disable watchdog timer
ld CLKCON,#00011000b ;No_divide_clock=00011000b ;资料的279页
ld SYM,#00h ;关总中断标志
ld SP,#0C0H ;堆栈设置
call Initcpu
call Delay300ms ;延时300ms给晶体振荡器稳定
call initdata ;初始化数据8966020
call long_beep1
ei ;开总中断
;==============================main============================13536417338
main:
ei
nop
nop
cp main_program_cnt,#0
jp z,call_read_AD_prg
cp main_program_cnt,#1
jp z,call_time_comput
cp main_program_cnt,#2
jp z,call_read_key_prg
cp main_program_cnt,#3
jp z,call_what_key_is
cp main_program_cnt,#4
jp z,call_heat_and_warm
call_read_AD_prg:
nop
nop
call read_AD_prg
jp refurbish_LED
call_time_comput:
nop
nop
call time_comput
nop
call haver_erroron
jp refurbish_LED
call_read_key_prg:
nop
nop
call led_count_prg ;LED显示计算
jp refurbish_LED
call_what_key_is:
nop
nop
call what_key_is ;按键确认
jp refurbish_LED
call_heat_and_warm:
nop
nop
call heat_and_warm ;加热与保温
jp refurbish_LED
refurbish_LED:
inc main_program_cnt
nop
call read_key_prg ;按键扫描
call display_led ;刷新显示改变位,n豪秒刷新一次,视效果而定
nop
nop
jp main
;================AD采样========================
;描述:
;
;
;
;
;
;==================================================
read_AD_prg:
;==========读取top温度========================
;描述:广州敏杰热敏电阻
;=======================================
read_top_temp:
nop
nop
call delay_10_nop
jp read_AD_prg_ret
;==============读取锅低温度=====================
read_bot_temp:
nop
nop
call delay_10_nop
read_AD_prg_ret:
nop
nop
ret
;==============================温度数据表====================================
temp_tab:
DB 0FH,010H,011H,012H,013H,013H,014H,015H,016H,017H;0C`~9C`
;=====================时间计算/定时开机=======
;描述:在顶时设定后清掉时钟的所有积存器
;=============时间计算=======================
time_comput:
cp half_second_cnt,#2
jp c,time_switch_ret
just_one_s: ;一秒
clr half_second_cnt
inc one_second_cnt
call dec_one_second
cp one_second_cnt,#60
jp c,time_switch_ret
just_one_m: ;一分
clr one_second_cnt
inc one_minu_cnt
cp one_minu_cnt,#60
jp c,time_switch_ret
just_one_h: ;一小时
clr one_minu_cnt
inc one_hour_cnt
cp one_hour_cnt,#24
jp c,time_switch_ret
clr one_hour_cnt
time_switch_ret:
nop
nop
ret
;==========工作或预约时间减一秒=======
dec_one_second:
inc work_one_second
cp work_one_second,#60
jp c,dec_one_second_ret
clr work_one_second
tm work_flg0,#start_work_flg0 ;如预约开始或已经开始工作
jp nz,dec_work_time
tm work_flg0,#faith_start_flg0 ;如预约开始,关机并进入待机
jp nz,dec_faith_time
jp dec_one_second_ret
dec_faith_time:
cp faith_time_m_H,#1
jp nc,continue_dec
cp faith_time_m_L,#2
jp c,faith_time_over
continue_dec:
sub faith_time_m_L,#1
sbc faith_time_m_H,#0
faith_time_over:
nop
nop
jp dec_one_second_ret
dec_work_time:
dec work_time_minu
jp nz,dec_one_second_ret
work_just_over:
call long_beep5
dec_one_second_ret:
nop
nop
ret
;====================有错误报警关机==========================
;有错误报警5声 关机 LCD同时显示对应的错误码
;
;
;=========================================
haver_erroron:
haver_erroron_ret:
nop
nop
ret
;=============按键=============
;
;
;=============================
read_key_prg:
ld P0CONH,#10101010b
ld P0CONL,#10101010b
or p0,#00001111b
ld P2CONH,#0
ld P2CONL,#0
call delay_10_nop
ld key_buf0,p2
or key_buf0,#10100100b
cp key_buf0,#11111111b
jp nz,have_keyact ;如果不都为1那么就有按键按下
jp NO_KEYSCAN ;否则没有按键动作,跳出按键扫描
have_keyact:
cp key_buf0,key_buf2 ;key_buf2存放上次前8个按键值
jp z,is_oldkey
have_newkey:
ld key_buf2,key_buf0
and allkeyflag,#11110011b ;#Keyingflag=00000100b
jp key_scan_ret
is_oldkey:
dec key_dec_times
jp nz,key_scan_ret
key_is_ok:
tm allkeyflag,#keybackflag ;#keybackflag=00000001b
jp nz,key_scan_ret
or allkeyflag,#keyonflag ;#keyonflag=00000010b确定有键按下的标志
or allkeyflag,#keybackflag ;手是否松开的标志
ld key_dec_times,#24
tm allkeyflag,#Keyingflag ;#Keyingflag=00000100b
jp nz,set_samkey
or allkeyflag,#Keyingflag
jp key_scan_ret
set_samkey: ;同一按键
or allkeyflag,#samekeyflag ;#samekeyflag=00001000b
jp key_scan_ret
NO_KEYSCAN:
and allkeyflag,#11110000b
ld key_dec_times,#16
key_scan_ret:
nop
nop
ret
;==确定按键=============================
;描述:
;
;
;
;=========================================
what_key_is:
tm allkeyflag,#keyonflag
jp z,key_make_sure_ret
havekey:
cp key_buf0,#open_close_data
jp z,open_close
tm work_flg0,#start_work_flg0 ;如预约开始或已经开始工作
jp nz,key_make_sure_ret ;以下按键无效
tm work_flg0,#faith_start_flg0 ;如预约开始或已经开始工作
jp nz,key_make_sure_ret
cp key_buf0,#func_choice_data
jp z,function_choice
cp key_buf0,#faith_data
jp z,time_faith
cp key_buf0,#hour_key_data
jp z,hour_key_is
cp key_buf0,#minu_key_data
jp z,minu_key_is
jp key_make_sure_ret
;================================
open_close:
tm work_flg0,#start_work_flg0 ;如预约开始或已经开始工作
jp nz,close_to_wait ;关机并进入待机
tm work_flg0,#faith_start_flg0 ;如预约开始,关机并进入待机
jp nz,close_to_wait
tm work_flg0,#faith_work_flg0 ;如有预约标志开始预约
jp nz,start_faith
tm work_flg0,#have_function_flg0 ;如只有功能按下就立即开机工作
jp nz,immediately_work
close_to_wait:
call long_beep1
clr work_flg0
clr led_data_buf0
jp key_make_sure_ret
start_faith:
call short_beep1
or work_flg0,#faith_start_flg0
jp key_make_sure_ret
immediately_work:
call short_beep1
or work_flg0,#start_work_flg0
jp key_make_sure_ret
;========================
function_choice: ;功能处理
or work_flg0,#have_function_flg0
and work_flg0,#unfaith_work_flg0 ;具体看预约设置说明此标志
call short_beep1
inc function_key_cnt
cp function_key_cnt,#quicks_cook_data
jp z,quicks_cook
cp function_key_cnt,#criterion_cook_data
jp z,criterion_cook
cp function_key_cnt,#cook_tile_rice_data
jp z,cook_tile_rice
cp function_key_cnt,#cook_conjee_data
jp z,cook_conjee
cp function_key_cnt,#cook_soup_data
jp z,cook_soup
cp function_key_cnt,#again_heat_data
jp z,again_heat
clr function_key_cnt
jp key_make_sure_ret
;=========快煮=======
;
;========================
quicks_cook:
jp key_make_sure_ret
;=========精煮=======
;
;========================
criterion_cook:
jp key_make_sure_ret
;=========煲子饭=======
;
;========================
cook_tile_rice:
jp key_make_sure_ret
;=========默认煮粥一小时=======
;工作时间可调
;========================
cook_conjee:
ld work_time_minu,#60
ld work_time_max,#180
ld work_time_min,#30
jp key_make_sure_ret
;=========默认煮汤一小时=======
;工作时间可调
;========================
cook_soup:
ld work_time_minu,#15
ld work_time_max,#240
ld work_time_min,#30
jp key_make_sure_ret
;=========默认煮粥15分钟=======
;工作时间可调
;========================
again_heat:
clr function_key_cnt
ld work_time_minu,#15
ld work_time_max,#30
ld work_time_min,#5
jp key_make_sure_ret
;=========预约按键=======
;预约工作时间可调
;0~8小时 如正在预约时切换功能,设置过的预约时间不变
;切换功能相应改变是否允许预约标志
;工作时或关机时清预约时间不变与预约标志
;========================
time_faith:
tm work_flg0,#have_function_flg0
jp z,key_make_sure_ret ;如没有功能键按下,不允许预约
or work_flg0,#faith_work_flg0 ;设置约标志
tm work_flg0,#unchange_faith_t_flg0 ;如有预约标志开始预约
jp nz,key_make_sure_ret
or work_flg0,#unchange_faith_t_flg0
ld faith_time_m_H,#0
ld faith_time_m_L,#0
jp key_make_sure_ret
;=========小时加按键=======
;
;
;========================
hour_key_is:
tm work_flg0,#allow_timing_flg0 ;不允许定时跳出
jp z,key_make_sure_ret
tm work_flg0,#faith_work_flg0 ;设置约标志
jp nz,inc_faith_time_60m
cp function_key_cnt,#6
jp z,cp_max_time_H ;再加热时钟不能加1
add work_time_minu,#60
cp_max_time_H:
cp work_time_max,work_time_minu
jp nc,key_make_sure_ret
ld work_time_minu,work_time_min
jp key_make_sure_ret
inc_faith_time_60m: ;最大预约时间8小时==480分钟
add faith_time_m_L,#60
adc faith_time_m_H,#0
cp faith_time_m_H,#1
jp c,key_make_sure_ret
cp faith_time_m_L,#0E1h
jp c,key_make_sure_ret
clr faith_time_m_L
clr faith_time_m_H
jp key_make_sure_ret
;=========分钟加按键=======
;
;
;========================
minu_key_is:
tm work_flg0,#allow_timing_flg0 ;不允许定时跳出
jp z,key_make_sure_ret
tm work_flg0,#faith_work_flg0 ;设置约标志
jp nz,inc_faith_time_10m
cp function_key_cnt,#cook_conjee_data
jp z,add_15_minutes ;煮粥步长为15分钟
cp function_key_cnt,#cook_soup_data
jp z,add_30_minutes ;煮汤步长为30分钟
add work_time_minu,#5 ;再加热步长为5分钟
jp cp_max_data
add_15_minutes:
add work_time_minu,#15
jp cp_max_data
add_30_minutes:
add work_time_minu,#30
cp_max_data:
cp work_time_max,work_time_minu
jp nc,key_make_sure_ret
ld work_time_minu,work_time_min
jp key_make_sure_ret
inc_faith_time_10m:
add faith_time_m_L,#10
adc faith_time_m_H,#0
cp faith_time_m_H,#1
jp c,key_make_sure_ret
cp faith_time_m_L,#0E1h
jp c,key_make_sure_ret
clr faith_time_m_L
clr faith_time_m_H
key_make_sure_ret: ;允许按主键显示温度或压力
;and allkeyflag,#clrkeyonflag ;清有键标志#keyonflag=00000010b确定有键按下的标志
;and allkeyflag,#clrsamekeyflag ;#samekeyflag=00001000b
and allkeyflag,#clr_samekey_on_flg
;====================多声蜂鸣器程序============================
;
;
;
;
;===========================================================
beep_program: ;蜂鸣器
cp beep_tim_cnt,give_beep_times
jp nc,beep_isover
beep_is_do:
tm all_beep_flg,#beep_stop_flag ;
jp nz,deepfreeze_stop ;暂时(deepfreeze)停止
or p1,#1 ;开蜂鸣器
cp long_beep_cnt,beep_buf ;long_beep_cnt值来之时间程序,半秒为一单位
jp c,beep_program_ret
deepfreeze_stop:
or all_beep_flg,#beep_stop_flag
and p1,#11111110b ;关蜂鸣器
ld R0,beep_buf
add R0,beep_buf
cp long_beep_cnt,R0
jp z,open_beep_agian
jp beep_program_ret
beep_isover:
and p1,#11111110b ;关蜂鸣器
jp beep_program_ret
open_beep_agian:
inc beep_tim_cnt
clr long_beep_cnt
and all_beep_flg,#clr_beep_stop_flag
beep_program_ret:
nop
nop
ret
;========delay 10 nop
;
;======================
delay_10_nop:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
ret
;===========led显示计算=============
;
;
;====================
led_count_prg:
tm work_flg0,#have_function_flg0
jp nz,dis_number_led ;有功能键按下显示对应的显示
clr function_key_cnt
call wait_work_dis ;待机显示
jp led_count_prg_ret
dis_number_led: ;有功能键按下显示对应的显示
cp function_key_cnt,#quicks_cook_data
jp z,quicks_cook_dis
cp function_key_cnt,#criterion_cook_data
jp z,criterion_cook_dis
cp function_key_cnt,#cook_tile_rice_data
jp z,cook_tile_rice_dis
cp function_key_cnt,#cook_conjee_data
jp z,cook_conjee_dis
cp function_key_cnt,#cook_soup_data
jp z,cook_soup_dis
cp function_key_cnt,#again_heat_data
jp z,again_heat_dis
clr work_flg0
clr function_key_cnt
jp led_count_prg_ret
quicks_cook_dis: ;快煮显示
ld led_data_buf0,#00000001b
call dis_faith_time ;有预约显示预约时间
call run_number_led ;在工作显示跑马
call wait_work_dis ;待机显示
nop
nop
jp led_count_prg_ret
criterion_cook_dis: ;精煮显示
ld led_data_buf0,#00000010b
call dis_faith_time ;有预约显示预约时间
call run_number_led ;在工作显示跑马
call wait_work_dis ;待机显示
nop
nop
jp led_count_prg_ret
cook_tile_rice_dis: ;包子饭显示
ld led_data_buf0,#00001000b
call dis_faith_time ;有预约显示预约时间
call run_number_led ;在工作显示跑马
call wait_work_dis ;待机显示
nop
nop
jp led_count_prg_ret
cook_conjee_dis: ;煮粥显示
ld led_data_buf0,#00010000b
call dis_faith_time ;有预约显示预约时间
call dis_work_time ;否则显示工作显示工作剩余时间
nop
nop
jp led_count_prg_ret
cook_soup_dis: ;煲汤显示
ld led_data_buf0,#01000000b
call dis_faith_time ;有预约显示预约时间
call dis_work_time ;否则显示工作显示工作剩余时间
nop
nop
jp led_count_prg_ret
again_heat_dis: ;再加热显示
ld led_data_buf0,#00100000b
call dis_faith_time ;有预约显示预约时间
call dis_work_time ;否则显示工作显示工作剩余时间
nop
nop
jp led_count_prg_ret
led_count_prg_ret:
nop
nop
ret
;================待机显示=======
;
;===========================
wait_work_dis:
clr led_data_buf0 ;否则做待机显示
ld led_1_cnt,#12
ld led_2_cnt,#12
ld led_3_cnt,#12
call led_number
ret
;================显示预约时间=====
;
;===========================
dis_faith_time:
tm work_flg0,#faith_work_flg0 ;设置约标志
jp z,dis_faith_time_ret ;如没预约标志跳出,不显示预约时间
ld R0,faith_time_m_L
ld R1,faith_time_m_H
ld R2,#60
ld R4,#1
call divide_X_start
ld led_1_cnt,R3
clr R1
call sixteen_trun_ten
ld led_2_cnt,R3
ld led_3_cnt,R2
call led_number
dis_faith_time_ret:
nop
nop
ret
;================显示工作时间==
;
;===========================
dis_work_time:
tm work_flg0,#faith_work_flg0 ;设置约标志
jp nz,dis_faith_time_ret ;如没预约标志跳出,不显示预约时间
ld R0,work_time_minu
clr R1
ld R2,#60
ld R4,#1
call divide_X_start
ld led_1_cnt,R3
clr R1
call sixteen_trun_ten
ld led_2_cnt,R3
ld led_3_cnt,R2
call led_number
dis_work_time_ret:
nop
nop
ret
;================显示跑马==
;
;===========================
run_number_led:
tm work_flg0,#start_work_flg0
jp z,run_number_led_ret
clr R4
ld R5,run_number_cnt
ldc R0,#led_table1[RR4]
ld led_data_buf1,R0
ldc R0,#led_table2[RR4]
ld led_data_buf2,R0
ldc R0,#led_table3[RR4]
ld led_data_buf3,R0
run_number_led_ret:
nop
nop
ret
;===========led数码刷新=====
;
;
;==========================
led_number:
clr R4
ld R5,led_1_cnt
ldc R0,#led_table[RR4]
ld led_data_buf1,R0
ld R5,led_2_cnt
ldc R0,#led_table[RR4]
ld led_data_buf2,R0
ld R5,led_3_cnt
ldc R0,#led_table[RR4]
ld led_data_buf3,R0
led_number_ret:
nop
nop
ret
;===========LED显示程序==============
;4个毫秒刷新一次
;
;====================================
display_led:
inc led_cnt
un_inc_dis:
ld P2CONH,#01001010b ;p2设为输出
ld P2CONL,#10101010b
ld P0CONL,#10101010b ;p0.0、1、2、3设为输出
cp led_cnt,#1
jp z,dis_led_1
cp led_cnt,#2
jp z,dis_led_2
cp led_cnt,#3
jp z,dis_led_3
cp led_cnt,#4
jp z,dis_led_4
dis_led_0: ;点亮功能LED
clr led_cnt
p0_0_is_low
ld p2,led_data_buf0
and p0,#01111111b
jp dis_led_prg_ret
dis_led_1: ;点亮数码管1
p0_1_is_low
ld p2,led_data_buf1
tm all_led_flg0,#dis_H_led_flg0
jp z,clr_led_H_up
or p0,#10000000b
jp dis_led_prg_ret
clr_led_H_up:
and p0,#01111111b
jp dis_led_prg_ret
dis_led_2: ;点亮数码管2
p0_2_is_low
ld p2,led_data_buf2
tm all_led_flg0,#dis_H_led_flg0
jp z,clr_led_H_down
or p0,#10000000b
jp dis_led_prg_ret
clr_led_H_down:
and p0,#01111111b
jp dis_led_prg_ret
dis_led_3: ;点亮数码管3
p0_3_is_low
ld p2,led_data_buf3
and p0,#01111111b
jp dis_led_prg_ret
dis_led_4:
p1_1_is_low
ld p2,led_data_buf4
and p0,#01111111b
dis_led_prg_ret:
nop
nop
ret
;========LED表
;
;
;==============================
led_table:
; hfabgcde
db 01110111b ;0
db 00010100b ;1
db 00111011b ;2
db 00111110b ;3
db 01011100b ;4
db 01101110b ;5
db 01101111b ;6
db 00110100b ;7
db 01111111b ;8
db 01111110b ;9
db 01101011b ;e
db 01101001b ;f
db 00001000b ;-
db 00000000b ;0
;========LED表1
;
;
;==============================
led_table1:
; fagedscb
db 11011011b ;0
db 00000011b ;1
db 01111001b ;2
db 01101011b ;3
db 10100011b ;4
db 11101010b ;5
db 11111010b ;6
db 01000011b ;7
;========LED表2
;
;
;==============================
led_table2:
; fagedscb
db 11011011b ;0
db 00000011b ;1
db 01111001b ;2
db 01101011b ;3
db 10100011b ;4
db 11101010b ;5
db 11111010b ;6
db 01000011b ;7
;========LED表3
;
;
;==============================
led_table3:
; fagedscb
db 11011011b ;0
db 00000011b ;1
db 01111001b ;2
db 01101011b ;3
db 10100011b ;4
db 11101010b ;5
db 11111010b ;6
db 01000011b ;7
;=============保温程序================================
;描述:
;
;
;
;
;
;===============================================================
heat_and_warm:
heat_and_warm_ret:
nop
nop
ret
;================beep =============
short_beep1:
clr beep_tim_cnt
clr long_beep_cnt
ld beep_buf,#20
ld give_beep_times,#1
and all_beep_flg,#clr_beep_stop_flag
ret
;===============
long_beep1:
clr beep_tim_cnt
clr long_beep_cnt
ld beep_buf,#45
ld give_beep_times,#1
and all_beep_flg,#clr_beep_stop_flag
ret
;===============
long_beep2:
clr beep_tim_cnt
clr long_beep_cnt
ld beep_buf,#35
ld give_beep_times,#2
and all_beep_flg,#clr_beep_stop_flag
ret
;===============
long_beep3:
clr beep_tim_cnt
clr long_beep_cnt
ld beep_buf,#40
ld give_beep_times,#3
and all_beep_flg,#clr_beep_stop_flag
ret
;===============
long_beep4:
clr beep_tim_cnt
clr long_beep_cnt
ld beep_buf,#40
ld give_beep_times,#4
and all_beep_flg,#clr_beep_stop_flag
ret
;===============
long_beep5:
clr beep_tim_cnt
clr long_beep_cnt
ld beep_buf,#40
ld give_beep_times,#5
and all_beep_flg,#clr_beep_stop_flag
ret
;==============16进制转10进制部分===========
;此部分作为一个子程序,供其他部分调用,
;入口参数为:R1高8位,R0为低8位
;出口参数为:R5放千位,R4放百位,R3放十位,R2放个位
;最大输出为9999
;========================================
sixteen_trun_ten:
clr R2
clr R3
clr R4
clr R5
trun_sub_loop:
cp R0,#100
jp nc,low_sub_100
cp R1,#1
jp nc,low_sub_100
cp R0,#10
jp nc,low_sub_10
ld R2,R0
jp sixteen_trun_ten_ret
low_sub_100:
sub R0,#100
sbc R1,#0
inc R4
cp R4,#10
jp c,trun_sub_loop
clr R4
inc R5
jp trun_sub_loop
low_sub_10:
sub R0,#10
inc R3
jp trun_sub_loop
sixteen_trun_ten_ret:
nop
nop
ret
;=======X除Y计算=========================
;没有小数,R4大于1为决定四舍五入,R4为0时余数为1商加1
;有小数,R4为1时算完后R0放剩数
;R0 放被除数低8位,算完后R0放剩数
;R1 放被除数高8位
;R2 放除数
;R3 放商
;=========================================
divide_X_start:
clr R3
divide_X_loop:
cp R0,R2
jp nc,inc_R3_divide
cp R1,#1
jp c,over_divide
sub R0,R2
sbc R1,#0
inc R3
jp divide_X_loop
over_divide:
rr R2 ;四舍五入
and R2,#01111111b
cp R4,#1
jp c,cp_R0_1
jp z,data_divide_X_ret
cp R0,R2
jp if_add_1
cp_R0_1:
cp R0,#1
if_add_1:
jp nc,again_inc_out
jp data_divide_X_ret
inc_R3_divide:
inc R3
sub R0,R2
jp divide_X_loop
again_inc_out:
inc R3
data_divide_X_ret:
nop
nop
ret
;=======X乘Y计算=========================
;求一个数X的Y倍 R0 放被乘数低位
; R1 放被乘数高位
;两数之积小于 R2 放乘数
; R3 放积低位
; R4 放积高位
;被乘数 乘数 之积不能大于FFFF=65535
;=========================================
mul_start:
clr R3
clr R4
cp R2,#0
jp z,mul_loop_ret
mul_loop:
dec R2
add R3,R0
adc R4,R1
cp R2,#0
jp nz,mul_loop
mul_loop_ret:
nop
nop
ret
;====================================================================
;描述:
;===============================================================
Initcpu:
ld SYM,#00h ;关总中断标志
ld BTCON,#10100010b ;DISwatchdog ;BTCON为时基控制寄存器1010B=Disable watchdog timer
ld CLKCON,#00011000b ;No_divide_clock=00011000b ;资料的279页
ld T0CON,#01001010b ;中断频率3.2M/256/125
ld T0DATA,#125
ld p0conh,#10011111b ;I/O口设置
or p0,#10000000b ;EN脚为高电平
ld p0conl,#11110101b ;I/O口设置
ld p1con,#00101010b ;中断设置
ld p2conh,#01001010b ;I/O口设置
ld p2conl,#10101010b ;I/O口设置
Initcpu_RET:
ret
;====================================================================
Delay300ms:
ld R0,#250
Dloop:
nop
dec R0
jp nz,Dloop
Delay300ms_RET:
ret
;=============================初始化数据================================
;描述:95599 8146 59287 79713 周冬柯
;===============================================================
initdata:
ld R2,#0h
ld R0,#00h
Clrram10:
ld @R0,#00h
inc R0
inc R2
cp R2,#070h
jp nz,Clrram10
ret
;=====================================中断==========================
;描述:中断频率为1KHz
;===============================================================
INT_9454:
Reg_save ;堆栈
ld SYM,#00h
tm T0CON,#00000001b
jp nz,time_a
jp INT_9454_ret
time_a:
and T0CON,#11110110b
inc one_ms_cnt ;一个豪秒加一
cp one_ms_cnt,#10
jp c,INT_9454_ret
or all_led_flg0,#refurbish_flg0
clr one_ms_cnt
inc ten_ms_cnt ;10个毫秒加一
cp ten_ms_cnt,#25
jp c,INT_9454_ret
clr ten_ms_cnt
inc quarter_s_cnt ;四分之一秒加一
inc run_number_cnt ;跑马灯加一
cp run_number_cnt,#6
jp c,INT_9454_ret
clr run_number_cnt
INT_9454_ret:
nop
nop
Reg_restore ;压栈
iret ;中断返回
end