STM8 单片机例程:有谁有一个LED一亮一灭的例程呢?是SMT8S的,最好带说明

STM8 单片机例程:有谁有一个LED一亮一灭的例程呢?是SMT8S的,最好带说明,第1张

stm8的timer2利用溢出中断,实现1s,LED闪烁一次

#include <iostm8s207s8.h>

#include <intrinsics.h>

typedef unsigned char U8

typedef unsigned int U16

typedef unsigned long U32

U16 cnt=0

//----------------------------initial gpio

void GPIO_init(void)

{

PE_DDR=0X07

PE_CR1=0X07

PE_CR2=0X00

}

//--------------------------clk initial

void CLK_init(void)

{

CLK_ECKR |=0X1 //开启外部时钟

while(!(CLK_ECKR&0X2)) //等待外部时钟rdy

CLK_CKDIVR &= 0XF9 //CPU 2分频

CLK_SWR = 0XB4 //选择外部时钟

while(!(CLK_SWCR&0X8)) //这里要等

CLK_SWCR |=0X2 //使能外部时钟

}

//-----------------------------TIMER2 init

void TIM2_init()

{

TIM2_PSCR |=0X04 //DIV16 1.333333US -> 外部晶振12mhz

TIM2_IER |= 0X01 //UIE允许中断

TIM2_ARRH = 0X1d

TIM2_ARRL = 0X4c

// TIM2_EGR |=0X01//UG使能

TIM2_CR1 |= 0X85 //APPE,URS,CEN使能

}

//----------------------------------------FUNCTION

//-------------------initial device

void DEVICE_init(void)

{

CLK_init()

GPIO_init()

TIM2_init()

}

void delay_nms(unsigned int n)

{

unsigned int i

for(n>0n--)

{

for(i=0i<8000i++)

}

}

//-----------------------------------interrupt

//#define TIM2_OVR_UIF_vector 0x0F 定时2溢出中断 10ms溢出中断

#pragma vector = TIM2_OVR_UIF_vector

__interrupt void TIM2_OVR_Hander(void)

{

TIM2_SR1 &=~0x01//清标志

cnt++

}

//-------------------main

void main(void)

{

__disable_interrupt()

DEVICE_init()

__enable_interrupt()

while(1)

{

if(cnt==100)

{

cnt=0

PE_ODR^=0X01

}

}

}

简单的啊。思路:8个LED接在一个口,如P1口。再将另外两个LED接在另外某个口(如P2)的两个引脚。然后将两个按键分别接在空闲的口的两个引脚。

按下一个按键,使8个LED的输出状态变化,0xFE循环移位实现,LED低电平亮。另外的按键按下,两个LED状态翻转。

虽然是两年前的帖子,我还是回复下。

release和debug运行结果不同,一般是优化的问题。如果写程序的时候没有考虑优化问题,那就把所有的优化去试试。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11240210.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存