stm32四联七段数码管,LED8*8点阵

一、七段数码管的整体代码和仿真

1)代码

c 复制代码
seg74.c
#include "stm32f10x.h"                  // Device header

void seg74_init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    
    GPIO_Init(GPIOA,&GPIO_InitStruct);
    
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    
    GPIO_Init(GPIOB,&GPIO_InitStruct);
    
    GPIO_ResetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
    GPIO_Write(GPIOB,0xff);
}

main.c
#include "led.h"
#include "stm32f10x.h"     // Device header
#include "led88.h"

int i=0;
int j=0;
int count=0;

uint16_t num[]={0xc0,0xf9,0xA4,0xb0,0x99};
uint16_t bits[]={1,2,3,4};


uint16_t code[]={0x08,0x08,0x3e,0x2a,0x2a,0x3e,0x08,0x08};

int main()
{
    
    seg74_init();
    while(1)
    {
        if(count>2000)
        {
            GPIO_Write(GPIOA,0x0);//PA0-PA3输出低电平
            GPIO_Write(GPIOB,0xff);//PB0-PB7输出高电平
            
            GPIO_Write(GPIOA,0x1<<i);//PA0-PA3写位码
            GPIO_Write(GPIOB,num[bits[i]]);//PB0-PB7写段码
            
            i++;
            if(i>3)
                i=0;
            
            count=0;
        }
        else
            count++;
    }
    seg74.h
    #ifndef LED_H
	#define LED_H
	
	void seg74_init(void);
	
	#endif

2)仿真

3)分析

seg74.c里面分别进行引脚A和B的初始化,A代表位选B代表段选,通过定义的结构体变量依次** . **出来结构体的成员值(引脚、推挽输出,速率),而后一定要时钟使能,其中A和B如果共用同一个变量需要依次写,不然会被覆盖。

首先给GPIOA其中一个设置成低电平,GPIOB所有设置位高电平,这样做的目的是在代码运行仿真时让数码管什么都不亮(因为是共阳数码管,原本的A端口接正极(高电平),B接负极(低电平))。

main函数中while(1)死循环,count用于数码管显示更新的频率。首先要将管脚A和B输出为相反电平即不亮状态,否则仿真会出问题。随后定义两个16位的数组num用来保存显示的数字,通过位操作来设置 GPIOA 端口的位码

bitsi作为索引从num当中获取段码值,写入GPIOB,i++表示切换到下一个数码管位,如果大于3则重置为0依次循环就能使1234稳定输出在数码管上。

二、LED8*8点阵

1)led88.c


0xff即是00000000 11111111对应P15~P0,因为PA0到PA7是低电平有效,全置为1;PA8到PA15是高电平有效,全置0,初始化使灯不亮

2)main.c

"中"所需点亮的灯

列:0000 1000 => 0x80

行:1111 11110 => 0xfe(程序中为了方便代码的编写,找相同规律),即~(0x1<<0),后续同样如此

以i为0为例:

c 复制代码
当i=0;0x08<<8(向左移动8位),0000 0000 0000 1000	->0000 1000 0000 0000(低八位不一定是0)
											 0xff:0000 0000 1111 1111
											~0xff:1111 1111 0000 0000
结果:0000 1000 0000 0000

(0x08<<8 & ~0xff)=0x08,&操作是为了将低8位清零以便PA15-PA8(高八位)与低八位的拼接

c 复制代码
0x1<<0(即 0001向左移动0位) => 0000 0000 0000 0001
							~1111 1111 1111 1110
0xff<<8 => 1111 1111 0000 0000
		~  0000 0000 1111 1111(将高8位置0,因为高8位不一定是0)
结果:0000 0000 1111 1110

~(0x1<<0) & ~(0xff<<8)=0xfe

c 复制代码
(0x08<<8 & ~0xff) | (~(0x1<<0) & ~(0xff<<8))
等同:0000 1000 0000 0000
	  0000 0000 1111 1110    
	  08fe

结论:

高八位进行操作时,需将低八位清零

低八位进行操作时,需将高八位清零

相关推荐
Dr.kangder23 分钟前
嵌入式面试总结(十五)——异常处理
单片机·面试·职场和发展·系统架构·嵌入式
zlinear数据采集卡2 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
ACP广源盛139246256732 小时前
蚂蚁百灵 Ling‑3.0‑flash 开源 + 昇腾 0‑Day 原生适配@ACP#GSV9001E 在国产算力矩阵中的机会与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
Rocktech_ruixun4 小时前
机器人端侧大模型部署对主板有哪些要求?瑞迅主控板分级方案对比
人工智能·嵌入式硬件·机器人
Lzh编程小栈5 小时前
【嵌入式底层】SPI超透彻详解:通信原理、四线结构、四种模式、寄存器底层 + 面试全集
c语言·stm32·单片机·面试·职场和发展
Rocktech_ruixun5 小时前
机器人数据采集能力取决于什么?瑞迅科技RK3588/3576核心板方案深度解析
人工智能·嵌入式硬件·机器人
水果里面有苹果5 小时前
28-DRV8825PWPR步进电机驱动器
单片机
恒锐丰科技韩生6 小时前
率能 SS6625E|3.0~20V 单通道 H 桥直流电机驱动 SOP8 电子锁玩具机器人分享
嵌入式硬件·硬件工程
zlinear数据采集卡6 小时前
D223 ADC数据处理流水线:从原始采样值到工程单位的完整转换链
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
Dr.kangder7 小时前
嵌入式面试总结(十八)——JTAG调试
嵌入式硬件·面试·职场和发展·架构·嵌入式