logo资料库

STM8汇编经典实例源码2.pdf

第1页 / 共76页
第2页 / 共76页
第3页 / 共76页
第4页 / 共76页
第5页 / 共76页
第6页 / 共76页
第7页 / 共76页
第8页 / 共76页
资料共76页,剩余部分请下载后查看
============================延时的 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
分享到:
收藏