按键触发的1位累加器
;按键S3触发累加计数显示0---9的数码管程序
;使用资源
;1、PORTA口,做为6位数码管的位选信号
;2、PORTB口,在此只利用了RBO口做按键输入
;3、PORTC口,7段数码管的段信号
;功能说明
;1、该程序的功能是把演示板当做一个按键计数器。接通电源时,按下IDE软软件的运行键6只数码管全显示000000。
;每按下开关S3(RB0)时,计数器的值加1,数码管显示也增加1,然后松开按钮;以些类推,反复循环。
;2、程序中包含按键按下检测跟释放检测,并且都伴有一定的延时去抖功能,只有在一次按键被释放后才进行第2次按键的判断
;3、程序中需开启B口的内部弱上拉功能,因DEMO板上无上拉电阻;并把A口全部设置为普通I/O口,上电复位后A口为模拟输入口。
;硬件连接
;1、DEMO实验板作以下设置 s1拔到0FF,S13除拔码开关1为ON外其余的全拔到OFF
;2、S4,S5全部拔到ON LCD不要插在演示板上
;程序文件名“count.ASM"
;程序清单如下:
;**************************************************
__CONFIG 3F39H;设置配置位中振荡方式为XT,其它全部禁止或关闭
;*************************************************
PCL equ 2h ;定义寄存器PCL的地址为02H
status equ 3h ;定义状态寄存器地址
porta equ 5h ;定义端口A的数据寄存器地址
portb equ 6h ;定义端口B的数据寄存器地址
portc equ 7h ;定义端口C的数据寄存器地址
trisa equ 85h ;定义端口A的方向控制寄存器地址
trisb equ 86h ;定义端口B的方向控制寄存器地址
trisc equ 87h ;定义端口C的方向控制寄存器地址
option_reg equ 81h
adcon1 equ 9fh ;ADC控制寄存器1
;**************************************************
data1 equ 20h ;定义一个廷时变量寄存器
data2 equ 21h ;定义另一个廷时变量寄存器
n1 equ d'13' ;定义一个外层循环廷时常数
n2 equ 0ffh ;定义一个内层廷时常数
rp0 equ 5 ;定义状态寄存器的页选位RP0
z equ 2 ;定义0标志位位地址
;********************************************** ***
wang equ 22h ;定义显示寄存器的地址
yan equ 23h ;定义计数寄存器的地址
;*************************************************
org 000h ;定义程序存放区域的起始地址
nop ;放置一条ICD必须的空操作指令
goto main
main bsf status,rp0 ;设置文件寄存器体1
movlw 00h ;将端口C的方向控制码00H先送W
movwf trisa ;再转到方向寄存器,将其设置为输出
movwf trisc ;设置C口为输出
movlw 0ffh ;同理,将端口B设置为输入
movwf trisb
clrf option_reg ;开起内部弱上拉
movlw 06h
movwf adcon1 ;设置A口为普通的数字口
bcf status,rp0 ;恢复到文件寄存器体0
clrf porta ;使PORTA输出为低电平,让所有数码管共阳极都为高电平
loop1 movlw .10
movwf yan ;设置循环值10
movlw 00h
movwf wang ;送初值00H到wang显示寄存器
loop2
movf wang,0
subwf yan,0 ;判断是否到了显示数值“9”
btfsc status,z ;全亮则返回loop1重新给yan,wang赋值为0
goto loop1
movf wang,0 ;否则继续调用显示程序
call CHABIAO ;调用数码段显示程序
movwf portc
;-----------------------------------------------------------------------------
;测试按键与否,以及如按下键则寄存器wang的数据加1
;-----------------------------------------------------------------------------
check btfsc portb,0 ;测试S3按下否?是!跳过下条指令
goto check ;否!则循环检测
call delay ;调用廷时子程序,消除按钮抖动的影响
btfsc portb,0 ;再次测试S3按下否?是!跳过下条指令
goto check ;否!则循不检测
incf wang,1 ;寄存器wang的数据寄存器加1
check1 btfss portb,0 ;测试S3断开否?是!跳过下条指令
goto check1 ;否!则循不检测
call delay ;调用廷时子程序,消除按钮抖动的影响
btfss portb,0 ;再次测试S3断开否?是!跳过下条指令
goto check1 ;否!则循不检测
goto loop2 ;返回
;*************10MS廷时子程序************************
delay ;子程序名,也是子程序入口地址
movlw n1 ;将外层循环参数值送到DATA1
movwf data1
lp0 movlw n2 ;将内层循环参数值送到DATA2
movwf data2
lp1 decfsz data2,1 ;变量DATA2内容递减,若为0则跳跃
goto lp1 ;跳转到LP1
decfsz data1,1 ;变量DATA1内容递减,若为0则跳跃
goto lp0 ;跳转到LP0
return ;返回主程序
;***********共阳数码管查表子程序***************
CHABIAO ;取数码管段码
ADDWF PCL,1 ;地址偏移量加当前PC
RETLW 0C0H ;0
RETLW 0F9H ;1
RETLW 0A4H ;2
RETLW 0B0H ;3
RETLW 99H ;4
RETLW 92H ;5
RETLW 82H ;6
RETLW 0F8H ;7
RETLW 80H ;8
RETLW 98H ;9
;-----------------------------------------------------------------------------
END ;源程序结束
;-----------------------------------------------------------------------------
; 进入该实战演练的工序流程如下:
; 1.创建源文件和编辑源文件;在此介绍一种不同于前面讲的创建源文件的方法,用Windows附件中的”记事本”
; 这个为大家所熟知和好用的文件编辑器,并且可以方便的加入中文注释.不过有两点需要注意,一是注释前面的
; 分号”;”必须用西文半角输入;二是必须用”.asm”扩展名存储到事先建立的一个专用子目录下.
; 2.打开MPLAB集成开发环境:首先在WINDOWS环境下,选用开始>程序>Microchip MPLAB>MPLAB命令,启动MPLAB
; 并进入MPLAB的桌面.
; 3.创建项目:选用菜单File>New或Project>New Project,在事先建立的一个专用子目录下创建一个新项目,将
; 用记事本创建的源文件加入到该项目中.
; 4.建立项目中的目标文件:选择菜单Project >Build All(项目>建立所有文件),MPLAB将自动调用MPASM将项目
; 文件管理下的源文件(.asm)汇编成十六进制的目标文件(.hex).