技术热线: 4007-888-234
设计开发

专注差异化嵌入式产品解决方案 给智能产品定制注入灵魂给予生命

开发工具

提供开发工具、应用测试 完善的开发代码案例库分享

技术支持

从全面的产品导入到强大技术支援服务 全程贴心伴随服务,创造无限潜能!

新闻中心

提供最新的单片机资讯,行业消息以及公司新闻动态

实战八:一位键控计数器

更新时间: 2019-01-05
阅读量:648

;本实例的目的是让大家进一步了解键盘程序,数码管程序。;

本实例的功能是用DIGIT作计数器,按S2一下计数器加1,加到9时计数器不再向上加;

按S3一下计数器减1,减到0时,计数不再减,同时计数器的值送数码管2静态显示;

烧写时应注意:配置位已经在程序中写明,加载HEX文件时会自动加载,烧写时不用再手动设置配置位。;

实验时请注意套件跳线选择;

;*

LIST P=16F84A,R=DEC ;定义器件为16F84,默认数制为十进制

;———————————————————————————-

__CONFIG B’11111111110001’;_CP_OFF&_WDT_OFF&_PWRITE_ON&_XT_OSC

                                        ;没有代码保护                                              

                                     ;看门狗关闭                                              

                                     ;上电廷时器开启                                              

                                     ;振荡器模式为XT

;———————————————————————————-

PC EQU 02H ; 变量单元定义

STATUS EQU 03

HPORTA EQU 05H

PORTB EQU 06H

TRISA EQU 5H

TRISB EQU 6H;

———————————-STATUS

RP0 EQU 5

;———————————-

COUNTER EQU 10H ;

DIGIT EQU 11H

COUNT1 EQU 12H

COUNT2 EQU 13H

TABADD EQU 14H;


       ORG         0000H

MAIN

        CLRF        PORTA ;初始IO口

        CLRF        PORTB

             BSF 

    STATUS,RP0 ;设置数据寄存器体1 

       MOVLW       00011000B ;设置SW2,SW3口为输入、其它口全部为输出  

      MOVWF       TRISA  

       CLRW 

       MOVWF       TRISB

          BCF         STATUS,RP0 ;恢复数据寄存器体0 

       CLRF        DIGIT      ;清计数器

        GOTO        LOOP1      ;先显示0

;———————————

LOOP

       BTFSS       PORTA,3    ;扫描键S2是否有按下

        GOTO        SET_1

        BTFSS       PORTA,4    ;扫描键S3是否有按下

        GOTO        SET_2 

GOTO  LOOP ;循环扫描

LOOP1 ;数码管显示程序

        MOVLW       TABLE      ;将转换表的首地址存入TABADD

        MOVWF       TABADD 

            MOVFW       DIGIT            

ADDWF TABADD,W ;计数值(W)与转换表的起始地址相加

        CALL        CONVERT    ;存入W后调用转换表子程序

        MOVWF       PORTB      ;取出的七段显示码送RB口显示

        BSF         PORTA,1    ;让一位数码管亮 

       GOTO        LOOP

;————————————————-

SET_1

        BTFSC       PORTA,3   ;去除键抖动

        GOTO        LOOP

        CALL        DELAY

        BTFSC       PORTA,3 

       GOTO        LOOP 

       MOVLW       09H       ;计数值为9后不再加1 

       XORWF       DIGIT,0 

       BZ          LOOP 

       INCF        DIGIT,1   ;不为9计数值加1

        GOTO        LOOP1     ;到数码管显示

;————————————————-

SET_2 BTFSC PORTA,4 ;去除键抖动

        GOTO        LOOP

        CALL        DELAY

        BTFSC       PORTA,4

        GOTO        LOOP  

      MOVF        DIGIT,1 ;计算值为0后不再减1

        BZ          LOOP

        DECF        DIGIT,1 ;不为0计数值减1

        GOTO        LOOP1   ;到数码管显示

;————————————————-

DELAY ;设置延时常数

       MOVLW    150



MOVWF    COUNT1

L2 MOVLW 255

MOVWF    COUNT2

L3 DECFSZ COUNT2,1 ;递减循环?

 GOTO   L3

DECFSZ   COUNT1,1

GOTO   L2

RETLW    0

;—————————— —————————————————

CONVERT MOVWF PC

             ;将W寄存器内的7段显示码地址放入PC

TABLE ; PC执行新地址指令, 跳到相对的地址执行?

        RETLW    081H     ;0  ;RETLW指令,将七段显示码存入W后返回

        RETLW    0E7H     ;1

        RETLW    092H     ;2

        RETLW    0A2H     ;3  

        RETLW    0E4H     ;4

        RETLW    0A8H     ;5 

        RETLW    088H     ;6 

        RETLW    0E3H     ;7 

        RETLW    080H     ;8  

        RETLW    0A0H     ;9

;——- ———————————————————————-

END