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


;本例说明动态显示二位数码管的方法,其实动态显示数码管是利用人眼的暂留效应,即 
;轮流让需显示的多个数码管分别各显示一段时间,有的朋友可能会问:这样不是可以看到 
;数码管在闪烁?不,只要你的扫描速度够快,人眼是看不到闪烁的,也不是非常快基本上小于 
;10MS就可以了, 
;程序中使用一个寄存器(DIGIT)作计数器,然后将计数结果输出显示。 
;因为数码管只能显示0-9的十进制输出,所以计数器DIGIT需转换成十进制再输出,程序中将 
;涉及到将十六进制转成十进制BCD码的方法。二进制调整为BCD码的方法是将二进制码左移8次 
;每次移位后都检查低四位LSD+3是否大于7,如果是则再加3,否则不加。接着再将高四位MSD作相同处理 
;本程序的功能是:程序复位后,数码管从0开始显示数字,直到99,然而又从0到99循环显示 
;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 
COUNT1  EQU 11H 
COUNT2  EQU 12H 
TABADD  EQU 13H 
DISPBUF EQU 14H           ;显示值暂存 
DISPBUF_H EQU 15H         ;显示器高位 
DISPBUF_L EQU 16H         ;显示器低位 
BUFFER    EQU 17H 
BUFFER1   EQU 18H 
SUM       EQU 19H 
DIGIT     EQU 1AH         ;0-99计数器 
;-------------------- 
               ORG 0000H 
MAIN 
               CLRF        PORTA 
               CLRF        PORTB   ;初始化IO口 
      
               BSF         STATUS,RP0 ;设置寄存器体1 
               MOVLW       00000000B  ;将所有IO口设置为输出 
               MOVWF       TRISA  
               MOVWF       TRISB   
               BCF         STATUS,RP0  ;恢复寄存器体0 
    
                MOVLW       0FFH       ;先让数码管全部不显示 
                MOVWF       PORTB 
	  	        CLRF	   	DIGIT      ;显示计数器清0 
                CLRF        DISPBUF    ;清显示值 
LOOP1	  	   
                MOVLW       22 
                MOVWF       COUNTER    ;计数器0.2秒钟加1   22*9.2MS=0.2s 
LOOP1_1 
                CALL        DISP       ;调用显示子程序 
                DECFSZ      COUNTER,1   ;显示0.2秒钟 
                GOTO        LOOP1_1 
	  	INCF	   	DIGIT,1       ;计数器加1 
	  	MOVLW    	8 
	  	MOVWF    	COUNTER      	;循环左移计数器置8 
	  	CLRF	   	BUFFER          ;清除缓冲器 
	  	MOVF	   	DIGIT,W    
	  	MOVWF    	BUFFER1          
LOOP2	  	 
                RLF	        BUFFER1,1         ;二进制数转换成BCD码(以便显示) 
	  	RLF	  	BUFFER,1 
	  	DECFSZ   	COUNTER,1          ;左移8次 
	  	GOTO	   	ADJUST             ; 
	  	MOVFW	   	BUFFER 
	  	MOVWF    	DISPBUF         ;是否有进位(即已达100),如已计数到100则 
	  	SKPC                    	;从0开始再计数显示(显示00~99) 
	  	GOTO	   	LOOP1 
	  	GOTO	   	MAIN 
ADJUST	  	 
                MOVLW    	3               ;二进制转BCD的调整 
	  	ADDWF    	BUFFER,W    	;每次移位后都检查低四位LSD+3是否大于7 
	  	MOVWF    	SUM              
	  	BTFSC    	SUM,3 
	  	MOVWF    	BUFFER 
	  	MOVLW    	30H 
	  	ADDWF    	BUFFER,W        ;如果是则再加3,否则不加。 
	  	MOVWF    	SUM 
	  	BTFSC    	SUM,7 
	  	MOVWF    	BUFFER          ;接着再将高四位MSD作相同处理 
	  	GOTO	   	LOOP2 
;- ----------------------------------------- 
DELAY	  		                             ;显示廷时常数,廷时时间为3*255*6+6us+4us=4.6ms 
                MOVLW    	6 
	  	MOVWF    	COUNT1 
L2	  	 
        	MOVLW    	255 
	  	MOVWF    	COUNT2 
L3	  		 
                DECFSZ   	COUNT2,1         
	        GOTO	   	L3 
	  	DECFSZ   	COUNT1,1 
	  	GOTO	   	L2 
	        RETLW    	0 
;-------------------- ---------------------------------- 
DISP 
             SWAPF      DISPBUF,W         ;显示值高低位交换,先处理高位 
             ANDLW      0FH               ;屏蔽掉高位 
             MOVWF      DISPBUF_H         ;存入寄存器 
             MOVFW      DISPBUF           ;显示值低位处理 
             ANDLW      0FH               ;屏蔽掉高位 
             MOVWF      DISPBUF_L         ;存入寄存器 
             MOVLW      0FFH 
             MOVWF      PORTB             ;先熄灭数码管以免闪烁 
             BSF        PORTA,1 
             BCF        PORTA,2           ;先显示低位 
             MOVLW      TABLE 
             MOVWF      TABADD           ;将转换表的首地址存入TABADD   
             MOVFW      DISPBUF_L        ;计数值(W)与转换表的起始地址相加 
             ADDWF      TABADD,W 
             CALL       CONVERT          ;存入W后调用转换表子程序 
             MOVWF      PORTB            ;送RB口显示 
             CALL       DELAY            ;廷时4。7MS 
 
             MOVLW      0FFH             ;同样方法显示高位 
             MOVWF      PORTB 
             BSF        PORTA,2 
             BCF        PORTA,1 
             MOVLW      TABLE 
             MOVWF      TABADD 
             MOVFW      DISPBUF_H 
             ADDWF      TABADD,W 
             CALL       CONVERT 
             MOVWF      PORTB 
             CALL       DELAY 
             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