EM78P153S使用总结 CLR R0 INC RSR JBC RSR,5 JBS RSR,4 JMP $_ClrLoop ENDM
;****************变量与标志位的定义******************** TCC_FLAG == 0x20 ;TCC溢出标志 TEMP_A == 0x21 ;备份寄存器A的变量
FLAG == 0x22 ;左右循环标志,为0表示左移,为1表示右移 COUNT1 == 0x23 ;延时函数的循环变量 COUNT2 == 0x24 ;延时函数的循环变量 NUM3 == 0x25 ;延时函数的循环变量 TCC_Count == 0x26 ;TCC计数器 NUM1 == 0x27 ;SB1按键次数变量 NUM2 == 0x28 ;SB2按键次数变量 NUM == 0x29 ;备份按键次数变量
T_NUM == 0x2A ;定时器的时间倍数,为0表示25MS的 HL_FLAG == 0x2B ;SB2点亮方式变量 T_FLAG == 0x2C ;间隔0.5秒与1秒的区分变量 COUNTER == 0x10 ;定时寄存器 HL_LED == 0x11 ;强光弱光标志位 PWM_FLAG == 0x12 ;调节占空比变量
TEMP_6 == 0x13 ;端口6的备份寄存器 TEMP_5 == 0x14 ;端口5的备份寄存器 TEMP_R2 == 0x15 ;指针地址变量 SB3_FLAG == 0x16 ;光敏检测的标志位 A_buffer == 0x1F ;保存A 寄存器 R4_buffer == 0x2F ;保存R4寄存器 R3_buffer == 0x2E ;保存R3寄存器 ;****************程序开始************** ORG 0x00 JMP MAIN ORG 0x08
;****************中断程序开始********** JMP TCC_INT
;****************主函数******************* MAIN:
CALL INIT ;调初始化子程序 ;******************按键检测*************** Sb_Scan: JBS PORT6,3 ;按键SB4按下了吗 JMP SB4_WORK ;有按键,跳转到SB4的处理程序 JBS PORT6,0 ;按键SB1按下了吗 JMP SB1_WORK ;有按键,跳转到SB1的处理程序 JBS PORT6,1 ;按键SB2按下了吗 JMP SB2_WORK ;有按键,跳转到SB2的处理程序 JMP Sb_Scan ;循环检测 ;****************左右循环功能函数***************** FUN_LR: CLR ISR ; 清除中断标志 ENI ; 开中断 BC TCC_FLAG,0 ;清零 MOV A,@4 ;5*25==125MS
24
EM78P153S使用总结 MOV T_NUM,A ;设定定时器的定时次数 MOV A,@0B11111000 ;将PORT5输出全为高,LED1-3亮,4灭 MOV PORT5,A MOV A,@0B11111111 ;LED5-6灭,HL123灭,LED7-8灭 MOV PORT6,A JBS FLAG,0 JMP LOOPA2 ;为0表示左循环 JMP LOOPA1 ;为1表示右循环 ;*********FLAG==1循环右移***************** LOOPA1: BS PORT5,0 ;灭LED1 BC PORT5,3 ;点亮LED4 CALL SB12 ;调用HL123显示函数 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 BS PORT5,1 ;灭LED2 BC PORT6,4 ;点亮LED5 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 BS PORT5,2 ;灭LED3 BC PORT6,5 ;点亮LED6 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 BS PORT5,3 ;灭LED4 BC PORT5,0 ;点亮LED1 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 BS PORT6,4 ;灭LED5 BC PORT5,1 ;点亮LED2 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 BS PORT6,5 ;灭LED6 BC PORT5,2 ;点亮LED3 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 JMP LOOPA1 ;循环右移 ;*********FLAG==0循环左移**************** LOOPA2: BS PORT5,2 ;灭LED3 BC PORT6,5 ;点亮LED6 CALL SB12 ;调用HL123显示函数 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 BS PORT5,1 ;灭LED2 BC PORT6,4 ;点亮LED5 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 BS PORT5,0 ;灭LED1 BC PORT5,3 ;点亮LED4 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 BS PORT6,5 ;灭LED6 BC PORT5,2 ;点亮LED3
25
EM78P153S使用总结 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 BS PORT6,4 ;灭LED5 BC PORT5,1 ;点亮LED2 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 BS PORT5,3 ;灭LED4 BC PORT5,0 ;点亮LED1 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 JMP LOOPA2
;***************闪亮功能实现函数***************** ;此函数只对LED1-6进行闪亮操作 FUN_HL: MOV A,@0B11111111 ;LED1-4灭 MOV PORT5,A MOV A,@0B11111111 ;LED5-6灭,HL123灭 MOV PORT6,A JBS T_FLAG,0 ;为0表示0.5秒,为1表示1秒 CALL SB12 ;调用端口6显示函数 CALL SB12 ;调用端口6显示函数 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 MOV A,@0B11110000 ;LED1-4亮 MOV PORT5,A MOV A,@0B11001111 ;LED5-6亮,HL123灭 MOV PORT6,A CALL SB12 ;调用端口6显示函数 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 JMP FUN_HL ;循环点亮
;****************SB1按键具体的功能实现********************** ;****************************第1次************************
;指示灯Led1、Led2、Led4、Led5与Led3、Led6、Led7、Led8循环间隔亮1s; FUN_A1: BS SB3_FLAG,1 ;光敏标志第二位置一,表示进行了一次检测 MOV A,NUM ;将NUM1的还原 MOV NUM1,A CLR ISR ; 清除中断标志 ENI ; 开中断 BC TCC_FLAG,0 ;清零 MOV A,@40 ;40*25==1S MOV T_NUM,A FUN1_HL: MOV A,@0B11110100 ;LED1、2、4亮,3灭 MOV PORT5,A
MOV A,@0B11101111 ;LED6-8灭,5亮,HL123灭,此后会被点亮 MOV PORT6,A CALL SB12 ;调用HL123显示函数 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 MOV A,@0B11111011 ;LED3亮 MOV PORT5,A
26
EM78P153S使用总结 MOV A,@0B10011111 ;LED6-8亮,HL123灭 MOV PORT6,A CALL SB12 ;调用HL123显示函数 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 JMP FUN1_HL ;循环点亮 ;****************************第2次************************
;指示灯Led1、Led2、Led3、Led4、Led5、Led6闪亮,点亮时间0.5s FUN_A2: BS SB3_FLAG,1 ;光敏标志第二位置一,表示进行了一次检测 MOV A,NUM ;将NUM1的还原 MOV NUM1,A BC T_FLAG,0 ;为零表示0.5S CLR ISR ;清除中断标志 ENI ;开中断 BC TCC_FLAG,0 ;清零 MOV A,@20 ;20*25==500MS MOV T_NUM,A JMP FUN_HL ;调用闪亮函数 ;****************************第3次************************
;指示灯Led1、Led2、Led3、Led4、Led5、Led6闪亮,点亮时间1s FUN_A3: MOV A,NUM ;将NUM1的还原 MOV NUM1,A BS T_FLAG,0 ;为1表示1S CLR ISR ;清除中断标志 ENI ;开中断 BC TCC_FLAG,0 ;清零 MOV A,@40 ;40*25==1S MOV T_NUM,A JMP FUN_HL ;调用闪亮函数 ;****************************第4次************************
;指示灯Led1—Led2—Led3—Led4—Led5—Led6—Led1依次点亮0.5s,呈顺时针转动的闪亮 FUN_A4: MOV A,NUM ;将NUM1的值还原 MOV NUM1,A BS FLAG,0 ;为1表示循环右移 JMP FUN_LR
;****************************第5次************************
;指示灯Led1—Led6—Led5—Led4—Led3—Led2—Led1依次点亮0.5s,呈逆时针转动的闪亮
FUN_A5: MOV A,NUM ;将NUM1的还原 MOV NUM1,A BC FLAG,0 ;为0表循环左移 JMP FUN_LR
;****************************第6次************************
;指示灯Led1、Led2、Led3、Led4、Led5、Led6和Led7、Led8循环间隔亮1s FUN_A6: MOV A,NUM ;将NUM1的还原 MOV NUM1,A CLR ISR ;清除中断标志 ENI ;开中断 BC TCC_FLAG,0 ;清零 MOV A,@40 ;40*25==1000MS
27
EM78P153S使用总结 MOV T_NUM,A FUN6_HL: MOV A,@0B11110000 ;LED1-4亮 MOV PORT5,A MOV A,@0B11001111 ;LED5、6亮,7-8灭,HL123灭 MOV PORT6,A CALL SB12 ;调用HL123显示函数 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 MOV A,@0B11111111 ;LED1-4灭 MOV PORT5,A MOV A,@0B10111111 ;LED7-8亮,5、6灭,HL123灭 MOV PORT6,A CALL SB12 ;调用HL123显示函数 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 JMP FUN6_HL ;循环点亮 ;****************************第7次************************
;指示灯Led1、Led3、Led5和 Led2、Led4、Led6循环间隔亮1s,呈旋转亮 FUN_A7: MOV A,NUM ;将NUM1的还原 MOV NUM1,A CLR ISR ;清除中断标志 ENI ;开中断 BC TCC_FLAG,0 ;清零 MOV A,@40 ;40*25==1000MS MOV T_NUM,A FUN7_HL: MOV A,@0B11111010 ;LED1、3亮,2、4灭 MOV PORT5,A MOV A,@0B11101111 ;LED5亮,6-7-8灭,HL123灭 MOV PORT6,A CALL SB12 ;调用HL123显示函数 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 MOV A,@0B11110101 ;LED1、3灭2、4亮 MOV PORT5,A MOV A,@0B11011111 ;LED5/7-8灭,HL123灭 MOV PORT6,A CALL SB12 ;调用HL123显示函数 MOV A,R2 ;保存当前的地址 JMP SCAN_TCC ;延时结束检测按键函数 JMP FUN7_HL ;循环点亮 ;****************************第8次************************
;指示灯Led1、Led2、Led3、Led4、Led5、Led6、Led7、Led8全部熄灭 FUN_A8: MOV A,@0B11111111 ;LED1-4灭 MOV PORT5,A
MOV A,@0B11111111 ;LED5-8灭,HL123灭 MOV PORT6,A JBS SB3_FLAG,1 ;判断是否为光敏而进入的第八次操作 JMP $+2 JMP $+3
28