STM32F103C8T6 I/O口驱动4位共阳数码管
看了网上很多的资料。很少有单独讲解STM32 I/O口直接驱动数码管的资料,有的网上还禁用了JTAG和SWD口,对很多刚入门的学者会造成不必要的麻烦。本内容注意讲解I/O口驱动数码管。
话不多说,附上原理图,PA0-PA7接数码管段码;
PB0,PB1,PB2,PB5接数码管的位码。

#include “led.h”
#include “SysTick.h”

u16 seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
//u16 seg[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴
u8 DisPlayData[4];
extern u16 tim4Cnt;
u8 g=0,s=0,num=0;
#///*******************************************************************************
//* 函 数 名 : LED_Init
//* 函数功能 : LED初始化函数
//* 输 入 : 无
//* 输 出 : 无
//******************************************************************************/
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启复用引脚时钟,123
// //设置数码管位选GPIO
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(GPIOB,&GPIO_InitStructure); /
初始化GPIOB /
GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5|GPIO_Pin_2);
//
// //设置数码管段选GPIO
//
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(GPIOA,&GPIO_InitStructure); /
初始化GPIOA */
GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8);

}
#///*******************************************************************************
//* 函 数 名 : void display0(u8 i)
//* 函数功能 : 数码管段选显示
//* 输 入 : 无
//* 输 出 : 无
///
void display0(u8 i)
{
switch(i)
{
case 0: //显示0
GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
// GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);
break;
case 1: //显示1
GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
// GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2);
break;
case 2: //显示2
GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
// GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_6);
break;
case 3: //显示3
GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
// GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_6);
break;
case 4: //显示4
GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
// GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_5|GPIO_Pin_6);
break;
case 5: //显示5
GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
// GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_6);
break;
case 6: //显示6
GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
// GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
break;
case 7: //显示7
GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
// GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);
break;
case 8: //显示8
GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
// GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
break;
case 9: //显示9
GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
// GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_6);
break;
}
}
#///

//* 函 数 名 : SegDis9
//* 函数功能 : 数码管位选显示
//* 输 入 : 无
//* 输 出 : 无
//*******************************************************************************/
​​​​void SegDis9(void)
{

//   数码管CA1
GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET);      //
GPIO_WriteBit(GPIOB,GPIO_Pin_1,Bit_SET);        //
GPIO_WriteBit(GPIOB,GPIO_Pin_2,Bit_SET);        //
GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_SET);    //
GPIO_Write(GPIOA, seg[tim4Cnt/1000]);                               //  可以实现多位写入
delay_ms(5);
//  数码管CA2
GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET);        //
GPIO_WriteBit(GPIOB,GPIO_Pin_1,Bit_RESET);      //
GPIO_WriteBit(GPIOB,GPIO_Pin_2,Bit_SET);        //
GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_SET);    //
GPIO_Write(GPIOA, seg[tim4Cnt/100%10]);                             //  可以实现多位写入
delay_ms(5);
//  数码管CA3
GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET);        //
GPIO_WriteBit(GPIOB,GPIO_Pin_1,Bit_SET);        //
GPIO_WriteBit(GPIOB,GPIO_Pin_2,Bit_RESET);      //
GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_SET);    //
GPIO_Write(GPIOA, seg[tim4Cnt/10%10]);                              //  可以实现多位写入
delay_ms(5);
//  数码管CA4
GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET);        //
GPIO_WriteBit(GPIOB,GPIO_Pin_1,Bit_SET);        //
GPIO_WriteBit(GPIOB,GPIO_Pin_2,Bit_SET);        //
GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_RESET);  //
GPIO_Write(GPIOA, seg[tim4Cnt%10]);                             //  可以实现多位写入
delay_ms(5);

}

///*******************************************************************************
//* 函 数 名 : Timer4_Init
//* 函数功能 : 定时函数
//* 输 入 : 无
//* 输 出 : 无
//*******************************************************************************/

void Timer4_Init(u16 arr,u16 pse)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);TIM_TimeBaseInitStruct.TIM_Period =  arr;    //自动重装载值
TIM_TimeBaseInitStruct.TIM_Prescaler =  pse;       //
TIM_TimeBaseInitStruct.TIM_CounterMode =  TIM_CounterMode_Up;  //上升沿触发
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct);

// 通用中断函数的优先级
NVIC_InitStruct.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority =2;
NVIC_Init(&NVIC_InitStruct);

TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM4,ENABLE);

}
///*******************************************************************************
//* 函 数 名 : TIM4_IRQHandler
//* 函数功能 : 中断函数
//* 输 入 : 无
//* 输 出 : 无
//*******************************************************************************/
void TIM4_IRQHandler(void )
{

if(TIM_GetITStatus(TIM4, TIM_IT_Update) == 1)      //  标志计数溢出中断产生
{tim4Cnt++;           //  秒统计if(tim4Cnt>5555)      //  99:99           99*100+99{tim4Cnt = 0;}
}
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);

}
#///*******************************************************************************
//* 函 数 名 : 头文件:led.h
//* 函数功能 : 头文件
//* 输 入 : 无
//* 输 出 : 无
//*******************************************************************************/
#ifndef _led_H
#define _led_H

#include “system.h”

/* LED时钟端口、引脚定义 */

