📄 声控灯.asm
字号:
mov led_1,#00h ;数码管1缓冲寄存器 == 0 mov led_2,#00h ;数码管2缓冲寄存器 == 0 setb disp_flg ;显示程序使能标志位== 1 (有效) setb sigel_dis_flg ; mov a,#00h mov sec_500ms_cnt,a mov sec_1s_cnt,a setb sleep_flg mov disp_del,#30h mov disp_buf,#00h ret;===============================================;【工程名称】:start;【功能说明】:系统复位后,程序从这里开始运行;===============================================start: mov sp,#30h ;设置堆栈指针 lcall init_ic ;初始化icmain: setb tr0 ;t0开始计数 lcall key_scan lcall disp_to lcall disp_scan lcall lemp_out_lp lcall led_out_lp jmp main;========================================== ;【工程名称】:lemp_out_lp;【功能说明】:当检测到信号有效时,就对继电器输出; 输出时间长度为之前设定的 ;=========================================== lemp_out_lp: mov a,disp_buf jz lemp_out_lp_end setb lemp_out retlemp_out_lp_end: clr lemp_out ret;========================================== ;【工程名称】:led_out_lp;【功能说明】:当检测到信号有效时,就发光二极管输出 ;=========================================== led_out_lp: mov a,disp_buf jz led_out_lp_end clr led_out retled_out_lp_end: setb led_out ret ;========================================== ;【工程名称】:sigel_in;【功能说明】:光信号和声音信号检测,当检测到信号有; 效时,触发数码管,按设定的时间长度开; 始倒计时,直到零为止。 ;=========================================== sigel_in:int_0_: jnb sigel_dis_flg,sigel_in_end jb light_in,sigel_in_end jb light_in,sigel_in_end ;--------信号有效 setb sleep_flg clr sigel_dis_flg mov a,disp_del mov disp_buf,asigel_in_end: ret;===========================================;【工程名称】:key_scan;【功能说明】:可识别单击/连击/短击/长击/无击等; 按键类型的按键检测处理程序; 10ms扫描一次;===========================================key_scan: jb key_flg,key_scan_pro retkey_scan_pro: clr key_flg mov a,key_in orl a,#key_in_reg cpl a mov key_num,a jz key_scan_bd mov nokey_js,#00h ;按键闭合计数器清零 setb sleep_flg mov a,key_buf xrl a,key_num jnz key_scan_init setb key_dj_flg djnz k_delay,sigel_in_end mov k_delay,#10 inc key_jsq mov a,#10 xrl a,key_jsq jz key_scan_cj_prokey_scan_lj_pro: ;------连击 clr key_dj_flg jnb key_set_flg,key_scan_end mov a,key_num xrl a,#(1<<button_2) jnz key_scan_end jnb mode_add_sub,mode_set_add jmp mode_set_sub retkey_scan_cj_pro: ;------长击 clr key_dj_flg mov a,key_num xrl a,#(1<<button_1) jnz key_scan_end cpl key_set_flg ;显示时间长度设定 retkey_scan_bd: jnb key_dj_flg,key_scan_init clr key_dj_flg ;-----短击程序处理 jnb key_set_flg,key_scan_end mov a,key_buf xrl a,#(1<<button_1) jnz mode_set cpl mode_add_submode_set: mov a,key_buf xrl a,#(1<<button_2) jnz key_scan_end jnb mode_add_sub,mode_set_addmode_set_sub: mov a,#099h ;减一操作 add a,disp_del da a mov disp_del,a setb dot_pro_flg retmode_set_add: ;加一操作 mov a,#01h add a,disp_del da a mov disp_del,a setb dot_pro_flg retkey_scan_init: mov a,key_num mov key_buf,a mov k_delay,#200 mov key_jsq,#00 ;-----无键按下执行程序 jnb key_set_flg,key_scan_nokey mov a,nokey_js xrl a,#nokey_js_reg0 jnz key_scan_end ;执行 clr key_set_flg mov nokey_js,#00h retkey_scan_nokey: mov a,disp_buf jz key_scan_nokey_1 mov nokey_js,#00h retkey_scan_nokey_1: mov a,nokey_js xrl a,#nokey_js_reg1 jnz key_scan_end mov p3,#0ffh clr sleep_flg retkey_scan_end: ret ;===========================================;【工程名称】:disp_to;【功能说明】:设定/运行 设定;当设定延时时间标志位为1时,将设定时间参数传递给数码管缓冲寄存器;当设定延时时间标志位为0时,将运行时间参数传递给数码管缓冲寄存器; ;=========================================== disp_to: jnb key_set_flg,disp_to_1 mov a,disp_del anl a,#0fh mov led_1,a mov a,disp_del swap a anl a,#0fh mov led_2,a retdisp_to_1: mov a,disp_buf anl a,#0fh mov led_1,a mov a,disp_buf swap a anl a,#0fh mov led_2,a ret ;===========================================;【工程名称】:disp;【功能说明】:显示程序,10ms切换一次显示; 数码管显示的可以是设定的时间,也可以是运行倒计时的时间 ;=========================================== disp_scan: jnb sleep_flg,disp_scan_end jnb disp_flg,disp_scan_end jnb sec_500ms_flg,disp_scan_all clr disp_flg setb com_1 setb com_2 jnb key_set_flg,disp_scan_no jnb dot_flg,disp_scan_no jb dot_pro_flg,disp_scan_nodisp_scan_yes: jmp disp_scan_enddisp_scan_no: jnb com_flg,com_2_lpcom_1_lp: clr com_1 mov a,led_1 lcall led_code_tab mov disp_seg,a retcom_2_lp: clr com_2 mov a,led_2 lcall led_code_tab mov disp_seg,a retdisp_scan_all: clr com_1 clr com_2 mov disp_seg,#00hdisp_scan_end: ret ;=========================================;【工程名称】:int_t0_;【功能说明】:定时器0,工作方式1,10ms中断一次;其中有对固定时间的控制,各程序使能标志位的控制;=========================================int_t0_: mov th0,#0ech mov tl0,#77h ;----10ms setb disp_flg cpl com_flg setb key_flg inc sec_500ms_cnt mov a,#50 xrl a,sec_500ms_cnt jnz int_t0_end ;----0.5s mov sec_500ms_cnt,#00h setb sec_500ms_flg cpl dot_flg inc sec_1s_cnt mov a,#2 xrl a,sec_1s_cnt jnz int_t0_end ;----1s inc nokey_js mov sec_1s_cnt,#00h setb sec_1s_flg mov a,disp_buf jnz int_t0_1s setb sigel_dis_flg jmp int_t0_2sint_t0_1s: mov a,#99h add a,disp_buf da a mov disp_buf,a int_t0_2s: inc sec_2s_cnt mov a,#3 xrl a,sec_2s_cnt jnz int_t0_end ;-----2s clr dot_pro_flg mov sec_2s_cnt,#00h inc sec_20s_cnt mov a,#5 xrl a,sec_20s_cnt jnz int_t0_end ;-----20s mov sec_20s_cnt,#00hint_t0_end: ret;================================== end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -