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