STM32F103C8T6 I/O口驱动4位共阳数码管
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位共阳数码管相关推荐
- 四位共阳极数码管显示函数_74LS164驱动4位共阳数码管代码
#include "reg52.h" #define u16 unsigned int #define u8 unsigned char sbit CLK=P2^0; sbit D ...
- arduino用2个74HC595点亮2个4位共阳数码管
arduino用2个74HC595点亮2个4位共阳数码管 原文:https://www.geek-workshop.com/forum.php?mod=viewthread&tid=7415 ...
- c语言一位共阳数码管编程,求一个共阳四位数码管滚动显示1234的程序
/******************************************************************************* * 文件名: 数码管 * 描 述: ...
- stm32用库函数控制一位共阳数码管以及共阴数码管
一.数码管原理: 见上图,上图是一个数码管的内部示意图,它们的发光原理和普通发光二极管是一样的,所以可将数码管的亮段当成几个发光二极管.根据内部发光二极管的共连接端不同,可以分为共阳极接法和共阴极接法 ...
- STM32 控制4位共阳数码管输出计数
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/yoie01/article/detai ...
- 奥松机器人PHP,Arduino四位七段数码管 LED数码管 4位共阳数码管 显示屏模块
产品介绍: 四位七段数码管是由一个12管脚的4位7段共阳极数码管和一个控制芯片TM1637构成,模块采用沉金工艺,外观更加美观:采用防插反接口,操作更加安全:插口一边有大写字母I表示该模块采用IIC协 ...
- 74LS164驱动一位共阴数码管(stm32f1)
74LS164功能:串行输入并行输出,说人话就是:假设你有8个苹果(分别代表数码管的a,b,c,d,e,f,g,dp),你把他们一个一个的包装好放进纸箱里(数据一个一个写入,串行),然后把纸箱打包发给 ...
- 共阳数码管段码表_正点原子开拓者FPGA开发板资料连载第十一章 静态数码管显示实验...
1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...
- Arduino 驱动TM1638显示十位的共阳数码管
Arduino 驱动TM1638显示十位的共阳数码管 二话不说先上图: 这个是电路图,下面我在上传TM1638的手册 哈哈太乱了先凑合着看吧!效果是实现了,画了板还没有发过来. 我也不多说什么了上代码 ...
最新文章
- 将JavaScript字符串全部转换为小写吗?
- Sublime Text(2/3)编译lua
- Excel公式扫盲——SUMPRODUCT 函数
- 开源客户关系管理系统vTigerCRM 5.2正式版发布
- 【线段树】Serious Business(CF1648D)
- python变量名必须以什么开头_python变量为什么不能以数字开头
- 中秋佳节--理解Enum枚举
- 2017级C语言大作业 - 气球塔防
- linux 内核编译速度,内核编译之后的运行速度
- 软件测试总结——常见的面试问题(一)
- 比Everything、listary、DocFetcher还好用的桌面文档搜索软件 - bbdoc
- 提高 Mac OS X 速度的 52 个方法
- H264(AVC)/H265(HEVC)/H266(VVC):块划分的区别
- abb机器人编程指令写字_ABB机器人-编程基本指令之运动指令
- 新大陆云平台的.jar .sdk打包
- IRP、IO_STACK_LOCATION、文件三种读写方式(buffer/driect/other)、DeviceIoControl
- 1微秒等于多少皮秒_秒的换算:皮秒、纳秒、微秒、毫秒
- 存储之磁盘阵列RAID
- 补码转原数值公式(非常简单实用的公式)
- 使用 istringtream 注意其状态
热门文章
- 路由器linux+开机启动,路由器里设置FRP开机启动教程
- 人机智能交互技术教学进度表(2017-2018-1)含测试 机器人方向本科限选课程
- cad隐藏图层命令快捷键_Auto CAD如何快速隐藏图层,快捷键是什么?
- Web3:我们创造更好互联网的机会
- 银河麒麟服务器操作系统V10SP1-x86_64-build20/20210518安装dzzoffice,php缺少zip_open函数问题解决
- python高德地图可视化_【可视化】python地图可视化_Folium
- 我是如何从电脑小白走上编程之路
- Java实现输出特殊偏旁的汉字的功能
- Python程序员必备的四款开发工具
- 一次完整的HTPPS请求