一、主要元器件和原理

GD32F303RCT6 74HC595 共阳数码管 按键(图片数码管名字有误)
风中凌乱的笔记:
A1A2A3A4下拉工作模式。给A1A2A3A4一个低电平。当abcdefg来一个高电平时,数码管亮。
GPIO_CTL0(GPIOB) &= 0x0FFFF000;表示配置PA3,PA4,PA5,PA6脚
GPIO_CTL0(GPIOB) |= 0x03333000;表示PA3,PA4,PA5,PA6的工作模式為推挽輸出0011=0x3(00為推挽輸出,11為50MHz)
局部static,只初始化一次,不再作第二次初始化。
void led_Init(void)
{
INT8U ucFlag = 0;
static INT8U ucNumber = 0;

     ucFlag++;      第一次初始化后,ucFlag = 1,第二次初始化也为1 ucNumber++;  第一次初始化后,ucNumbe = 1,第二次初始化为2,…

………………………
}
Define定义一般放在.h文件,.c可以直接调用.h文件。如果放在.c文件,其他的.c文件不能用。

const INT8U LED_data[]={0x3f,0x06,0x5b,0x4f,0x66, 0x71};数组值固定不变
static
extern const INT8U LED_data[]; 用于外部声明

线路连接:
DG_D1---->PB6
DG_D2---->PB5
DG_D3---->PB4
DG_D4---->PB3
按键原理等后续有空再补充

二、原理图



三、程序

DigiDrv.c

