历史上的今天
返回首页

历史上的今天

今天是:2025年08月12日(星期二)

正在发生

2019年08月12日 | STM32-(17):SPI与数码管,

2019-08-12 来源:eefocus

数码管

数码管是一种应用很普遍的显示器件,从单片机、ARM到许多微型机控制系统及数字化仪器仪表中都用到数码管作为显示输出。
数码管的主要部分是七段发光_极管;数码管分为共阴极和共阳极两种;为了保护各段 LED ,需外加限流电阻。有的产品还附带有一个小数点,故有人叫其为八段式发光二极管。
在这里插入图片描述

由7个发光段的不同组合,从而实现十六进制数的显示。线面分别是共阴极和共阳极0-9的编码表。
在这里插入图片描述

164来讲主要是多了RCK输出锁存器和G允许输出端(允许三态的存在)

在这里插入图片描述
解释:上图中的smgA1-4等等都是位选端,为了增加数码管的亮度,这里增加了三极管起到放大电流的作用,以smgA4为例,当这里输出一个低电平,三极管导通,对应的数码管就能通电工作。(这里能看出数码管是共阳的连接方式),这里一共用到的引脚数9个(U14 中的 9/11/12/13/14+smgA1-A4一共是9个引脚),比原来的12个节省了3个引脚(原来12个是指U15的引脚 8+4)。

硬件电路引脚连接

1.首先看smgA1-A4,在核心板原理图的底板排针图中找
在这里插入图片描述
2.然后在核心板原理图的CPU部分查找:由上图可知smgA1-A4,对应名称分别是 PC8/SPI2_MOSI/PC9/PE8
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

由结果可知,A1-A4分别对应连接核心板上的 65、54、66、39引脚。(我们可以看到很多的端口是复用的)
3.继续找595_nCS、SCK0、MOSI0、MISO0、RCK 对应引脚。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由结果可知,595nCS、RCK、SCK0、MISO0、MOSI0 分别对应连接核心板上的 23、24、30、31、32引脚。

实验1:驱动第一个数码管显示0(软件模拟)

综合上面的分析,我们可以把需要用的引脚与CPU的连接关系列出来:
smgA1—PC8:0 导通
RCK—PA1
SCK0—SPI1SCK—PA5
MISO0—PA6
MOSI0—PA7
595_nCS—PA0

/*Include---------------------------*/

#include"stm32f10x_lib.h" //包含所有的头文件

#include


//----------------函数声明--------------------

void Delay_MS(u16 dly);

void RCC_Configuration(void);

void GPIO_Configuration(void);

void USART3_Configuration(void);



/*******************************************************************************

* Function Name  : main

* Description    : Main program.

* Input          : None

* Output         : None

* Return         : None

*******************************************************************************/ 

int main(void)

{

u8 i,data;

#ifdef DEBUG

debug();

#endif


//------------初始化------------

RCC_Configuration();

GPIO_Configuration();


  //------------数码管的控制------------

//smgA1---PC8: 0  //RCK--PA1  //SCK--PA5 //MISO0---PA6   //MOSI0---PA7 //595_nCS----PA0

//1、smgA1 PC8=0  595_nCS=0,

GPIO_ResetBits(GPIOC, GPIO_Pin_8);

GPIO_ResetBits(GPIOA, GPIO_Pin_0);

//2、SCK0 上升沿  MOSI0 数据输入   完成这个数据的通信 00100100

data=0x24;

for(i=0;i<8;i++)

{

GPIO_ResetBits(GPIOA, GPIO_Pin_5);   //pa5=0

    

if((data&0x01)==0x00)

GPIO_ResetBits(GPIOA, GPIO_Pin_7); 

else

GPIO_SetBits(GPIOA, GPIO_Pin_7);   


GPIO_SetBits(GPIOA, GPIO_Pin_5);  //pa5=1

data>>=1;

}


//3、RCK上升沿进行锁存

GPIO_ResetBits(GPIOA, GPIO_Pin_1);

Delay_MS(2);

GPIO_SetBits(GPIOA, GPIO_Pin_1);

}


/*******************************************************************************

* Function Name  : Delay_Ms

* Description    : delay 1 ms.

* Input          : dly (ms)

* Output         : None

* Return         : None

*******************************************************************************/

void Delay_MS(u16 dly)

