2个回答
展开全部
STC12C2052AD单片机看门狗及其溢出时间计算公式
;本程序用于验证 STC12C2052AD 系列单片机的看门狗及其溢出时间计算公式
;看门狗及其溢出时间 = (12 * Pre_scale *32768)/Oscillator frequency
WDTCR EQU 0E1H ;看门狗地址
WDT_TIME_LED EQU P1.5 ;用 P1.5 控制看门狗溢出时间指示灯,
;看门狗溢出时间可由该指示灯亮的时间长度或熄灭的时间长度表示
WDT_FLAG_LED EQU P1.7 ;用 P1.7 控制看门狗溢出复位指示灯, 如点亮表示为看门狗溢出复位
Last_WDT_Time_LED_Status EQU 00H ;位变量, 存储看门狗溢出时间指示灯的上一次状态位
;WDT 复位时间(Oscillator frequency = 18.432MHz):
;Pre_scale_Word EQU 00111100B ;清0、启动看门狗,预分频数=32 0.68S
Pre_scale_Word EQU 00111101B ;清0、启动看门狗,预分频数=64 1.36S
;Pre_scale_Word EQU 00111110B ;清0、启动看门狗,预分频数=128 2.72S
;Pre_scale_Word EQU 00111111B ;清0、启动看门狗,预分频数=256 5.44S
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN:
MOV A, WDTCR ;检测是否为看门狗复位
ANL A, #10000000B
JNZ WDT_Reset ;WDTCR.7 = 1, 看门狗复位, 跳转到看门狗复位程序
;上电复位, 冷启动, RAM 单元内容为随机值
SETB Last_WDT_Time_LED_Status ;上电复位,
;初始化看门狗溢出时间指示灯的状态位 = 1
CLR WDT_TIME_LED ;上电复位, 点亮看门狗溢出时间指示灯
MOV WDTCR, #Pre_scale_Word ;启动看门狗
WAIT1:
SJMP WAIT1 ;循环执行本语句(停机),等待看门狗溢出复位
;看门狗复位, 热启动, RAM 单元内容不变, 为复位前的值
WDT_Reset: ;看门狗复位, 热启动
CLR WDT_FLAG_LED ;点亮看门狗溢出复位指示灯
JB Last_WDT_Time_LED_Status, Power_Off_WDT_TIME_LED
;根据看门狗溢出时间指示灯的上一次状态位设置 WDT_TIME_LED 灯,
;若上次亮本次就熄灭, 若上次熄灭本次就亮
CLR WDT_TIME_LED ;上次熄灭本次点亮看门狗溢出时间指示灯
CPL Last_WDT_Time_LED_Status ;将看门狗溢出时间指示灯的上一次状态位取反
WAIT2:
SJMP WAIT2 ;循环执行本语句(停机),等待看门狗溢出复位
Power_Off_WDT_TIME_LED:
SETB WDT_TIME_LED ;上次亮本次就熄灭看门狗溢出时间指示灯
CPL Last_WDT_Time_LED_Status ;将看门狗溢出时间指示灯的上一次状态位取反
WAIT3:
SJMP WAIT3 ;循环执行本语句(停机),等待看门狗溢出复位
END
;用STC的MCU的IO方式控制74HC595驱动8位数码管。
;用户可以修改宏来选择时钟频率.
;用户可以在"用户定义宏"中选择共阴或共阳. 推荐尽量使用共阴数码管.
;显示效果为: 显示时间或8个数码管循环显示0,1,2...,A,B..F, (编译选择).
;使用Timer0的16位自动重装来产生1ms节拍,程序运行于这个节拍下, 用户修改MCU主时钟频率时,自动定时于1ms.
;******************************************/
;/****************************** 用户定义宏 ***********************************/
Fosc_KHZ EQU 22118 ;22118KHZ
STACK_POIRTER EQU 0D0H ;堆栈开始地址
RTC_ENABLE EQU 1 ; 1: 显示时间, 0: 8个数码管循环显示0,1,2...,A,B..F,消隐
LED_TYPE EQU 000H ; 定义LED类型, 000H -- 共阴, 0FFH -- 共阳
Timer0_Reload EQU (65536 - Fosc_KHZ) ; Timer 0 中断频率, 1000次/秒
DIS_DOT EQU 020H
DIS_BLACK EQU 010H
DIS_ EQU 011H
;*******************************************************************
;*******************************************************************
AUXR DATA 08EH
P4 DATA 0C0H
P5 DATA 0C8H
;************* IO口定义 **************/
P_HC595_SER BIT P4.0 ; //pin 14 SER data input
P_HC595_RCLK BIT P5.4 ; //pin 12 RCLk store (latch) clock
P_HC595_SRCLK BIT P4.3 ; //pin 11 SRCLK Shift data clock
;************* 本地变量声明 **************/
Flag0 DATA 20H
B_1ms BIT Flag0.0 ; 1ms标志
LED8 DATA 30H ; 显示缓冲 30H ~ 37H
display_index DATA 38H ; 显示位索引
hour DATA 39H ;
minute DATA 3AH
second DATA 3BH ;
msecond_H DATA 3CH ;
msecond_L DATA 3DH ;
;*******************************************************************
;*******************************************************************
ORG 00H ;reset
LJMP F_Main
ORG 03H ;0 INT0 interrupt
RETI
LJMP F_INT0_Interrupt
ORG 0BH ;1 Timer0 interrupt
LJMP F_Timer0_Interrupt
ORG 13H ;2 INT1 interrupt
LJMP F_INT1_Interrupt
ORG 1BH ;3 Timer1 interrupt
LJMP F_Timer1_Interrupt
ORG 23H ;4 UART1 interrupt
LJMP F_UART1_Interrupt
ORG 2BH ;5 ADC and SPI interrupt
LJMP F_ADC_Interrupt
ORG 33H ;6 Low Voltage Detect interrupt
LJMP F_LVD_Interrupt
ORG 3BH ;7 PCA interrupt
LJMP F_PCA_Interrupt
ORG 43H ;8 UART2 interrupt
LJMP F_UART2_Interrupt
ORG 4BH ;9 SPI interrupt
LJMP F_SPI_Interrupt
ORG 53H ;10 INT2 interrupt
LJMP F_INT2_Interrupt
ORG 5BH ;11 INT3 interrupt
LJMP F_INT3_Interrupt
ORG 63H ;12 Timer2 interrupt
LJMP F_Timer2_Interrupt
ORG 83H ;16 INT4 interrupt
LJMP F_INT4_Interrupt
;*******************************************************************
;*******************************************************************
IF (RTC_ENABLE == 1)
;//========================================================================
;// 函数: F_DisplayRTC
;// 描述: 显示时钟子程序。
;// 参数: none.
;// 返回: none.
;// 版本: VER1.0
;// 日期: 2013-4-1
;// 备注: 除了ACCC和PSW外, 所用到的通用寄存器都入栈
;//========================================================================
F_DisplayRTC:
PUSH B ;B入栈
MOV A, hour
MOV B, #10
DIV AB
MOV LED8, A
MOV LED8+1, B
MOV LED8+2, #DIS_;
MOV A, minute
MOV B, #10
DIV AB
MOV LED8+3, A;
MOV LED8+4, B;
MOV LED8+5, #DIS_;
MOV A, second
MOV B, #10
DIV AB
MOV LED8+6, A;
MOV LED8+7, B;
POP B ;B出栈
RET
/********************** RTC演示函数 ************************/
;//========================================================================
;// 函数: F_RTC
;// 描述: RTC演示子程序。
;// 参数: none.
;// 返回: none.
;// 版本: VER1.0
;// 日期: 2013-4-1
;// 备注: 除了ACCC和PSW外, 所用到的通用寄存器都入栈
;//========================================================================
F_RTC:
INC second ; second + 1
MOV A, second
CLR C
SUBB A,#60
JC L_QuitRTC ; second >= 60?
MOV second, #0;
INC minute ; minute + 1
MOV A, minute
CLR C
SUBB A,#60
JC L_QuitRTC ; minute >= 60?
MOV minute, #0
INC hour ; hour + 1
MOV A, hour
CLR C
SUBB A,#24
JC L_QuitRTC ; hour >= 24?
MOV hour, #0
L_QuitRTC:
RET
ENDIF
;******************** 主程序 **************************/
F_Main:
MOV SP, #STACK_POIRTER
MOV PSW, #0 ;选择第0组R0~R7
MOV display_index, #0
MOV R0, #LED8
MOV R2, #8
L_ClearLoop:
MOV @R0, #DIS_BLACK ;上电消隐
INC R0
DJNZ R2, L_ClearLoop
CLR TR0
ORL AUXR, #(1 SHL 7) ; Timer0_1T();
ANL TMOD, #NOT 04H ; Timer0_AsTimer();
ANL TMOD, #NOT 03H ; Timer0_16bitAutoReload();
MOV TH0, #Timer0_Reload / 256 ;Timer0_Load(Timer0_Reload);
MOV TL0, #Timer0_Reload MOD 256
SETB ET0 ; Timer0_InterruptEnable();
SETB TR0 ; Timer0_Run();
SETB EA ; 打开总中断
MOV hour, #12 ; 初始化时间值
MOV minute, #0
MOV second, #0
IF (RTC_ENABLE == 1)
LCALL F_DisplayRTC
ENDIF
L_Main_Loop:
JNB B_1ms, L_Main_Loop ;1ms未到
CLR B_1ms
; MOV A, msecond_L ;msecond + 1
; ADD A, #1
; MOV msecond_L, A
; MOV A, msecond_H
; ADDC A, #0
; MOV msecond_H, A
INC msecond_L ;msecond + 1
MOV A, msecond_L
JNZ $+4
INC msecond_H
MOV A, msecond_L ;msecond - 1000
CLR C
SUBB A, #LOW 1000
MOV A, msecond_H
SUBB A, #HIGH 1000
JC L_Main_Loop ;if(msecond < 1000), jmp
MOV msecond_L, #0 ;if(msecond >= 1000)
MOV msecond_H, #0
IF (RTC_ENABLE == 1)
LCALL F_RTC
LCALL F_DisplayRTC
ELSE
MOV R0, #LED8
MOV R2, #8
L_LoadLoop:
MOV @R0, second
INC R0
DJNZ R2, L_LoadLoop
INC second ;8个数码管循环显示0,1,2...,A,B..F.
ANL second, #0FH
ENDIF
LJMP L_Main_Loop
;**********************************************/
; *********************** 显示相关程序 ****************************************
T_Display: ;标准字库
; 0 1 2 3 4 5 6 7 8 9 A B C D E F
DB 03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,06FH,077H,07CH,039H,05EH,079H,071H
; black - H J K L N o P U t G Q r M y
DB 000H,040H,076H,01EH,070H,038H,037H,05CH,073H,03EH,078H,03dH,067H,050H,037H,06EH
; 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
DB 0BFH,086H,0DBH,0CFH,0E6H,0EDH,0FDH,087H,0FFH,0EFH,046H
T_COM:
DB 001H,002H,004H,008H,010H,020H,040H,080H ; 位码
;//========================================================================
;// 函数: F_Send_595
;// 描述: 向HC595发送一个字节子程序。
;// 参数: ACC: 要发送的字节数据.
;// 返回: none.
;// 版本: VER1.0
;// 日期: 2013-4-1
;// 备注: 除了ACCC和PSW外, 所用到的通用寄存器都入栈
;//========================================================================
F_Send_595:
PUSH 02H ;R2入栈
MOV R2, #8
L_Send_595_Loop:
RLC A
MOV P_HC595_SER,C
SETB P_HC595_SRCLK
CLR P_HC595_SRCLK
DJNZ R2, L_Send_595_Loop
POP 02H ;R2出栈
RET
;//========================================================================
;// 函数: F_DisplayScan
;// 描述: 显示扫描子程序。
;// 参数: none.
;// 返回: none.
;// 版本: VER1.0
;// 日期: 2013-4-1
;// 备注: 除了ACCC和PSW外, 所用到的通用寄存器都入栈
;//========================================================================
F_DisplayScan:
PUSH DPH ;DPH入栈
PUSH DPL ;DPL入栈
PUSH 00H ;R0 入栈
MOV DPTR, #T_COM
MOV A, display_index
MOVC A, @A+DPTR
XRL A, #NOT LED_TYPE
LCALL F_Send_595 ;输出位码
MOV DPTR, #T_Display
MOV A, display_index
ADD A, #LED8
MOV R0, A
MOV A, @R0
MOVC A, @A+DPTR
XRL A, #LED_TYPE
LCALL F_Send_595 ;输出段码
SETB P_HC595_RCLK
CLR P_HC595_RCLK ; 锁存输出数据
INC display_index
MOV A, display_index
ANL A, #0F8H ; if(display_index >= 8)
JZ L_QuitDisplayScan
MOV display_index, #0; ;8位结束回0
L_QuitDisplayScan:
POP 00H ;R0 出栈
POP DPL ;DPL出栈
POP DPH ;DPH出栈
RET
;*******************************************************************
;**************** 中断函数 ***************************************************
F_Timer0_Interrupt: ;Timer0 1ms中断函数
PUSH PSW ;PSW入栈
PUSH ACC ;ACC入栈
LCALL F_DisplayScan ; 1ms扫描显示一位
SETB B_1ms ; 1ms标志
POP ACC ;ACC出栈
POP PSW ;PSW出栈
RETI
F_Timer1_Interrupt:
RETI
F_Timer2_Interrupt:
RETI
F_INT0_Interrupt:
RETI
F_INT1_Interrupt:
RETI
F_INT2_Interrupt:
RETI
F_INT3_Interrupt:
RETI
F_INT4_Interrupt:
RETI
F_UART1_Interrupt:
RETI
F_UART2_Interrupt:
RETI
F_ADC_Interrupt:
RETI
F_LVD_Interrupt:
RETI
F_PCA_Interrupt:
RETI
F_SPI_Interrupt:
RETI
END
;本程序用于验证 STC12C2052AD 系列单片机的看门狗及其溢出时间计算公式
;看门狗及其溢出时间 = (12 * Pre_scale *32768)/Oscillator frequency
WDTCR EQU 0E1H ;看门狗地址
WDT_TIME_LED EQU P1.5 ;用 P1.5 控制看门狗溢出时间指示灯,
;看门狗溢出时间可由该指示灯亮的时间长度或熄灭的时间长度表示
WDT_FLAG_LED EQU P1.7 ;用 P1.7 控制看门狗溢出复位指示灯, 如点亮表示为看门狗溢出复位
Last_WDT_Time_LED_Status EQU 00H ;位变量, 存储看门狗溢出时间指示灯的上一次状态位
;WDT 复位时间(Oscillator frequency = 18.432MHz):
;Pre_scale_Word EQU 00111100B ;清0、启动看门狗,预分频数=32 0.68S
Pre_scale_Word EQU 00111101B ;清0、启动看门狗,预分频数=64 1.36S
;Pre_scale_Word EQU 00111110B ;清0、启动看门狗,预分频数=128 2.72S
;Pre_scale_Word EQU 00111111B ;清0、启动看门狗,预分频数=256 5.44S
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN:
MOV A, WDTCR ;检测是否为看门狗复位
ANL A, #10000000B
JNZ WDT_Reset ;WDTCR.7 = 1, 看门狗复位, 跳转到看门狗复位程序
;上电复位, 冷启动, RAM 单元内容为随机值
SETB Last_WDT_Time_LED_Status ;上电复位,
;初始化看门狗溢出时间指示灯的状态位 = 1
CLR WDT_TIME_LED ;上电复位, 点亮看门狗溢出时间指示灯
MOV WDTCR, #Pre_scale_Word ;启动看门狗
WAIT1:
SJMP WAIT1 ;循环执行本语句(停机),等待看门狗溢出复位
;看门狗复位, 热启动, RAM 单元内容不变, 为复位前的值
WDT_Reset: ;看门狗复位, 热启动
CLR WDT_FLAG_LED ;点亮看门狗溢出复位指示灯
JB Last_WDT_Time_LED_Status, Power_Off_WDT_TIME_LED
;根据看门狗溢出时间指示灯的上一次状态位设置 WDT_TIME_LED 灯,
;若上次亮本次就熄灭, 若上次熄灭本次就亮
CLR WDT_TIME_LED ;上次熄灭本次点亮看门狗溢出时间指示灯
CPL Last_WDT_Time_LED_Status ;将看门狗溢出时间指示灯的上一次状态位取反
WAIT2:
SJMP WAIT2 ;循环执行本语句(停机),等待看门狗溢出复位
Power_Off_WDT_TIME_LED:
SETB WDT_TIME_LED ;上次亮本次就熄灭看门狗溢出时间指示灯
CPL Last_WDT_Time_LED_Status ;将看门狗溢出时间指示灯的上一次状态位取反
WAIT3:
SJMP WAIT3 ;循环执行本语句(停机),等待看门狗溢出复位
END
;用STC的MCU的IO方式控制74HC595驱动8位数码管。
;用户可以修改宏来选择时钟频率.
;用户可以在"用户定义宏"中选择共阴或共阳. 推荐尽量使用共阴数码管.
;显示效果为: 显示时间或8个数码管循环显示0,1,2...,A,B..F, (编译选择).
;使用Timer0的16位自动重装来产生1ms节拍,程序运行于这个节拍下, 用户修改MCU主时钟频率时,自动定时于1ms.
;******************************************/
;/****************************** 用户定义宏 ***********************************/
Fosc_KHZ EQU 22118 ;22118KHZ
STACK_POIRTER EQU 0D0H ;堆栈开始地址
RTC_ENABLE EQU 1 ; 1: 显示时间, 0: 8个数码管循环显示0,1,2...,A,B..F,消隐
LED_TYPE EQU 000H ; 定义LED类型, 000H -- 共阴, 0FFH -- 共阳
Timer0_Reload EQU (65536 - Fosc_KHZ) ; Timer 0 中断频率, 1000次/秒
DIS_DOT EQU 020H
DIS_BLACK EQU 010H
DIS_ EQU 011H
;*******************************************************************
;*******************************************************************
AUXR DATA 08EH
P4 DATA 0C0H
P5 DATA 0C8H
;************* IO口定义 **************/
P_HC595_SER BIT P4.0 ; //pin 14 SER data input
P_HC595_RCLK BIT P5.4 ; //pin 12 RCLk store (latch) clock
P_HC595_SRCLK BIT P4.3 ; //pin 11 SRCLK Shift data clock
;************* 本地变量声明 **************/
Flag0 DATA 20H
B_1ms BIT Flag0.0 ; 1ms标志
LED8 DATA 30H ; 显示缓冲 30H ~ 37H
display_index DATA 38H ; 显示位索引
hour DATA 39H ;
minute DATA 3AH
second DATA 3BH ;
msecond_H DATA 3CH ;
msecond_L DATA 3DH ;
;*******************************************************************
;*******************************************************************
ORG 00H ;reset
LJMP F_Main
ORG 03H ;0 INT0 interrupt
RETI
LJMP F_INT0_Interrupt
ORG 0BH ;1 Timer0 interrupt
LJMP F_Timer0_Interrupt
ORG 13H ;2 INT1 interrupt
LJMP F_INT1_Interrupt
ORG 1BH ;3 Timer1 interrupt
LJMP F_Timer1_Interrupt
ORG 23H ;4 UART1 interrupt
LJMP F_UART1_Interrupt
ORG 2BH ;5 ADC and SPI interrupt
LJMP F_ADC_Interrupt
ORG 33H ;6 Low Voltage Detect interrupt
LJMP F_LVD_Interrupt
ORG 3BH ;7 PCA interrupt
LJMP F_PCA_Interrupt
ORG 43H ;8 UART2 interrupt
LJMP F_UART2_Interrupt
ORG 4BH ;9 SPI interrupt
LJMP F_SPI_Interrupt
ORG 53H ;10 INT2 interrupt
LJMP F_INT2_Interrupt
ORG 5BH ;11 INT3 interrupt
LJMP F_INT3_Interrupt
ORG 63H ;12 Timer2 interrupt
LJMP F_Timer2_Interrupt
ORG 83H ;16 INT4 interrupt
LJMP F_INT4_Interrupt
;*******************************************************************
;*******************************************************************
IF (RTC_ENABLE == 1)
;//========================================================================
;// 函数: F_DisplayRTC
;// 描述: 显示时钟子程序。
;// 参数: none.
;// 返回: none.
;// 版本: VER1.0
;// 日期: 2013-4-1
;// 备注: 除了ACCC和PSW外, 所用到的通用寄存器都入栈
;//========================================================================
F_DisplayRTC:
PUSH B ;B入栈
MOV A, hour
MOV B, #10
DIV AB
MOV LED8, A
MOV LED8+1, B
MOV LED8+2, #DIS_;
MOV A, minute
MOV B, #10
DIV AB
MOV LED8+3, A;
MOV LED8+4, B;
MOV LED8+5, #DIS_;
MOV A, second
MOV B, #10
DIV AB
MOV LED8+6, A;
MOV LED8+7, B;
POP B ;B出栈
RET
/********************** RTC演示函数 ************************/
;//========================================================================
;// 函数: F_RTC
;// 描述: RTC演示子程序。
;// 参数: none.
;// 返回: none.
;// 版本: VER1.0
;// 日期: 2013-4-1
;// 备注: 除了ACCC和PSW外, 所用到的通用寄存器都入栈
;//========================================================================
F_RTC:
INC second ; second + 1
MOV A, second
CLR C
SUBB A,#60
JC L_QuitRTC ; second >= 60?
MOV second, #0;
INC minute ; minute + 1
MOV A, minute
CLR C
SUBB A,#60
JC L_QuitRTC ; minute >= 60?
MOV minute, #0
INC hour ; hour + 1
MOV A, hour
CLR C
SUBB A,#24
JC L_QuitRTC ; hour >= 24?
MOV hour, #0
L_QuitRTC:
RET
ENDIF
;******************** 主程序 **************************/
F_Main:
MOV SP, #STACK_POIRTER
MOV PSW, #0 ;选择第0组R0~R7
MOV display_index, #0
MOV R0, #LED8
MOV R2, #8
L_ClearLoop:
MOV @R0, #DIS_BLACK ;上电消隐
INC R0
DJNZ R2, L_ClearLoop
CLR TR0
ORL AUXR, #(1 SHL 7) ; Timer0_1T();
ANL TMOD, #NOT 04H ; Timer0_AsTimer();
ANL TMOD, #NOT 03H ; Timer0_16bitAutoReload();
MOV TH0, #Timer0_Reload / 256 ;Timer0_Load(Timer0_Reload);
MOV TL0, #Timer0_Reload MOD 256
SETB ET0 ; Timer0_InterruptEnable();
SETB TR0 ; Timer0_Run();
SETB EA ; 打开总中断
MOV hour, #12 ; 初始化时间值
MOV minute, #0
MOV second, #0
IF (RTC_ENABLE == 1)
LCALL F_DisplayRTC
ENDIF
L_Main_Loop:
JNB B_1ms, L_Main_Loop ;1ms未到
CLR B_1ms
; MOV A, msecond_L ;msecond + 1
; ADD A, #1
; MOV msecond_L, A
; MOV A, msecond_H
; ADDC A, #0
; MOV msecond_H, A
INC msecond_L ;msecond + 1
MOV A, msecond_L
JNZ $+4
INC msecond_H
MOV A, msecond_L ;msecond - 1000
CLR C
SUBB A, #LOW 1000
MOV A, msecond_H
SUBB A, #HIGH 1000
JC L_Main_Loop ;if(msecond < 1000), jmp
MOV msecond_L, #0 ;if(msecond >= 1000)
MOV msecond_H, #0
IF (RTC_ENABLE == 1)
LCALL F_RTC
LCALL F_DisplayRTC
ELSE
MOV R0, #LED8
MOV R2, #8
L_LoadLoop:
MOV @R0, second
INC R0
DJNZ R2, L_LoadLoop
INC second ;8个数码管循环显示0,1,2...,A,B..F.
ANL second, #0FH
ENDIF
LJMP L_Main_Loop
;**********************************************/
; *********************** 显示相关程序 ****************************************
T_Display: ;标准字库
; 0 1 2 3 4 5 6 7 8 9 A B C D E F
DB 03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,06FH,077H,07CH,039H,05EH,079H,071H
; black - H J K L N o P U t G Q r M y
DB 000H,040H,076H,01EH,070H,038H,037H,05CH,073H,03EH,078H,03dH,067H,050H,037H,06EH
; 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
DB 0BFH,086H,0DBH,0CFH,0E6H,0EDH,0FDH,087H,0FFH,0EFH,046H
T_COM:
DB 001H,002H,004H,008H,010H,020H,040H,080H ; 位码
;//========================================================================
;// 函数: F_Send_595
;// 描述: 向HC595发送一个字节子程序。
;// 参数: ACC: 要发送的字节数据.
;// 返回: none.
;// 版本: VER1.0
;// 日期: 2013-4-1
;// 备注: 除了ACCC和PSW外, 所用到的通用寄存器都入栈
;//========================================================================
F_Send_595:
PUSH 02H ;R2入栈
MOV R2, #8
L_Send_595_Loop:
RLC A
MOV P_HC595_SER,C
SETB P_HC595_SRCLK
CLR P_HC595_SRCLK
DJNZ R2, L_Send_595_Loop
POP 02H ;R2出栈
RET
;//========================================================================
;// 函数: F_DisplayScan
;// 描述: 显示扫描子程序。
;// 参数: none.
;// 返回: none.
;// 版本: VER1.0
;// 日期: 2013-4-1
;// 备注: 除了ACCC和PSW外, 所用到的通用寄存器都入栈
;//========================================================================
F_DisplayScan:
PUSH DPH ;DPH入栈
PUSH DPL ;DPL入栈
PUSH 00H ;R0 入栈
MOV DPTR, #T_COM
MOV A, display_index
MOVC A, @A+DPTR
XRL A, #NOT LED_TYPE
LCALL F_Send_595 ;输出位码
MOV DPTR, #T_Display
MOV A, display_index
ADD A, #LED8
MOV R0, A
MOV A, @R0
MOVC A, @A+DPTR
XRL A, #LED_TYPE
LCALL F_Send_595 ;输出段码
SETB P_HC595_RCLK
CLR P_HC595_RCLK ; 锁存输出数据
INC display_index
MOV A, display_index
ANL A, #0F8H ; if(display_index >= 8)
JZ L_QuitDisplayScan
MOV display_index, #0; ;8位结束回0
L_QuitDisplayScan:
POP 00H ;R0 出栈
POP DPL ;DPL出栈
POP DPH ;DPH出栈
RET
;*******************************************************************
;**************** 中断函数 ***************************************************
F_Timer0_Interrupt: ;Timer0 1ms中断函数
PUSH PSW ;PSW入栈
PUSH ACC ;ACC入栈
LCALL F_DisplayScan ; 1ms扫描显示一位
SETB B_1ms ; 1ms标志
POP ACC ;ACC出栈
POP PSW ;PSW出栈
RETI
F_Timer1_Interrupt:
RETI
F_Timer2_Interrupt:
RETI
F_INT0_Interrupt:
RETI
F_INT1_Interrupt:
RETI
F_INT2_Interrupt:
RETI
F_INT3_Interrupt:
RETI
F_INT4_Interrupt:
RETI
F_UART1_Interrupt:
RETI
F_UART2_Interrupt:
RETI
F_ADC_Interrupt:
RETI
F_LVD_Interrupt:
RETI
F_PCA_Interrupt:
RETI
F_SPI_Interrupt:
RETI
END
2014-08-16
展开全部
rt在哪呢?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询