============================延时的 Delay_ms.asm=====================
stm8/
#include "mapping.inc"
#include "stm8s105s6.inc"
#include "D:\STM8 程序\我的 STM8 程序\GPIO\User_register.inc"
#include "D:\STM8 程序\我的 STM8 程序\GPIO\define.inc"
segment 'rom'
;*************延时程序**************
;CPU 频率:2MHz
;要用到的寄存器:X,Y
;把要延时的值写入 R0E.R0F,R0E 为高位值.R0F 为低位值
;1ms
;延时 1S
Delay_ms.L
PUSHW X
PUSHW Y
PUSH CC
LDW X,#500
LDW Y,R0E
Delay_next1:
LDW X,#500
Delay_next:
DECW X
JRNE Delay_next
DECW Y
JRNE Delay_next1
POP CC
POPW Y
POPW X
RETF
RETF
RETF
end
=============================mai.asm==============================
stm8/
#include "mapping.inc"
#include "stm8s105s6.inc"
#include "D:\STM8 程序\我的 STM8 程序\GPIO\User_register.inc"
#include "D:\STM8 程序\我的 STM8 程序\GPIO\define.inc"
segment 'rom'
main.l
; initialize SP
ldw X,#stack_end
ldw SP,X
#ifdef RAM0
; clear RAM0
ldw X,#ram0_start
clear_ram0.l
clr (X)
incw X
cpw X,#ram0_end
jrule clear_ram0
#endif
#ifdef RAM1
; clear RAM1
ram0_start.b EQU $ram0_segment_start
ram0_end.b EQU $ram0_segment_end
; 更换成外部时钟,并且 CPU8 分频
BSET CLK_SWCR,#1
;允许更换时钟
;主函数开始
ram1_start.w EQU $ram1_segment_start
ram1_end.w EQU $ram1_segment_end
ldw X,#ram1_start
clear_ram1.l
clr (X)
incw X
cpw X,#ram1_end
jrule clear_ram1
#endif
ldw X,#stack_start
clear_stack.l
clr (X)
incw X
cpw X,#stack_end
jrule clear_stack
intel
; clear stack
stack_start.w EQU $stack_segment_start
stack_end.w EQU $stack_segment_end
BRES CLK_SWCR,#2
;SWIEN 位为 0,用查询方式确定时钟更换是否完
成
MOV CLK_SWR,#0B4H
;目标时钟为 HSE 晶振
CLK_SW_WAIT1:
;等待时钟更换中断标志 SWIF 有效
BTJF CLK_SWCR,#3,CLK_SW_WAIT1
BRES CLK_SWCR,#3
BRES CLK_SWCR,#1
BRES CLK_ICKR,#0
;清除时钟更换完成任务中断标志 SWIF
;SWEN 位为 0,禁止时钟再次更换
;关闭 HSI 时钟,减少功耗
MOV CLK_CKDIVR,#1bH
外部时钟,前 8 分频没用
BSET CLK_CSSR,#0
;内部时钟 8 分频,CPU 时钟 128 分频,现在使用
;CSS 时钟安全系统开
;I/O 口初始化
BSET PD_DDR_DDR0
BSET PE_DDR_DDR5
BSET PC_DDR_DDR2
BSET PC_DDR_DDR4
BSET PE_CR1_C5
BSET PC_CR1_C2
BSET PC_CR1_C4
BSET PD_CR1_C0
BSET PE_CR2_C5
BSET PC_CR2_C2
BSET PC_CR2_C4
BSET PD_CR2_C0
;数码管要显示的数字
MOV R0D,#9
MOV R0C,#8
MOV R0B,#6
MOV R0A,#7
;PD_0 设置成输出
;PE_5 设置成输出,595 的 SDATA 脚
;PC_2 设置成输出,595 的 SCLK 脚
;PC_4 设置成输出,595 的 SRCK 脚
;设置成推换
;设置成推换
;设置成推换
;PD_0 设置成推换
;PE_5 设置成高速
;PC_2 设置成高速
;PC_4 设置成高速
;PD_0 设置成高速
;R0A 为高位
CALLF Display_595
;调用 595 显示
;R0E 和 R0F 两单元合起来对应十进制的 2000
LOOP1:
MOV R0E,#02H
MOV R0F,#0FFH
BSET PD_ODR_ODR0
CALLF Delay_ms
BRES PD_ODR_ODR0
CALLF Delay_ms
CALLF AD_8BIT
CALLF BCD_8bit
;调用延时
;调用延时
;调用 AD 转换
;调用数据转换
CALLF Display_595
JP LOOP1
;调用 595 显示
;*******************8 位 二 进 制 的 数 值 转 化 为 BCD 码
***************************
;把 8 位二进制的数值转化为 BCD 码
;要转换的数值放在 R09 中
;转换结果的高位在 R0A,中位在 R0B,低位在 R0C
BCD_8bit.L
PUSH A
PUSH R01
LD A,R09
LD XL,A
LD A,#100
DIV X,A
LD R01,A
LD A,XL
LD R0A,A
LD A,R01
LD XL,A
LD A,#10
DIV X,A
LD R0C,A
LD A,XL
LD R0B,A
POP R01
POP A
RETF
RETF
RETF
;********************************************************************
*******
;*************延时程序**************
;CPU 频率:2MHz
;要用到的寄存器:X,Y
;把要延时的值写入 R0E.R0F,R0E 为高位值.R0F 为低位值
;1ms
Delay_ms.L
PUSHW X
;延时 1S
PUSHW Y
PUSH CC
LDW X,#500
LDW Y,R0E
Delay_next1:
LDW X,#500
Delay_next:
DECW X
JRNE Delay_next
DECW Y
JRNE Delay_next1
POP CC
POPW Y
POPW X
RETF
RETF
RETF
;****************************************
;595 串行数码管显示_4 位
;四位的值分别装在 R0A,R0B,R0C,R0D 单元中,高位在前
;要用到 A,X 寄存?
;过程用到的寄存器:R0F
Display_595.L
PUSH A
PUSH CC
PUSH R0F
PUSHW X
CLRW X
LD A,R0D
LD XL,A
LD A,(TABLE_LED,X)
MOV R0F,#8
Display_loop1:
BSET PC_ODR_ODR2
RLC A
BCCM PE_ODR_ODR5
NOP
BRES PC_ODR_ODR2
DEC R0F
JRNE Display_loop1
;送完一个数据
CLRW X
LD A,R0C
LD XL,A
LD A,(TABLE_LED,X)
MOV R0F,#8
Display_loop2:
BSET PC_ODR_ODR2
RLC A
BCCM PE_ODR_ODR5
NOP
BRES PC_ODR_ODR2
DEC R0F
JRNE Display_loop2
CLRW X
LD A,R0B
LD XL,A
LD A,(TABLE_LED,X)
MOV R0F,#8
Display_loop3:
BSET PC_ODR_ODR2
RLC A
BCCM PE_ODR_ODR5
NOP
BRES PC_ODR_ODR2
DEC R0F
JRNE Display_loop3
CLRW X
LD A,R0A
LD XL,A
LD A,(TABLE_LED,X)
MOV R0F,#8
Display_loop4:
BSET PC_ODR_ODR2
RLC A
BCCM PE_ODR_ODR5
NOP
BRES PC_ODR_ODR2
DEC R0F
JRNE Display_loop4
;4 个数据送完成
BSET PC_ODR_ODR2
BRES PC_ODR_ODR4
;SDATA
;SCLK
;置高 SRCK
NOP
BSET PC_ODR_ODR4
;输出数据
POPW X
POP R0F
POP CC
POP A
RETF
RETF
RETF
PUSH CC
PUSHW X
;引脚初始化
BRES PB_DDR_DDR7
BRES PB_CR1_C7
BRES PB_CR2_C7
;配置寄存器
MOV ADC_CSR,#07H
MOV ADC_CR2,#00H
MOV ADC_CR3,#00H
MOV ADC_CR1,#71H
;***************************************************************
;AD 转换
;入口参数:对 PB_7 进行转换
;出口参数:转换结果放大 R09
AD_8BIT.L
PUSH A
;输入
;浮空
;禁止外中断
;禁止转换结束中断,通道为 AIN7;
;禁止外部触发,数据高 8 位对好
;禁止数据缓存使能
;转换速度为最慢,单次转换模式,开启 AD 转换电
;开始转换
;清除转换结束标志
;停止 AD 转换
;把数据送到 R09 单元
源
MOV ADC_CR1,#71H
NOP
NOP
NOP
AD_next:
LD A,ADC_CSR
AND A,#80H
JREQ AD_next
MOV ADC_CSR,#07H
MOV ADC_CR1,#70H
MOV R09,ADC_DRH
POPW X
POP CC
POP A
RETF
RETF
RETF
;********************************************************************
;***************************************************************
;595 的显示数表
TABLE_LED:
1
;DP,F,G,E,D,C,B,A
, 2
, 3 , 4 , 5 , 6 , 7 , 8 , 9
;
0 ,
DC.B 0A0H,0F9H,0C4H,0D0H,99H,92H,82H,0F8H,80H,90H
;***************************************************************
interrupt NonHandledInterrupt
NonHandledInterrupt.l
motorola
iret
; reset
segment 'vectit'
dc.l {$82000000+main}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
dc.l {$82000000+NonHandledInterrupt}
; trap
; irq0
; irq1
; irq2
; irq3
; irq4
; irq5
; irq6
; irq7
; irq8
; irq9
; irq10
; irq11
; irq12
; irq13
; irq14
; irq15
; irq16
; irq17
; irq18
; irq19
; irq20