74HC595/四位按键 驱动四位数码管
一、主要元器件和原理
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/四位按键 驱动四位数码管相关推荐
- 74HC595驱动四位数码管
74HC595驱动四位数码管 数码管编码 出处 硬件原理图 出处 驱动程序 出处 1.数码管编码介绍 它每一段是一个发光二极管,排成一个"日"字形.通过控制某几段发光二极管的发光来 ...
- MicroPython-On-ESP8266——数码管的使用,2片HC595驱动四位数码管
MicroPython-On-ESP8266--数码管的使用,2片HC595驱动四位数码管 1. 背景 前面在使用四位数码管时,需要用来12个GPIO接口,结果咱micropython能驱动的esp8 ...
- 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 ...
- 基于51单片机定时器计数+2片74HC595联级+8位数码管时钟+按键修改时间
基于51单片机定时器计数+2片74HC595联级+8位数码管时钟+按键修改时间 Proteus仿真 实例代码 #include "at89x52.h" /**74hc595引脚定义 ...
- [记录] 基于STC89C52RC的贪吃蛇三色游戏机设计(内含点阵驱动、数码管驱动详解)
目录 设计目标 需求分析 硬件设计 点阵模块 数码管模块 节拍信号发生电路 蜂鸣器电路 串口驱动电路.按键电路及MCU最小系统 软件设计 重要数据结构 蛇 显存 驱动 LED点阵驱动 74595驱动 ...
- STM32F103单片机驱动TM1637数码管显示模块
最近项目中需要用到数码管显示,于是买了一个TM1637芯片驱动的四位数码显示模块,现将调试过程记录一下,方便以后参考. 使用的单片机是STM32F103C8T6最小系统 使用的数码管模块是TM1637 ...
- 单片机按键控制数码管c语言程序,基于单片机的按键控制LED数码管共阴极动态显示电路设计报告(毕业论文).doc...
基于单片机的按键控制LED数码管共阴极动态显示电路设计报告(毕业论文) 物理与电子工程学院2014级课程设计 PAGE IV 物理与电子工程学院 <单片机原理与接口技术> 课程设计报告书 ...
- 基于FPGA的两位按键控制LED数码管加减计数实验
两位按键控制LED数码管加减计数实验 这是一篇拖了一个多月的文章,主要是基于FPGA利用按键消抖原理与动态数码管驱动原理相结合,来实现一个利用两位按键来控制数码管实现0-99的加法计数或者减法计数功能 ...
- LED数码管静态显示 C语言程序,PIC单片机驱动LED数码管显示程序
;*****该程序用于驱动led数码管显示,在8个LED数码管上依次显示数字1.2.3.4.5.6.7.8******* ;****http://www.51hei.com 单片机学习网经典程序已测试 ...
最新文章
- 竞赛中如何做特征工程
- php清除账号登录,php实现账号登录/上传/下载/删除文件
- 依赖类型dependency type在maven中的作用
- 你看过Xgboost原文吗?
- Java -- 注解 annotation
- Linux sync命令的作用分析
- 杠杆原理的形象演示,你都懂了吗?
- 二叉树类型笔试面试题大总结(含代码)
- OpenShift 4 - 用Compliance Operator对OpenShift进行安全合规扫描
- 计算机四进制表示形式,1.4.2 二进制数的四种表示形式(1)
- php 监听条码枪输入,一起看看js获取扫码枪输入数据的方法
- 大前端-全栈-node+easyui+express+vue+es6+webpack+react
- 矩阵相关定义性质全总结
- android 最新 九宫格,Android布局案例之人人android九宫格
- 武侠乂 兵器招式和高级心法介绍
- 计算机文化基础——计算机基础知识
- python在图片上添加文字 - cv2模块的安装与使用
- 《网络安全应急响应技术实战指南》知识点总结(第9章 数据泄露网络安全应急响应)
- 鸿蒙系统是封闭式吗,华为首应用的鸿蒙系统目前看来还是太封闭了...
- 学计算机等级考试电脑版软件,猎证全国计算机等级考试学习系统
热门文章
- spss modeler用决策树神经网络预测ST的股票
- 前端使用emoji表情
- Python人工智能
- Excel明细生成多个word采购合同,Excel魔方完成
- oracle的快捷方式,键盘快捷方式
- 清华同方的计算机硬件设置,清华同方笔记本电脑开机进入BIOS的几种方法(F2)附bios设置图文方...
- Mapabc里InfoWindow自定义窗口时的关闭事件。
- Python 使用第三方 SMTP 服务发送邮件(qq邮箱)
- 文本聚类分析算法_读书笔记(8)kmeans聚类算法及应用
- root精灵黑屏,刷机精灵解除root