www.pudn.com > st-asm.rar > 84seg2.asm


;本实例的目的是让大家进一步了解键盘程序,数码管程序。 
;本实例的功能是用DIGIT作计数器,按S2一下计数器加1,加到9时计数器不再向上加 
;按S3一下计数器减1,减到0时,计数不再减,同时计数器的值送数码管2静态显示 
;PIC单片机学习网-----http://www.pic16.com 
;烧写时应注意:配置位已经在程序中写明,加载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