STM32控制数码管从0显示到99

首先 先画电路图吧!打开proteus,导入相关器件,绘制电路图。如下:(记得要保存啊!发现模拟一遍程序就自动退出了,有bug,我是解决不了,所以就是要及时保存,自己重画几次就长记性了,我是不想重画了,所以我及时保存了。)

第二步打开CubeMX,新建工程,配置时钟和GPIO,如下:

第三步先来了解一下数码管的十六进制码的来源,我自己画了个图,我看着挺明白的,不明白的自己想,想明白了画出来就明白了,其实很简单的,就是给电就亮,断电就灭而已。废话不说了,看图:

最后得出共阳极的断码为:{0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}

接下来就是修改keil工程中的main文件中的内容了,其实主要就那么点东西,只不过放在了不同的地方而已:

void duanxuan(uint8_t num);  //声明断选函数,传入每个数字的码值

void led_clear(void);    //  清屏函数, 主要将所有的数码管都关闭。

uint8_t duan[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};  //断码数组
uint8_t num= 0;         // 定义变量num

for(num=0; num<100; num++)    //  for循环  num的值从0到99
      {
          led_clear();             //  清屏
          GPIOB->ODR = 0x0002;     //  GPIOB的值为0x0002     0000 0000 0000 0010  也就是PB1为高电平
          duanxuan(duan[num%10]);  //  断选的值为  数组断中的  num模10 也就是个位的数字
          HAL_Delay(2);            //  延时2ms
          
          led_clear();             // 清屏
          GPIOB->ODR = 0x0004;     //  GPIOB的值为0x0004     0000 0000 0000 0100  也就是PB2为高电平   
          duanxuan(duan[num/10]);  //  断选的值为  数组断中的  num除10 也就是十位的数字 
          HAL_Delay(8);            //  延时8ms   控制数码管中的数字增加的快慢?
      }

void duanxuan(uint8_t num)   //断码显示函数
{
    GPIOA->ODR = num;   // A端口要显示几就传入几的断码
}

void led_clear(void)   // 清屏函数
{
    GPIOA->ODR = 0x00FF;  //  清屏函数 A端口的值:都是1,就是都不亮
}

好了,所有需要添加的代码都在这里了,只需要按位置填进去编译就行了,不按位置,填对了也可以,就是下次CubeMX有改动重新生成时自己写的代码是否还存在,需不需要重新写,估计都不想重新写的,那就按照样式固定写代码的位置吧!

好的,我可以为您提供一些简单的代码示例,用于在STM32控制器上驱动数码管显示0到9。 首先,您需要连接数码管STM32控制器的GPIO引脚上,并根据具体的数码管型号确定引脚的连接方式,例如共阳数码管需要将引脚连接到高电平,共阴数码管需要将引脚连接到低电平。 然后,您可以使用以下代码来实现数码管显示0到9的功能: ```c #include "stm32f10x.h" #define LED0 GPIO_Pin_0 #define LED1 GPIO_Pin_1 #define LED2 GPIO_Pin_2 #define LED3 GPIO_Pin_3 #define LED4 GPIO_Pin_4 #define LED5 GPIO_Pin_5 #define LED6 GPIO_Pin_6 #define LED7 GPIO_Pin_7 void Delay(__IO uint32_t nCount); int main(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = LED0 | LED1 | LED2 | LED3 | LED4 | LED5 | LED6 | LED7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); while (1) { GPIO_Write(GPIOB, 0x3F); // 显示数字0 Delay(500000); GPIO_Write(GPIOB, 0x06); // 显示数字1 Delay(500000); GPIO_Write(GPIOB, 0x5B); // 显示数字2 Delay(500000); GPIO_Write(GPIOB, 0x4F); // 显示数字3 Delay(500000); GPIO_Write(GPIOB, 0x66); // 显示数字4 Delay(500000); GPIO_Write(GPIOB, 0x6D); // 显示数字5 Delay(500000); GPIO_Write(GPIOB, 0x7D); // 显示数字6 Delay(500000); GPIO_Write(GPIOB, 0x07); // 显示数字7 Delay(500000); GPIO_Write(GPIOB, 0x7F); // 显示数字8 Delay(500000); GPIO_Write(GPIOB, 0x6F); // 显示数字9 Delay(500000); } } void Delay(__IO uint32_t nCount) { for (; nCount != 0; nCount--); } ``` 在这个示例代码中,我们使用了GPIOB引脚来控制数码管显示,通过设置相应的GPIO引脚输出高电平或低电平,来控制数码管显示相应的数字。其中,Delay函数用于延时一段时间,以便我们可以看到数码管显示的数字。 请注意,此代码仅供参考,具体的实现方式可能会因为不同的数码管型号而有所不同。如有疑问,请参考相关的数码管数据手册或咨询专业人士。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尚久龙

你的鼓励是我最大的动力!谢谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值