技术热线: 4007-888-234

实战十三:按键触发的1位累加器

更新时间: 2019-03-25
阅读量:868

按键触发的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).