{

u16 i,j;

for(i=0;i for(j=1000;j>0;j--);

}


/*******************************************************************************

* Function Name  : RCC_Configuration

* Description    : Configures the different system clocks.

* Input          : None

* Output         : None

* Return         : None

*******************************************************************************/

void RCC_Configuration(void)

{

//----------使用外部RC晶振-----------

RCC_DeInit(); //初始化为缺省值

RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速时钟 

while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速时钟使能就绪

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer

FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state

RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK

RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 =  HCLK

RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ

RCC_PLLCmd(ENABLE); //Enable PLLCLK


while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock

while(RCC_GetSYSCLKSource()!=0x08); //Wait till PLL is used as system clock source

//---------打开相应外设时钟--------------------

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE); //使能APB2外设的GPIOA的时钟  

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);

//开启时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOC,ENABLE);

}


/*******************************************************************************

* Function Name  : GPIO_Configuration

* Description    : 初始化GPIO外设

* Input          : None

* Output         : None

* Return         : None

*******************************************************************************/

void GPIO_Configuration(void)

{


//smgA1---PC8: 0 //RCK--PA1 //SCK0---I1SCK--PA5  //、、MISO0---PA6 //MOSI0---PA7 //595_nCS----PA0

GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_5 | GPIO_Pin_7; //选择PA.0、PA.1、PA.5、PA.7(输出)

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //输出模式为推挽输出

GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PB5

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //选择PA.6(输入)

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入

GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PB5


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //选择PC.8(输出)

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //输出模式为推挽输出

GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化PB5


void USART3_Configuration(void)

{

USART_InitTypeDef  U3;

U3.USART_BaudRate =9600;

U3.USART_WordLength = USART_WordLength_8b;

U3.USART_StopBits = USART_StopBits_1;

U3.USART_Parity = USART_Parity_No;

U3.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;

U3.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 


USART_Init(USART3, &U3);


USART_Cmd(USART3,ENABLE);

}

在这里插入图片描述

推荐阅读

史海拾趣

DENWIRE公司的发展小趣事

以下是关于DENWIRE公司在电子行业中发展起来的五个相关故事,每个故事都遵循了字数和事实性的要求。

故事一:
DENWIRE公司起初只是一家小型的电线制造商,专注于生产低端音频线缆。然而,随着科技的进步和消费者对于音频质量的追求,公司创始人李先生看到了高品质音频线缆市场的潜力。他带领团队投入大量研发资源,成功开发出了一款具有极低信号损失和出色耐用性的音频线缆,赢得了市场的广泛认可。这款产品不仅让DENWIRE在音频线缆领域崭露头角,也为公司后续的发展奠定了坚实的基础。

故事二:
随着公司规模的扩大,DENWIRE逐渐涉足到了数据传输线缆的生产。在面对激烈市场竞争时,公司坚持创新驱动,注重产品质量。在一次与知名科技公司的合作中,DENWIRE凭借其出色的产品性能和可靠的品质,成功赢得了对方的信任,并签订了长期供货合同。这次合作不仅为DENWIRE带来了可观的收益,也进一步提升了公司在行业内的知名度。

故事三:
在新能源汽车行业蓬勃发展的背景下,DENWIRE敏锐地捕捉到了这一领域的商机。公司迅速调整战略方向,加大了对新能源汽车用线缆的研发和生产投入。经过多次试验和改进,DENWIRE成功开发出了一款符合新能源汽车高标准要求的线缆产品,并在市场上取得了良好的销售业绩。这一成就不仅彰显了DENWIRE的技术实力,也为公司未来的发展开辟了新的道路。

故事四:
面对全球化市场的挑战,DENWIRE积极寻求国际合作与拓展。公司先后与多个国家和地区的知名企业建立了战略合作关系,共同开发新产品、拓展新市场。通过国际合作,DENWIRE不仅学习到了先进的生产技术和管理经验,也进一步提升了自身的品牌影响力和市场竞争力。

故事五:
在环保和可持续发展成为全球共识的背景下,DENWIRE积极响应号召,致力于推动绿色生产和可持续发展。公司投入大量资金引进环保设备和工艺,优化生产流程,减少能源消耗和废弃物排放。同时,DENWIRE还积极参与社会公益活动,回馈社会。这些举措不仅提升了公司的社会形象,也为公司的长期发展注入了新的活力。

Chips And Technologies Inc公司的发展小趣事

C&T始终坚持品质至上的原则,从原材料的采购到产品的生产、测试,每一个环节都严格把控。这种对品质的执着追求,使得C&T的产品在市场上赢得了良好的口碑。许多知名电脑制造商都选择与C&T合作,将其产品作为首选的半导体解决方案。

Global Power Technologies Group公司的发展小趣事
通过调整RC时间常数,可以实现信号的延时输出,用于信号处理、控制系统等领域。
Axiomtek公司的发展小趣事
在设计过程中要充分考虑电路的安全性,避免发生触电、短路等危险情况。
Corsair Memory Inc公司的发展小趣事

Corsair Memory Inc公司的成功不仅在于其产品的创新,更在于其与全球知名电脑厂商的合作。多家世界级的OEM合作伙伴选择Corsair作为其内存供应商,这不仅提升了Corsair的品牌影响力,也为其带来了稳定的订单和市场份额。这种合作关系的建立,是Corsair在电子行业中持续发展的重要支撑。

DOMINANT公司的发展小趣事

随着公司业务的不断发展,统明亮开始积极拓展全球市场。它通过与国内外知名企业的合作,不断提升自身的品牌影响力和市场竞争力。同时,统明亮还积极参加各类国际展会和交流活动,与全球各地的客户建立了紧密的合作关系。这些努力使得统明亮在全球LED市场中的份额不断扩大,其品牌影响力也得到了进一步提升。

请注意,由于篇幅限制,以上仅为三个简要故事。如果需要更多关于DOMINANT公司的发展故事,建议查阅相关报道和资料。

问答坊 | AI 解惑

求助

现急需一张电路图.要求用AT89C52控制,有2个1M的闪存,一个EEPROM,4*4键盘,8个LED数码显示,一个RS232接口,需要用IIC 控制.请哪位好心的大虾帮帮忙.小弟在这里先谢过了.…

查看全部问答>

同济大学软件学院院长谈择业—关于嵌入式方向

二、关于嵌入式系统方向   嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高等。特别是随着消费家 ...…

查看全部问答>

在蓝牙协议中,主从设备间只支持一条ACL链路和三条SCO链路,是不是就是说在某一时刻,主从服务间只有一个服务使用这个ACL链路???

如题,现在很急的一个问题, 想请教高手,     蓝牙协议中的主从设备间只支持一条ACL链路和三条SCO链路,是不是就是等价于说在某一时刻,主从服务间只有一个服务使用这个ACL链路???    举个例子就是,某一时刻文件传输服务和蓝 ...…

查看全部问答>

S3C2440 SPI接收问题请教?

S3C2440 SPI接收问题请教, 程序代码如下所示. 我通过示波器能够抓到MISO,MOSI的正确波形,说明数据发送和接收都是正确的,可就是2440寄存器SPRDAT0没有数值,始终是0. 各位大侠估计什么原因?ARM MISO管脚显示信号都是正确的,相应接收寄存器却 ...…

查看全部问答>

有没有人使用过Windows下的RTX实时扩展?

最近做仿真软件开发,要求实时性很强,为了方便开发和用户使用,就不想换操作系统,看到可以在Windows下使用RTX来实现,只是我同用过,哪位大侠用过,说下~~ …

查看全部问答>

根据读txt文件自动配置控件的类型,可以实现吗?

根据读txt文件自动配置控件的类型,可以实现吗? 要是可以,怎么实现? 谢谢各位路过的大侠了,希望给我指点一二! 谢谢!!!!…

查看全部问答>

关于51定时器的小问题求教

题目是:同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔300ms输出1k(hz)的方波。 我的代码是:#include #include #define uint unsigned int #define uchar unsigned char uint t1=0,t2=0; sbit b ...…

查看全部问答>

奇怪!下面函数通不过?

 奇怪!下面函数通不过?     {   uchar  a;    a=1;      if( a!=1 )  break;       } 错误提示:COMJM.C(64): error C171: \'break\': ...…

查看全部问答>

招聘兼/全职

1.负责32位MCU/ARM开发,硬件模块驱动设计和开发,上层应用程序编写和维护等工作。 2.熟悉ARM体系架构,嵌入式操作系统开发环境及流程 3.具备扎实的计算机软件基础,精通C程序设计、扎实的数/模电路知识。 4.熟练操作DXP/99se等工具。5、熟悉FPGA内 ...…

查看全部问答>

C2000学习进度没有截图完!希望还有机会

这几天拼命在学这个了! 学了几遍,因为学完的比较早,做题过的也比较早,后来就只看资料了,没有想到当时忘记把图截完了! 当时以后系统可以在后台统计! 麻烦管理员朋友帮忙查看一下!辛苦了!!…

查看全部问答>