#include "DigiDrv.h"
//数码管段选                       0     1     2    3      4     5     6     7     8     9     A     B     C      D    E     F     G      R     S     W    灭
const INT8U GucDigiDispData[] = {0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90, 0X88, 0X83, 0XC6, 0XA1, 0X86, 0X8E, 0XC2, 0XAF, 0X92, 0X81, 0XFF};
//const INT8U GucDigiDispData[] = {0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X07, 0X7F, 0X6F, 0X77, 0X7C, 0X39, 0X5E, 0X79, 0X71, 0XBF};void DigiDrvInit(void)
{rcu_periph_clock_enable(RCU_AF);rcu_periph_clock_enable(RCU_GPIOB);AFIO_PCF0 &= 0xF8FFFFFF;     //置零AFIO_PCF0 |= (1<<25);       // 置1     禁用JTAG,使能SWD模式 010(关闭JTAG功能,设为普通IO口使用)gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, DIGI_PORT);   // 位控制脚gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_15);gpio_bit_reset(GPIOB, DIGI_PORT);   //      关闭数码管显示 ,复位引脚值
}
//74HC595驱动程序
void DigiDrvWriteData(INT8U ucData)
{INT8U i;                            //时钟线低电平for (i = 0; i < 8; i++)            { if (ucData & 0x80)              //判断数据高低            DIGI_DS_CLR;else DIGI_DS_SET;ucData = (ucData << 1);         //数据左移1位//上升沿输出数据DIGI_SH_CLR;                    DIGI_SH_SET;}DIGI_ST_CLR;  delay_ms(1);DIGI_ST_SET;                        //时钟线高电平}void DigiRoutine(void)
{static INT8U ucNumber = 0;         //静态函数,程序重新进来不被刷新switch (ucNumber){case 0:ucNumber = 1;DigiDrvDisp(GucDigiCnt[0]);     DigiSelect1();                 //显示第一位数码管break;case 1:ucNumber = 2;DigiDrvDisp(GucDigiCnt[1]);DigiSelect2();break;case 2:ucNumber = 3;DigiDrvDisp(GucDigiCnt[2]);                                                                                                                                      DigiSelect3();break;case 3:ucNumber = 0;DigiDrvDisp(GucDigiCnt[3]);DigiSelect4();break;default:ucNumber = 0;break;}
}void DigiSelect1(void)
{DIGI_PORT1_SET;          //驱动第一位数码管,其他数码管拉低(关掉)DIGI_PORT2_CLR;DIGI_PORT3_CLR;DIGI_PORT4_CLR;}void DigiSelect2(void)
{DIGI_PORT1_CLR;DIGI_PORT2_SET;DIGI_PORT3_CLR;DIGI_PORT4_CLR;
}void DigiSelect3(void)
{DIGI_PORT1_CLR;DIGI_PORT2_CLR;DIGI_PORT3_SET;DIGI_PORT4_CLR;
}void DigiSelect4(void)
{DIGI_PORT1_CLR;DIGI_PORT2_CLR;DIGI_PORT3_CLR;DIGI_PORT4_SET;
}
//数码管段码显示
void DigiDrvDisp(INT8U ucNum)
{DigiDrvWriteData(GucDigiDispData[ucNum]);}

DigiDrv.h

#ifndef __DIGIDRV_H
#define __DIGIDRV_H#include "sys.h"/*********************************Define***************************************/
#define DIGI_GPIO_PORT  GPIOB
#define DIGI_PORT       (GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6)#define DIGI_ST_CLR     gpio_bit_reset(DIGI_GPIO_PORT, GPIO_PIN_13)
#define DIGI_SH_CLR     gpio_bit_reset(DIGI_GPIO_PORT, GPIO_PIN_12)
#define DIGI_DS_CLR     gpio_bit_reset(DIGI_GPIO_PORT, GPIO_PIN_15)     #define DIGI_ST_SET     gpio_bit_set(DIGI_GPIO_PORT, GPIO_PIN_13)
#define DIGI_SH_SET     gpio_bit_set(DIGI_GPIO_PORT, GPIO_PIN_12)
#define DIGI_DS_SET     gpio_bit_set(DIGI_GPIO_PORT, GPIO_PIN_15)  #define DIGI_PORT1_CLR  gpio_bit_reset(DIGI_GPIO_PORT, GPIO_PIN_6)
#define DIGI_PORT2_CLR  gpio_bit_reset(DIGI_GPIO_PORT, GPIO_PIN_5)
#define DIGI_PORT3_CLR  gpio_bit_reset(DIGI_GPIO_PORT, GPIO_PIN_4)
#define DIGI_PORT4_CLR  gpio_bit_reset(DIGI_GPIO_PORT, GPIO_PIN_3)#define DIGI_PORT1_SET  gpio_bit_set(DIGI_GPIO_PORT, GPIO_PIN_6)
#define DIGI_PORT2_SET  gpio_bit_set(DIGI_GPIO_PORT, GPIO_PIN_5)
#define DIGI_PORT3_SET  gpio_bit_set(DIGI_GPIO_PORT, GPIO_PIN_4)
#define DIGI_PORT4_SET  gpio_bit_set(DIGI_GPIO_PORT, GPIO_PIN_3)extern INT8U  GucDigiCnt[]; ///******************************void********************************************/
void DigiDrvInit(void);void DigiDrvDisp(INT8U ucNum);void DigiSelect1(void);void DigiSelect2(void);void DigiSelect3(void);void DigiSelect4(void);void DigiRoutine(void);#endif

DigiDrvKey.c

#include "DigiDrvKey.h"
#include "DigiDrv.h"extern INT8U GucDigiNumber;//1、初始化按键(时钟使能,引脚)
void DigiDrvKeyInit(void)
{rcu_periph_clock_enable(RCU_GPIOC);gpio_init(GPIOC, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);}
//2、按键按下,位选数码亮
void keyScan(void)
{       if (!gpio_input_bit_get(GPIOC, GPIO_PIN_0)) {GucDigiCnt[0]++;if (GucDigiCnt[0] > 21) GucDigiCnt[0] = 0;      //选中第一个数码管,按一下加1。当按第十下时,值为0}else if (!gpio_input_bit_get(GPIOC, GPIO_PIN_1))  {GucDigiCnt[1]++;if (GucDigiCnt[1] > 21) GucDigiCnt[1] = 0;      }else if (!gpio_input_bit_get(GPIOC, GPIO_PIN_2))    {GucDigiCnt[2]++;if (GucDigiCnt[2] > 21) GucDigiCnt[2] = 0;}else if (!gpio_input_bit_get(GPIOC, GPIO_PIN_3))  {GucDigiCnt[3]++;if (GucDigiCnt[3] > 21) GucDigiCnt[3] = 0;}}

DigiDrvKey.h

#ifndef __DIGIDRVKEY_H
#define __DIGIDRVKEY_H#include "main.h"
#include "DigiDrv.h"
#include "sys.h"//#define P0  DIGI_PORT;void KeyInit(void);void KeyData(void);
void keyScan(void);#endif

sys.c

#include "sys.h"INT8U GucSysTick1ms = 0;void SysTickInit(void)
{SysTick_Config(SystemCoreClock/1000U);
}//void SysTick_Handler(void)
//{//    GucSysTick1ms++;
//}
void delay_ms(INT8U nms)
{            volatile INT8U i;do{for(i=0;i<20;i++); }while(nms--);
}//void delay_ms(INT16U nms)
//{
//    volatile INT16U i;
//
//    do
//    {//        for(i=0;i<17000;i++);
//    }while(nms--);
//}void delay_us(INT32U nus)
{volatile INT32U i;do{for(i=0;i<20;i++);}while(nus--);
}

sys.h

#ifndef __SYS_H
#define __SYS_H#include "gd32f30x.h"#define SIZE_OF_ARY(x)      (sizeof(x)/sizeof(x[0]))#define APP_ADDR_OFFSET     (0x2800)typedef char             INT8S;
typedef unsigned char    INT8U;
typedef short            INT16S;
typedef unsigned short   INT16U;
typedef long             INT32S;
typedef unsigned long    INT32U;
typedef char             BOOL;#endif

main.c

#include "main.h"
#include "gd32f30x.h"
#include "DigiDrv.h"
#include "DigiDrvKey.h"
#include "LED.h"
#include "MBI6023.h"void SysTickInit(void);
void DigiDrvKeyInit(void);
void delay_ms(INT16U nms);
void DigiDrvKeyData(void);
INT8U GucDigiNumber = 0;
INT32U  GulSysTickCnt = 0;
INT8U  GucDigiCnt[4] = {0}; //数码管位选int main(void)
{ // INT8U j;// INT32U ulKeyScanCnt = 0; //定义数据类型放在函数名前面,即此位置SysTickInit();DigiDrvInit();DigiDrvKeyInit();while (1){//        DigiDrvDisp(GucDigiNumber);//   DigiDrvKeyData();Led();MBI6023_SendData();}
}//
//void SysTickInit(void)
//{//    SysTick_Config(SystemCoreClock/1000U);
//}
//按键延时中断处理函数
void SysTick_Handler(void)                                                //    Systick中断服务函数
{static INT32U ulKeyScanCnt = 0;GulSysTickCnt++;if (GulSysTickCnt > (ulKeyScanCnt+180)){ulKeyScanCnt = GulSysTickCnt;keyScan(); //按键扫描}DigiRoutine(); //数码管轮询(与按键的scan一个意思,不过我们一般不说DigiScan)
}

74HC595/四位按键 驱动四位数码管相关推荐

  1. 74HC595驱动四位数码管

    74HC595驱动四位数码管 数码管编码 出处 硬件原理图 出处 驱动程序 出处 1.数码管编码介绍 它每一段是一个发光二极管,排成一个"日"字形.通过控制某几段发光二极管的发光来 ...

  2. MicroPython-On-ESP8266——数码管的使用,2片HC595驱动四位数码管

    MicroPython-On-ESP8266--数码管的使用,2片HC595驱动四位数码管 1. 背景 前面在使用四位数码管时,需要用来12个GPIO接口,结果咱micropython能驱动的esp8 ...

  3. Arduino Uno驱动四位数码管

    Arduino Uno驱动四位数码管 我用的是 四位共阳极数码管 型号是5461BS-1数码管 接线方法 UNO引脚 数据码 3 1 4 2 5 3 6 4 7 A 8 B 9 C 10 D 11 E ...

  4. 基于51单片机定时器计数+2片74HC595联级+8位数码管时钟+按键修改时间

    基于51单片机定时器计数+2片74HC595联级+8位数码管时钟+按键修改时间 Proteus仿真 实例代码 #include "at89x52.h" /**74hc595引脚定义 ...

  5. [记录] 基于STC89C52RC的贪吃蛇三色游戏机设计(内含点阵驱动、数码管驱动详解)

    目录 设计目标 需求分析 硬件设计 点阵模块 数码管模块 节拍信号发生电路 蜂鸣器电路 串口驱动电路.按键电路及MCU最小系统 软件设计 重要数据结构 蛇 显存 驱动 LED点阵驱动 74595驱动 ...

  6. STM32F103单片机驱动TM1637数码管显示模块

    最近项目中需要用到数码管显示,于是买了一个TM1637芯片驱动的四位数码显示模块,现将调试过程记录一下,方便以后参考. 使用的单片机是STM32F103C8T6最小系统 使用的数码管模块是TM1637 ...

  7. 单片机按键控制数码管c语言程序,基于单片机的按键控制LED数码管共阴极动态显示电路设计报告(毕业论文).doc...

    基于单片机的按键控制LED数码管共阴极动态显示电路设计报告(毕业论文) 物理与电子工程学院2014级课程设计 PAGE IV 物理与电子工程学院 <单片机原理与接口技术> 课程设计报告书 ...

  8. 基于FPGA的两位按键控制LED数码管加减计数实验

    两位按键控制LED数码管加减计数实验 这是一篇拖了一个多月的文章,主要是基于FPGA利用按键消抖原理与动态数码管驱动原理相结合,来实现一个利用两位按键来控制数码管实现0-99的加法计数或者减法计数功能 ...

  9. LED数码管静态显示 C语言程序,PIC单片机驱动LED数码管显示程序

    ;*****该程序用于驱动led数码管显示,在8个LED数码管上依次显示数字1.2.3.4.5.6.7.8******* ;****http://www.51hei.com 单片机学习网经典程序已测试 ...

最新文章

  1. 竞赛中如何做特征工程
  2. php清除账号登录,php实现账号登录/上传/下载/删除文件
  3. 依赖类型dependency type在maven中的作用
  4. 你看过Xgboost原文吗?
  5. Java -- 注解 annotation
  6. Linux sync命令的作用分析
  7. 杠杆原理的形象演示,你都懂了吗?
  8. 二叉树类型笔试面试题大总结(含代码)
  9. OpenShift 4 - 用Compliance Operator对OpenShift进行安全合规扫描
  10. 计算机四进制表示形式,1.4.2 二进制数的四种表示形式(1)
  11. php 监听条码枪输入,一起看看js获取扫码枪输入数据的方法
  12. 大前端-全栈-node+easyui+express+vue+es6+webpack+react
  13. 矩阵相关定义性质全总结
  14. android 最新 九宫格,Android布局案例之人人android九宫格
  15. 武侠乂 兵器招式和高级心法介绍
  16. 计算机文化基础——计算机基础知识
  17. python在图片上添加文字 - cv2模块的安装与使用
  18. 《网络安全应急响应技术实战指南》知识点总结(第9章 数据泄露网络安全应急响应)
  19. 鸿蒙系统是封闭式吗,华为首应用的鸿蒙系统目前看来还是太封闭了...
  20. 学计算机等级考试电脑版软件,猎证全国计算机等级考试学习系统

热门文章

  1. spss modeler用决策树神经网络预测ST的股票
  2. 前端使用emoji表情
  3. Python人工智能
  4. Excel明细生成多个word采购合同,Excel魔方完成
  5. oracle的快捷方式,键盘快捷方式
  6. 清华同方的计算机硬件设置,清华同方笔记本电脑开机进入BIOS的几种方法(F2)附bios设置图文方...
  7. Mapabc里InfoWindow自定义窗口时的关闭事件。
  8. Python 使用第三方 SMTP 服务发送邮件(qq邮箱)
  9. 文本聚类分析算法_读书笔记(8)kmeans聚类算法及应用
  10. root精灵黑屏,刷机精灵解除root