;实战5《静态数码管键控计数器实例》
;本实验的目的是让大家熟悉数码管,学习怎样应用查表程序,本程序的功能是要用PIC来实现1位
;数码管显示,程序复位后先由第一个数码管从0循环显示到9,再由第二个数码管从0显示到9,然后第三个,
;第四个,第五个,第六个再由第一个数码管显示返复循环。程序中用一个计数器由0计数到9,同时将其在LED
;上显示出来。该例给出计数值与显示码的转换方法。
;程序文件名:“MCD-SEG.ASM"
;************************************************
;程序清单
LIST P=16F877A,R=DEC
;************************************************
__CONFIG B'11011100110001';
RTCC EQU 01H
PCL EQU 02H ;定义程序计数器低字节寄存器地址
STATUS EQU 03H ;定义状态寄存器地址
PORTA EQU 05H ;定义RA口数据寄存器地址
PORTB EQU 06H
PORTC EQU 07H ;定义RC口数据寄存器地址
INTCON EQU 0BH
OPTION_REG EQU 81H
TRISA EQU 85H ;定义RA口方向控制寄存器
TRISB EQU 86H
TRISC EQU 87H ;定义RC口方向控制寄存器
ADCON1 EQU 9FH ;定义ADC模块控制寄存器1的地址
;-----------------------STATUS
C EQU 0 ;定义进位标志位位地址
Z EQU 2 ;定义0标志位位地址
RP0 EQU 5 ;定义页选位RP0位地址
;-----------------------
COUNTER EQU 20H ;定义计数器寄存器
COUNT0 EQU 21H ;定义廷时变量计数器
COUNT1 EQU 22H ;定义廷时变量计数器
COUNT2 EQU 23H ;定义廷时变量计数器
DISP_COUNT EQU 24H
DISP_COUNT1 EQU 25H
DISPBUFF_1 EQU 26H
DISPBUFF_2 EQU 27H
DISPBUFF_0 EQU 28H
DISPBUFF_3 EQU 29H
DISPBUFF_4 EQU 2AH
DISPBUFF_5 EQU 2BH
DATA1 EQU 2CH
;-------------------------INTCON
T0IF EQU 2 ;定时器0溢出中断标志位
T0IE EQU 5 ;定时器0溢出中断允许/禁止
GIE EQU 7 ;总中断允许/禁止
W_TEMP EQU 7FH
STATUS_TEMP EQU 30H
;--------------------
ORG 0000H
NOP ;放置一条ICD必需的空操作指令
GOTO MAIN
ORG 0004H
TMR0SERV
MOVWF W_TEMP ;现场保护
SWAPF STATUS,W ;用SWAPF才不会影响标志位
MOVWF STATUS_TEMP ;将W和STATUS存入各保护寄存器
MOVLW 0FFH
MOVWF PORTC ;先熄灭数码管以免闪烁
MOVLW 0FFH
MOVWF PORTA
MOVFW DISP_COUNT
MOVWF DISP_COUNT1
DECFSZ DISP_COUNT1,1
GOTO TMR0_1
MOVFW DISPBUFF_0
CALL CONVERT ;存入W后调用转换表子程序
MOVWF PORTC ;送RB口