void LED_Init(void);
void Seg_Init(void);
void TIM4_IRQHandler(void );
void display0(u8 i);
void DisPlayNum(int n);
void Timer4_Init(u16 arr,u16 pse);
void SegDis9(void);

#endif

/*******************************************************************************

  • 函 数 名 : main

  • 函数功能 : 主函数

  • 输 入 : 无

  • 输 出 : 无
    *******************************************************************************/
    #include “system.h”
    #include “SysTick.h”
    #include “led.h”
    #include “stm32f10x.h”
    //#define tim4Cnt 2222;
    u16 tim4Cnt=5000;
    int main()
    {

    SysTick_Init(72);
    Timer4_Init(9999,799);
    LED_Init();
    TIM_Cmd(TIM4,ENABLE);

    while(1)
    {
    SegDis9();

    }

}

由于时第一次在这里发表文章,不太了解其他的各个方面,压缩包也不会上传,稍微学过的应该看得懂,51黑

STM32F103C8T6 I/O口驱动4位共阳数码管相关推荐

  1. 四位共阳极数码管显示函数_74LS164驱动4位共阳数码管代码

    #include "reg52.h" #define u16 unsigned int #define u8 unsigned char sbit CLK=P2^0; sbit D ...

  2. arduino用2个74HC595点亮2个4位共阳数码管

    arduino用2个74HC595点亮2个4位共阳数码管 原文:https://www.geek-workshop.com/forum.php?mod=viewthread&tid=7415 ...

  3. c语言一位共阳数码管编程,求一个共阳四位数码管滚动显示1234的程序

    /******************************************************************************* * 文件名: 数码管 * 描  述: ...

  4. stm32用库函数控制一位共阳数码管以及共阴数码管

    一.数码管原理: 见上图,上图是一个数码管的内部示意图,它们的发光原理和普通发光二极管是一样的,所以可将数码管的亮段当成几个发光二极管.根据内部发光二极管的共连接端不同,可以分为共阳极接法和共阴极接法 ...

  5. STM32 控制4位共阳数码管输出计数

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/yoie01/article/detai ...

  6. 奥松机器人PHP,Arduino四位七段数码管 LED数码管 4位共阳数码管 显示屏模块

    产品介绍: 四位七段数码管是由一个12管脚的4位7段共阳极数码管和一个控制芯片TM1637构成,模块采用沉金工艺,外观更加美观:采用防插反接口,操作更加安全:插口一边有大写字母I表示该模块采用IIC协 ...

  7. 74LS164驱动一位共阴数码管(stm32f1)

    74LS164功能:串行输入并行输出,说人话就是:假设你有8个苹果(分别代表数码管的a,b,c,d,e,f,g,dp),你把他们一个一个的包装好放进纸箱里(数据一个一个写入,串行),然后把纸箱打包发给 ...

  8. 共阳数码管段码表_正点原子开拓者FPGA开发板资料连载第十一章 静态数码管显示实验...

    1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...

  9. Arduino 驱动TM1638显示十位的共阳数码管

    Arduino 驱动TM1638显示十位的共阳数码管 二话不说先上图: 这个是电路图,下面我在上传TM1638的手册 哈哈太乱了先凑合着看吧!效果是实现了,画了板还没有发过来. 我也不多说什么了上代码 ...

最新文章

  1. 将JavaScript字符串全部转换为小写吗?
  2. Sublime Text(2/3)编译lua
  3. Excel公式扫盲——SUMPRODUCT 函数
  4. 开源客户关系管理系统vTigerCRM 5.2正式版发布
  5. 【线段树】Serious Business(CF1648D)
  6. python变量名必须以什么开头_python变量为什么不能以数字开头
  7. 中秋佳节--理解Enum枚举
  8. 2017级C语言大作业 - 气球塔防
  9. linux 内核编译速度,内核编译之后的运行速度
  10. 软件测试总结——常见的面试问题(一)
  11. 比Everything、listary、DocFetcher还好用的桌面文档搜索软件 - bbdoc
  12. 提高 Mac OS X 速度的 52 个方法
  13. H264(AVC)/H265(HEVC)/H266(VVC):块划分的区别
  14. abb机器人编程指令写字_ABB机器人-编程基本指令之运动指令
  15. 新大陆云平台的.jar .sdk打包
  16. IRP、IO_STACK_LOCATION、文件三种读写方式(buffer/driect/other)、DeviceIoControl
  17. 1微秒等于多少皮秒_秒的换算:皮秒、纳秒、微秒、毫秒
  18. 存储之磁盘阵列RAID
  19. 补码转原数值公式(非常简单实用的公式)
  20. 使用 istringtream 注意其状态

热门文章

  1. 路由器linux+开机启动,路由器里设置FRP开机启动教程
  2. 人机智能交互技术教学进度表(2017-2018-1)含测试 机器人方向本科限选课程
  3. cad隐藏图层命令快捷键_Auto CAD如何快速隐藏图层,快捷键是什么?
  4. Web3:我们创造更好互联网的机会
  5. 银河麒麟服务器操作系统V10SP1-x86_64-build20/20210518安装dzzoffice,php缺少zip_open函数问题解决
  6. python高德地图可视化_【可视化】python地图可视化_Folium
  7. 我是如何从电脑小白走上编程之路
  8. Java实现输出特殊偏旁的汉字的功能
  9. Python程序员必备的四款开发工具
  10. 一次完整的HTPPS请求