byte num_0[8] = { B00000000,B00000000,B01111100,B01000100,B01111100,B00000000,B00000000,B00000000 };//定义数组 用于让led显示0
byte num_1[8] = { B00000000,B00000000,B00000000,B01111110,B01111110,B00000000,B00000000,B00000000 }; //定义数组 用于让led显示1
byte num_2[8] = { B00000000,B00000000,B01110100,B01010100,B01010100,B01011100,B00000000,B00000000 }; //定义数组 用于让led显示2
byte num_3[8] = { B00000000,B00000000,B01010100,B01010100,B01010100,B01111100,B00000000,B00000000 }; //定义数组 用于让led显示3
byte num_4[8] = { B00000000,B00000000,B00011100,B00010000,B00010000,B01111100,B00000000,B00000000 }; //定义数组 用于让led显示4
byte num_5[8] = { B00000000,B00000000,B01011100,B01010100,B01010100,B00100100,B00000000,B00000000 }; //定义数组 用于让led显示5
byte num_6[8] = { B00000000,B00000000,B01111100,B01010010,B01010010,B01011110,B00000000,B00000000 }; //定义数组 用于让led显示6
byte num_7[8] = { B00000000,B00000000,B01000000,B01000110,B01011000,B01100000,B00000000,B00000000 }; //定义数组 用于让led显示7
byte num_8[8] = { B00000000,B00000000,B01111110,B01011010,B01011010,B01111110,B00000000,B00000000 }; //定义数组 用于让led显示8
byte num_9[8] = { B00000000,B00000000,B01110010,B01010010,B01010010,B01111110,B00000000,B00000000 }; //定义数组 用于让led显示9
struct Button{
int pin;
int last_p;
};
//7-segs 74HC595 引脚 驱动点阵
constexpr int latch_pin = 1;
constexpr int clock_pin = 2;
constexpr int data_pin = 3;
//7-segs 74HC595 引脚 驱动跑马灯
constexpr int latch_pin2 = 4;
constexpr int clock_pin2 = 5;
constexpr int data_pin2 = 6;
//开始暂停按键
constexpr int inpt=7;
//模拟量输入
constexpr int an=8;
int last_dy_time;//用于电压滚动显示时间
int last_p_time;//用于按键防抖
int last_pmd_time;//用于跑马灯循环时间
int st;//标记跑马灯启停
int last_p;//用于确认单击
int an_v;//模拟量读数
int dy_b;//电压滚动显示的位
int pmd;//跑马灯变量
int but(Button b){
if(!digitalRead(b.pin)){
if(micros()-last_p_time>50000){
last_p_time=micros();
if(b.last_p==0){
return 1;
}
b.last_p=1;
}
}
b.last_p=0;
return 0;
}
//驱动点阵
void led(int n,int b,int dp){
int tmp=n;
if(dp){
tmp&=0x7f;
}
for(int i=0;i<8;i++){
digitalWrite(data_pin,(tmp & 0x80)!=0);
digitalWrite(clock_pin, HIGH);
digitalWrite(clock_pin,LOW);
tmp<<=1;
}
tmp=1<<b;
tmp=~tmp;
for(int i=0;i<8;i++){
digitalWrite(data_pin,(tmp & 0x80)!=0);
digitalWrite(clock_pin, HIGH);
digitalWrite(clock_pin,LOW);
tmp<<=1;
}
digitalWrite(latch_pin, HIGH);
digitalWrite(latch_pin, LOW);
}
//驱动跑马灯
void led2(int n){
int tmp=1<<n;
for(int i=0;i<16;i++){
digitalWrite(data_pin,(tmp & 0x8000)!=0);
digitalWrite(clock_pin, HIGH);
digitalWrite(clock_pin,LOW);
tmp<<=1;
}
digitalWrite(latch_pin, HIGH);
digitalWrite(latch_pin, LOW);
}
Button b_in;
void setup() //arduino主函数 用于初始化
{
b_in.pin=inpt;
last_p_time=0;
last_pmd_time=0;
st=1;
last_p=0;
dy_b=3;
pinMode(latch_pin,OUTPUT);
pinMode(clock_pin,OUTPUT);
pinMode(data_pin,OUTPUT);
pinMode(latch_pin2,OUTPUT);
pinMode(clock_pin2,OUTPUT);
pinMode(data_pin2,OUTPUT);
pinMode(inpt,OUTPUT);
pinMode(an,INPUT);
}
void loop()//arduino主循环
{
if(but(b_in)){
st=~st;
}
an_v=analogRead(an);
if(st){//跑马灯循环
if(micros()-last_pmd_time>an_v*1000){
pmd++;
if(pmd>9){
pmd=0;
}
led2(pmd);
}
}
if(micros()-last_dy_time>1000000){
dy_b--;
if(dy_b==-1){
dy_b=3;
}
}
an_v=(an_v/(int)pow(10,dy_b))%10;
int dpst=0;
if(dy_b==3){
dpst=1;
}
switch(an_v/200){ //显示电压值
case 0:
for(int i=0;i<8;i++){
led(num_0[i],i,dpst);
}
case 1:
for(int i=0;i<8;i++){
led(num_1[i],i,dpst);
}
case 2:
for(int i=0;i<8;i++){
led(num_2[i],i,dpst);
}
case 3:
for(int i=0;i<8;i++){
led(num_3[i],i,dpst);
}
case 4:
for(int i=0;i<8;i++){
led(num_4[i],i,dpst);
}
case 5:
for(int i=0;i<8;i++){
led(num_5[i],i,dpst);
}
case 6:
for(int i=0;i<8;i++){
led(num_6[i],i,dpst);
}
case 7:
for(int i=0;i<8;i++){
led(num_7[i],i,dpst);
}
case 8:
for(int i=0;i<8;i++){
led(num_8[i],i,dpst);
}
case 9:
for(int i=0;i<8;i++){
led(num_9[i],i,dpst);
}
}
}
一、新建工程并添加相应的工程文件
本实验需要用到三个固件库文件,分别为stm32f4xx_gpio.c /stm32f4xx_gpio.h 、stm32f4xx_rcc.c/stm32f4xx_rcc.h 、misc.c/ misc.h 。
二、编写用户驱动代码
1、编写c文件
a.使能GPIO时钟,根据电路原理图可知LED0、LED1对应io口的引脚为PE3、PE4,LED2对应的引脚为PG9,故将RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOG作为第一个入口参数。
b.初始化io口设置
c.初始化GPIO
d.设置输出电平,由电路图可知,为上拉模式,设置输出高电平,灯灭。
#include "led.h"
#include "common.h"
//初始化PE3,PE4为输出口,并使能io口时钟
//LEDio口初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//声明一个初始化io口的结构体变量
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOG,ENABLE);//使能GPIOE、GPIOG时钟
//初始化设置
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3 | GPIO_Pin_4;//LED0和LED1对应的io口
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE
GPIO_SetBits(GPIOE,GPIO_Pin_3 | GPIO_Pin_4);//输出高灯灭
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//LED2对应的io口PG9
GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化GPIOG
GPIO_SetBits(GPIOG,GPIO_Pin_9);//输出高灯灭
}
2、编写头文件
#ifndef __LED_H
#define __LED_H
#include "common.h"
#define LED0 PEout(3) //宏定义
#define LED1 PEout(4) //宏定义
#define LED2 PGout(9) //宏定义
void LED_Init(void);
#endif
宏定义的部分必须要与使能的io口相匹配。
三、编写主函数
#include "led.h"
#include "common.h"
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置系统中断优先级分组2
delay_init(); //初始化延时函数
LED_Init(); //初始化LED端口
while(1)
{
LED0=0; //LED0亮
LED1=1; //LED1灭
LED2=1; //LED2灭
delay_ms(500);
LED0=1; //LED0灭
LED1=0; //LED1亮
LED2=1; //LED2灭
delay_ms(500);
LED0=1; //LED0灭
LED1=1; //LED1灭
LED2=0; //LED2亮
delay_ms(500);
}
}
望采纳,谢谢!!!
先模拟电路图,然后直接编程实现。