;本实例的目的是让大家进一步了解键盘程序,数码管程序。;
本实例的功能是用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