用STM32F1写一个三位一体数码管的计数器函数
时间: 2024-06-10 16:05:24 浏览: 79
好的,我了解了你的要求,以下是一个基本的STM32F1三位一体数码管计数器的代码示例:
```c
#include "stm32f10x.h"
#include "delay.h" // 使用延时函数需要引入头文件
#define LED_DIO GPIO_Pin_2
#define LED_SCLK GPIO_Pin_1
#define bit(data,loc,val) {(data)=((data)&(~(1<<(loc))))|((val)<<(loc));} // 定义按位写函数
void LED_WrByte(uint8_t dat) // 写入一个字节数据
{
uint8_t i;
for(i=0;i<8;i++) // 发送8位数据
{
if(dat&0x80) GPIO_SetBits(GPIOA, LED_DIO); // 发送数据位
else GPIO_ResetBits(GPIOA, LED_DIO);
GPIO_SetBits(GPIOA, LED_SCLK); // 发送上升沿
dat <<= 1; // 准备下一位数据
GPIO_ResetBits(GPIOA, LED_SCLK); // 发送下降沿
}
}
void LED_WrDigi(uint8_t BitAddr,uint8_t DigiData) // 分别写入数码管位置及需要显示的数码
{
LED_WrByte(BitAddr|0xc0); // 写入位置命令字
LED_WrByte(DigiData); // 写入数码数据
}
void LED_Init() // 数码管初始化函数
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = LED_DIO | LED_SCLK;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void LED_ShowNum(uint16_t num) // 数码管显示数字函数
{
uint8_t ge, shi, bai; // 分别获取个位、十位和百位数字
ge = num % 10;
shi = num / 10 % 10;
bai = num / 100 % 10;
LED_WrDigi(7, ge); // 位置7显示个位数码
LED_WrDigi(6, shi); // 位置6显示十位数码
LED_WrDigi(5, bai); // 位置5显示百位数码
}
int main(void) // 主函数
{
delay_init(); // 初始化延时函数
LED_Init(); // 初始化数码管
uint16_t count = 0; // 设定初始化值为0
while (1)
{
LED_ShowNum(count); // 显示当前计数器的值
delay_ms(500); // 延时500ms
count++; // 计数器加1
}
}
```
这是一个基本的示例代码,你可以根据你的具体需求进行修改和优化。
阅读全文