;按键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不要插在演示板上 ;本实例原提供者:pic16论坛会员:雨寒风 ,在此鸣谢雨寒风同志共享本实例. ;由深圳市乾龙盛电子科技有限公司技术部钟闺田(工程师)(论坛网名:zhongruntian)验正并加于整理、注释. ;网站:PIC单片机学习网 http://www.pic16.com 讨论论坛:http://pic16.com/bbs/ ;版权所有,转载请注明出处,并不能去掉或改变文件中的说明文字。 ;程序文件名“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).