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

结论:

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

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

相关推荐
JasmineX-111 分钟前
下位机直接控制57步进电机匀速转动
stm32·单片机·嵌入式硬件
聆思科技AI芯片39 分钟前
【AI硬件开发上手教程】怎么使用AI编程实现小聆AI语音控制舵机
人工智能·嵌入式硬件·开源·ai编程·智能硬件
abc light1 小时前
ARM 裸机开发(6)——时钟树与定时器
arm开发·单片机·fpga开发
吠品11 小时前
智谱开源 ZCode 之后,真正的考试才开始
单片机·嵌入式硬件·1024程序员节
Chery114012 小时前
高速ADC与精密DAC怎么选?DP9230D与DP8532D应用解析
嵌入式硬件·物联网·射频工程
小李不想当小白15 小时前
SPI通信外设与W25Q64 (硬件SPI)(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
LCG米15 小时前
STM32驱动W5500以太网模块实测:TCP吞吐瓶颈定位、TX指针回绕陷阱与断线重连保活落地
stm32·单片机·嵌入式硬件·tcp/ip
尼喃17 小时前
662K/65Z5三脚稳压芯片规格书—PW6566B33/B30引脚功能
嵌入式硬件
创界工坊工作室17 小时前
63-基于STC89C52霍尔传感器的智能化电能表设计
stm32·单片机·嵌入式硬件·51单片机·proteus
智购科技自动售货机厂家18 小时前
让AI经营自动售货机:从Project Vend看工具权限与业务规则~YH
大数据·服务器·单片机·嵌入式硬件·深度学习