历史上的今天
今天是: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 } /******************************************************************************* * 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); }
史海拾趣
|
二、关于嵌入式系统方向 嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高等。特别是随着消费家 ...… 查看全部问答> |
|
在蓝牙协议中,主从设备间只支持一条ACL链路和三条SCO链路,是不是就是说在某一时刻,主从服务间只有一个服务使用这个ACL链路??? 如题,现在很急的一个问题, 想请教高手, 蓝牙协议中的主从设备间只支持一条ACL链路和三条SCO链路,是不是就是等价于说在某一时刻,主从服务间只有一个服务使用这个ACL链路??? 举个例子就是,某一时刻文件传输服务和蓝 ...… 查看全部问答> |
|
S3C2440 SPI接收问题请教, 程序代码如下所示. 我通过示波器能够抓到MISO,MOSI的正确波形,说明数据发送和接收都是正确的,可就是2440寄存器SPRDAT0没有数值,始终是0. 各位大侠估计什么原因?ARM MISO管脚显示信号都是正确的,相应接收寄存器却 ...… 查看全部问答> |
|
最近做仿真软件开发,要求实时性很强,为了方便开发和用户使用,就不想换操作系统,看到可以在Windows下使用RTX来实现,只是我同用过,哪位大侠用过,说下~~ … 查看全部问答> |
|
题目是:同时用两个定时器控制蜂鸣器发声,定时器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\': ...… 查看全部问答> |
|
这几天拼命在学这个了! 学了几遍,因为学完的比较早,做题过的也比较早,后来就只看资料了,没有想到当时忘记把图截完了! 当时以后系统可以在后台统计! 麻烦管理员朋友帮忙查看一下!辛苦了!!… 查看全部问答> |




