;MCD1实战二:《单键触发8位二进制累加计数器》
;程序文件名为"MCD-LED2.ASM"
;该程序的目的是让大家熟悉输入、输出端口的使用
;该程序的功能是把演示板当做一个按键计数器。刚刚接通电源时,8只发光二极管都不亮。
;表示计数器初值为0,当按下开关S3(RB0)时,计数器的值加1,发光二极管D3点亮,表示值1,然后松开
;按钮;再次按下开关S3(RB0)时,计数器的值又加1,发光二极管D4点亮,表示值2,依次类推,反复循环。
;程序清单:
;*************************************************
status equ 3h ;定义状态寄存器地址
portb equ 6h ;定义端口B的数据寄存器地址
trisb equ 86h ;定义端口B的方向控制寄存器地址
portc equ 7h ;定义端口C的数据寄存器地址
trisc equ 87h ;定义端口C的方向控制寄存器地址
data1 equ 20h ;定义一个廷时变量寄存器
data2 equ 21h ;定义另一个廷时变量寄存器
n1 equ d'13' ;定义一个外层循环廷时常数
n2 equ 0ffh ;定义一个内层廷时常数
rp0 equ 5h ;定义状态寄存器的页选位RP0
;*************************************************
org 000h ;定义程序存放区域的起始地址
nop ;放置一条ICD必须的空操作指令
bsf status,rp0 ;设置文件寄存器体1
movlw 00h ;将端口C的方向控制码00H先送W
movwf trisc ;再转到方向寄存器,将其设置为输出
movlw 0ffh ;同理,将端口B设置为输入
movwf trisb ;
bcf status,rp0 ;恢复到文件寄存器体0
movlw 00h ;送计器初值00H到RC口显示
movwf portc ;
check btfsc portb,0 ;测试S3按下否?是!跳过下条指令
goto check ;否!则循环检测
call delay ;调用廷时子程序,消除按钮抖动的影响
btfsc portb,0 ;再次测试S3按下否?是!跳过下条指令
goto check ;否!则循不检测
incf portc,1 ;端口C的数据寄存器加1,并送LED显示
check1 btfss portb,0 ;测试S3断开否?是!跳过下条指令
goto check1 ;否!则循不检测
call delay ;调用廷时子程序,消除按钮抖动的影响
btfss portb,0 ;再次测试S3断开否?是!跳过下条指令
goto check1 ;否!则循不检测