;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
;■1.MCU品牌:飞凌FEELING 8PS53 ;
;■与EMC153 PIN对PIN兼容的一款MCU
;■
;■2.选择内部RC振荡 4M
;■3. 06H,2 ==LED (PORTB 第2PIN)选择为LED
;■4. 05,2 == KEY (PORTA 第2 PIN)选择为KEY
;■5. 外围电路未使用上拉或下拉电阻
;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
;**************************功能说明***
;当按键KEY奇数次闭合时,LED常亮,直到KEY断开
;当按键KEY偶数次闭合时,LED处于3秒点亮,然后熄灭3秒,再点亮3秒,循环...
;;**************
;故障现象:上电,LED端口有不到1V的电压,程序运转时,LED端口电压有少量变化,但不足1V
; LED也不曾点亮
;因为程序简单,也不曾为I/O寄存器进行过设置.默认状态是:
;KEY端口寄存器为:Disable the internal pull-down of IOA2 pin.
;LED端口:Disable the internal open-drain of IOB2 pin
Disable the internal pull-high of IOB2 pin
;***以下为程序******************
ORG 000H
GOTO MAIN_
ORG 008H ;计数器中断向量为008H
TCC_INTO:
BTRSS 0F,0 ;检测TIMO的溢出标志(0F寄存的bit0位),判断是否为计时中断,
;TOIF=1(计时中断发生)则跳转 到PC+2,即 CLRR 0F.否则则执PC+1
; NOP指令. ;本人菜鸟,不知PC+2,PC+1是否描述的正确.
;本说明中的PC+2,PC+1即是上述文字中包含的意思
NOP ;如果此中断不是计时中断,则应该执行其他的判断,
;本程序没有其他情况,用NOP做个空运转。
CLRR 0F ;对溢出标志位的整个寄存器OF进行清零,也就意味着对溢出标志进行了清零
MOVIA 8H
MOVAR 01 ;对计数器赋初值 8
DECRSZ 10,1 ;R10被赋了初值N,这个值意味着,中断循环
;N次才会达到预定的时间。如果减1后,
;值为0则跳转到PC+2,否则执行PC+1。
GOTO R_ETFIE ;没有到预定时间,则要退出中断程序。
MOVIA BDH
MOVAR 10 ;到了预定时间,那么要对R10重新赋初值BDH (189次)
BTRSC 06,2 ;测试LED的端口,如果=0,执行PC+2,如果≠0执行 PC+1
GOTO B_CR
GOTO B_SR
B_CR: BCR 06,2 ;对LED端口设为低电平
GOTO R_ETFIE
B_SR: BSR 06,2 ;对LED端口设为高电平
R_ETFIE:
RETFIE ;退出中断程序
INTOTAL: MOVIA BDH ;十进制 189
MOVAR 10 ;R10赋初值,189
BSR 06,2 ;设置LED端口为高电平
MOVIA 47H ; 1000 111被MOVE到ACC中
OPTION ;设置计数/定时器的寄存器. 1000 111 被设置到寄存器中
CLRR 0E ;对INTEN寄存器清零.此时,定时/计数器处于关闭状态
MOVIA 8H
MOVAR 01 ;对定时/计数器TIMO赋初值8
CLRR 0F ;对定时/计数器溢出标志位进行清零
BSR 0E,7 ; 开启中断总开关GIE位.即对INTEN的Bit7 位进行了置1操作.定时/计数器被启动
SCAN2_: ; 在中断模式工作时,进行反复扫键 =0跳转.=0继续扫
BTRSS 05,2 ;判断KEY端口 =1 PC+2,否则执行PC+1
GOTO SCAN2_
CALL YANSHI_ ;调用延时子程序,进行按键防抖处理
BTRSS 05,2 ;延时后,再次判断KEY端口,=1则GOTO主程序中的SCAN_段,否则将在本段继续扫键.
GOTO SCAN2_
GOTO SCAN_
;======================以上是中断部分========================
MAIN_:
CLRR 11 ;通用寄存器R11被清零
SCAN_:BCR 06,2 ;LED端口被清0
CLRR 0E ;加入关闭中断的指令,当从中断模式中返回时,可以关闭中断.
BTRSC 05,2 ;按键扫描,如果=0跳一行执行 call YANSHI_,否则执行下一行的GOTO SCAN_
GOTO SCAN_
CALL YANSHI_
BTRSC 05,2 ;延时后,继续扫键.若KEY=0 则跳一行执行 GOTO JUDGE_,
;否则在本段落继续扫键
GOTO SCAN_
GOTO JUDGE_
JUDGE_: INCR 11,1 ;R11寄存器加1
BTRSC 11,0 ;测试R11的bit0位,如果是0,表示是偶数次按键,若是1表示为奇数次按键
;当R11的bit 0位 =0时,跳一行,执行 INTOTAL
;当R11的bit 0位 ≠0时,执行下一行 goto odd_no
GOTO ODD_NO
GOTO INTOTAL
ODD_NO:
BSR 06,2 ;已经判断为奇数次按键,进入到奇数模式.开启LED长亮
SCAN1_:
BTRSS 05,2 ;开启LED后,进入到不间断的扫键状态.当KEY=1时,跳一行执行
;指令 CALL YANSHI_.否则即
;当KEY ≠1时,执行下一行的GOTO SCAN1_
GOTO SCAN1_
CALL YANSHI_
BTRSS 05,2 ;延时回来后,重新测键.
GOTO SCAN1_ ;KEY≠1时,执行本行
GOTO SCAN_ ;KEY=1,执行本行.KEY=1表示按键没有接地,已经断开.
;因此程序返回到主程序中的SCAN_扫键
;==================以上为主程序+奇数模式的程序===========
;=======================以下为延时程序,供扫键时调用==============
YANSHI_: MOVIA 30H
MOVAR 13H ;R13赋初值 30H
YANSHI8_: MOVIA 3H
MOVAR 12H ;R12赋初值3H
YANSHI5_: MOVIA 90H ;R14赋初值 90H
MOVAR 14H
YS0_: DECRSZ 14H,1 ;R14-1→R14,当结果=0跳过一行执行,否则下一行的GOTO到本行
GOTO YS0_
YANSHI6_: DECRSZ 12H,1 ;R12-1→R12,结果=0,跳过一行执行指令,否则,执行下一行的GOTO
GOTO YANSHI5_
YANSHI7_: DECRSZ 13H,1
GOTO YANSHI8_
RETURN
;---------------------请高手赐教 |