只要控制模块的引脚无法安排上拉或下拉电阻,本项目落实起来很简单

公海赌船网址 1

  数码管采取共阴或共阳,每一位一个片选,选个6位的,一共14个引脚,都接在控制模块IO引脚上,注意控制信号电平,必要的时候阳级接上拉电阻。

  使能外设区域时钟对于具有外设都是必须的,且要先于外设起始化函数,这是因为stm32的寄存器配置也是借助时钟脉冲才可以处理的。

  首先,不要误会,我那边的总结器是指硬件的总计器,至于纯软件的统计程序,乃至有高档功用的,比如可以求解方程甚至可编程之类,我后来找个时间的话说。这两天看到有人在博问里问类似的问题,原问是想设计一个有着数码管、有着4×4键盘的硬件里的先后,不知情他具体想做什么,只是给了有些提出。联想到还有总括器这多少个东西,那应当很容易作为电子工程或者微电子专业的一个学业的款型出现。此前自己招实习生的时候,似乎也已经叫其促成过总结器。这里给出一点方案,以供参考。

  公海赌船网址 2

  STM32的GPIO端口工作情势有8种:

  当然,也有想娱乐数字设计的,那么cpld对于这么些要求是方便的,没必要上FPGA,可以用很早从前的,价格也有益。对于资源多少并未握住的话,你也足以先做数字设计,再来选器件。

  版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址

  http://www.cnblogs.com/Colin-Cai/p/8185972.html 

  作者:窗户

  QQ:6679072

  E-mail:6679072@qq.com

  模拟输入 
用于模拟量的输入,或者低功耗下省电。

 

  unsigned char
key;//以象征是哪个键按下,分别给0、1、2、3、4、5、6、7、8、9、+、-、*、/、=、退格编码为0~15

  开漏输出 
端口输出为0时里边下拉电阻电路接地,输出1时端口约等于肤浅,即默认只可以输出0,假使外部需要输出1,需要外接上拉电阻电路

  公海赌船网址 3

本身的博客即将搬运一头至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan

  复用推挽输出
内部设置同推挽,但被另外外设复用。

  数码管接纳共阴或共阳,每一位一个片选,选个6位的,一共14个引脚,都接在控制模块IO引脚上,注意控制信号电平,必要的时候阳级接上拉电阻。

  unsigned char
flag;//flag=0的时候,驱动层可以安装key,并把flag设为1;flag=1的时候,应用层可以读取key,并把flag设置为0

  GPIO_Mode_Out_PP即固件函数库中对应推挽输出。

  既然数码管的体现需要定时去切换显示位,而键盘矩阵也急需定时去切换输入,那么我们就足以设置一个定时器,把这两个硬件的拍卖都挂在同一个定时中断例程上作为驱动层,其逻辑使用上述的规律来贯彻,可以每一趟中断给一个循环计数作为气象,做一个moore机简单明了,至于0.3秒内不重复在交互里展现即可。程序中实现驱动层和应用层的层系分离,无论从调试硬件依旧设计固件来说都是必备的,当然你也可以分的更细,比如HAL层。当然,非要在此处把持有的方方面面糅合在联名也是能够最终搞定的,但层次感差很多,并且一个初学者真的设计不好一个大的状态机。

  unsigned char
num[6] ;//应用层写,驱动层读,用于6位数据的来得

  上拉输入 
端口内上拉电阻电路导通,默认为高电平,外部低电平动作。

  键盘矩阵则是以下电路这样的事物,由一堆按键组成,键盘矩阵对外8个信号都接在控制模块的引脚上。另外,假若决定模块的引脚无法安排上拉或下拉电阻,那么PD0/PD1/PD2/PD3要么PD4/PD4/PD6/PD7/PD8就要接上拉电阻,这事关到键盘矩阵的检测原理。

  电源有多种方案,简单点可以用电池或者usb,这里不作详细座谈。

  浮空输入 
端口内上下MOSFET均不导通,高阻态,输入状态仅由端口决定。

  unsigned char
key;//以代表是哪个键按下,分别给0、1、2、3、4、5、6、7、8、9、+、-、*、/、=、退格编码为0~15

  公海赌船网址 4

  结合原理图和GPIO端口的布局音讯,可知端口配置为推挽输出,由其中上拉电阻来保证LED熄灭。

公海赌船网址 5

  而有关总括器所要实现的最高6位加减乘除,很容易实现,根本不需要运气统计,结合呈现和按键,构成应用层程序,想想一个总计器的职能,你应有很容易的画出流程图,不是吗?

void LED_UserConfig(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;//定义必须在所有运行代码之前,c语言机制问题

    /*使能外设区域时钟*/
    RCC_APB2PeriphClockCmd(RCC_LED_GPIO, ENABLE); 

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        
    GPIO_InitStructure.GPIO_Pin = GPIO_LED_ALL;             //选择LED输出的端口,可根据实际需要配置 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //设定GPIO最大输出频率
    GPIO_Init(GPIO_LED, &GPIO_InitStructure);               
}

  此外要考虑按键的振荡问题,有多种解决办法,比如可以在认清到一回按键按下之后0.3秒内不另行判断按键被按下。

公海赌船网址 6

  1)原理图分析

  大家第一要了解数码管和键盘矩阵的规律:

 

void LED_Control(u8 LED_Number)
{
    GPIO_SetBits(GPIO_LED,GPIO_LED_ALL);//关闭所有LED
    switch(LED_Number)
    {
       case 0:
               GPIO_ResetBits(GPIO_LED,GPIO_LED_1);//LED1点亮       
            break;
       case 1:
                GPIO_ResetBits(GPIO_LED,GPIO_LED_2);     
            break;
       case 2:
                GPIO_ResetBits(GPIO_LED,GPIO_LED_3);        
            break;
       case 3:
                GPIO_ResetBits(GPIO_LED,GPIO_LED_4);      
            break;
        default:
                GPIO_SetBits(GPIO_LED,GPIO_LED_ALL);
            break;
  }
}            

  倘使作为学生,你选拔的是cpld/fpga,我也补助你,我觉得一个足以团结单身做出来的学习者应当仍然不错的,但也和事先处理器的程序实现类似:分别计划键盘驱动模块、数码管驱动模块、总计模块,最后中间有一个骨干模块以一个动静机情势存在,与另外三个模块都频频。当然,每个模块内部也足以分小模块,比如数码管模块里面最好把解码器单独实现一个小模块,而计量模块里加减乘除都是单身的小模块。

  既然数码管的显得需要定时去切换显示位,而键盘矩阵也需要定时去切换输入,那么我们就足以安装一个定时器,把这两个硬件的拍卖都挂在同一个定时中断例程上作为驱动层,其逻辑使用上述的法则来兑现,能够每一次中断给一个循环计数作为气象,做一个moore机简单明了,至于0.3秒内不重复在相互里展现即可。程序中贯彻驱动层和应用层的层系分离,无论从调试硬件如故设计固件来说都是必不可少的,当然你也可以分的更细,比如HAL层。当然,非要在此地把所有的万事糅合在一齐也是可以最后搞定的,但层次感差很多,并且一个初我们真的设计不佳一个大的状态机。

  因为所有例程都是在现有开发板完成的,所以重要涉及地点后两个地点,其中最中央的一些就是软件设计。流水灯的实现并不复杂,系统的来说含有硬件接口消息获取,驱动配置,逻辑实现,编译测试等组合。明白了上述流程,项目统筹就相比较简单了:

     
 公海赌船网址 7

  硬件

  具体代码参考:http://files.cnblogs.com/files/zc110747/1.LightWater.7z

  公海赌船网址 8

  硬件设计好了后头,需要统筹固件。

  下拉输入  端口内下拉电阻电路导通。默认为低电平,外部高电平动作。

  硬件设计好了随后,需要规划固件。

公海赌船网址 9

  推挽输出 
端口输出为0时内部下拉电阻电路接地,输出1时其中接上拉电阻电路,默认输出为0。

  以上数据有冗余,在RAM极端受限的事态下,可以裁剪数据。

  假如控制模块拔取的是单片机,那么大家一般是在裸机下编程,对于这几款单片机我似乎只玩过汇编,但先天都21世纪了,我想起码也应当用C语言来娱乐。

  按照下面原理图。就能查获信息LED对应端口PD2,PD3,PD4,PD7,外部上拉电阻,低电平点亮。

  设计有些全局变量用来应用层和驱动层交互显示数据和所按按键。

  其它要考虑按键的抖动问题,有多种化解模式,比如可以在认清到三次按键按下之后0.3秒内不重复判断按键被按下。

  如上,就成功外设开首化,接下去就可以直接使用固件库提供的API接口操作LED了,具体贯彻代码:

  数码管相对简便易行一些,一般的话,数码管每一位显示的数字都不等同。如本人图中的共阴6位数码管,当要来得某位的时候,片选信号选用是拉低,其他片选拉高,然后再把要出示的数字所要点亮的管的引脚拉高,这样,要呈现的这一位就显得出了数字,而另外的几位没有此外显示。然后快捷切换,每一位都体现该突显的数字,那么依据视觉暂留,我们就看到了一体化的显得。

公海赌船网址 10

**  复用开漏输出 **内部设置同开漏,但被其它外设复用。

公海赌船网址,  框图如上,紧要有4大模块,电源、控制、按键矩阵、数码管。

  以上数量有冗余,在RAM极端受限的图景下,可以裁剪数据。

 
  公海赌船网址 11

  电源有多种方案,简单点可以用电池或者usb,这里不作详细座谈。

  假设作为学生,你拔取的是cpld/fpga,我也帮助你,我觉得一个足以自己单身做出来的学习者应该仍旧不错的,但也和事先处理器的程序实现类似:分别计划键盘驱动模块、数码管驱动模块、总计模块,最终中间有一个中坚模块以一个情景机模式存在,与另外六个模块都不停。当然,每个模块内部也可以分小模块,比如数码管模块里面最好把解码器单独实现一个小模块,而计量模块里加减乘除都是单身的小模块。

  熟知下stm32f10x固件函数库中的stm32f10x_gpio.c文件,接下去就可以最先项目编程了。

  键盘矩阵可能要复杂那么一些。首先,我们假使我们这里PD5、PD6、PD7、PD8都被咱们接了上拉电阻,并且IO都为高阻接收状态,而不出口。大家这里只考虑一个键的分辨,其实键盘矩阵也足以辨别多少个键。大家想一想,假设某个键按下来,比如左上角的S3按下之后,会发出哪些。在按下来此前,PD1、PD2、PD3、PD4和PD5、PD6、PD7、PD8中间并不联通。但当S3按下来,PD1和PD4连在了一头。倘诺决定模块把PD4的出口射为高阻状态,那么只要PD0输入低电平,那么PD4读取出来的应该为低电平,否则为高电平。于是我们把PD1、PD2、PD3、PD4这4个引脚每趟只中间一个出口低电平,其他五个出口高阻状态,每回都去读取PD5、PD6、PD7、PD8,那么就足以按照数值来判断究竟是哪些按键被按下。注意,此处PD1、PD2、PD3、PD4这4个引脚每趟只中间一个出口低电平的时候,其他多少个无法出口高电平,而应该是高阻,否则,固然有两个按键被按下,则为封堵状态!

  框图如上,重要有4大模块,电源、控制、按键矩阵、数码管。

  学会了什么样新建一个工程模板,上边就要起来伊始实践了。像c/c++中经典的入门代码”hello
world”一样,流水灯作为最简单易行的硬件装置在单片机领域也是入门首推。假设你曾经有了肯定的C语言基础以及已经接纳过类似的芯片,那么学习起来相对事半功备。当然没有也不需要担心,本项目实现起来很粗略。然则学习嵌入式,第一点就是要转变思路,从明天起来你不在是一味和编程语言打交道了,交叉编译的方法决定嵌入式项目软硬件不分家,从硬件实现,软件设计,软硬件调试,硬件运行观察结果,领会和适应那么些流程对于嵌入式学习和研发具有至关首要意义。

  控制模块,就看想用什么编程了,倘诺想用单片机,可以选用经典的51单片机、AVR单片机、PIC单片机都足以,STM32当然可以,只是ARM可以做远比这些复杂的事情,没必要杀鸡用牛刀。当然,想学学ARM特别是STM32的编程,能够用STM32。PIC单片机和51单片机本身只玩过汇编,可是现在单片机援助C语言都援助的蛮不错,提议仍然C语言编程。

  设计有些全局变量用来应用层和驱动层交互显示数据和所按按键。

  如此,就兑现了LED1点亮->LED1灭->LED2亮->……的巡回过程,完整代码可参考文件1-1,希望对入门stm32上学有扶持!

 

  键盘矩阵则是以下电路这样的东西,由一堆按键组成,键盘矩阵对外8个信号都接在控制模块的引脚上。另外,如果控制模块的引脚不可能配备上拉或下拉电阻,那么PD0/PD1/PD2/PD3或者PD4/PD4/PD6/PD7/PD8就要接上拉电阻,这关乎到键盘矩阵的检测原理。

  LED相关引脚初步化:

  版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址

  http://www.cnblogs.com/Colin-Cai/p/8185972.html 

  作者:窗户

  QQ:6679072

  E-mail:6679072@qq.com

     
 公海赌船网址 12

  unsigned char
flag;//flag=0的时候,驱动层可以设置key,并把flag设为1;flag=1的时候,应用层可以读取key,并把flag设置为0

  控制模块,就看想用什么编程了,假使想用单片机,可以采用经典的51单片机、AVR单片机、PIC单片机都可以,STM32自然可以,只是ARM可以做远比这么些复杂的业务,没必要杀鸡用牛刀。当然,想学学ARM特别是STM32的编程,可以用STM32。PIC单片机和51单片机本身只玩过汇编,不过现在单片机帮忙C语言都协助的蛮不错,指出依然C语言编程。

自身的博客即将搬运一头至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan

 

  假若决定模块接纳的是单片机,那么大家一般是在裸机下编程,对于这几款单片机我似乎只玩过汇编,但目前都21世纪了,我想起码也应有用C语言来娱乐。

  当然,也有想娱乐数字设计的,那么cpld对于那么些要求是恰如其分的,没必要上FPGA,能够用很早从前的,价格也利于。对于资源多少并未把握的话,你也足以先做数字设计,再来选器件。

公海赌船网址 13

  大家率先要精晓数码管和键盘矩阵的规律:

  硬件

 

  unsigned char
num[6] ;//应用层写,驱动层读,用于6位数据的显得

  固件

 

  键盘矩阵可能要复杂那么一些。首先,我们只要大家这边PD5、PD6、PD7、PD8都被我们接了上拉电阻,并且IO都为高阻接收状态,而不出口。我们这里只考虑一个键的辨识,其实键盘矩阵也足以辨别四个键。我们想一想,假诺某个键按下来,比如左上角的S3按下之后,会时有爆发哪些。在按下来往日,PD1、PD2、PD3、PD4和PD5、PD6、PD7、PD8中间并不联通。但当S3按下来,PD1和PD4连在了一同。如若决定模块把PD4的出口射为高阻状态,那么只要PD0输入低电平,那么PD4读取出来的应当为低电平,否则为高电平。于是我们把PD1、PD2、PD3、PD4这4个引脚每一遍只中间一个出口低电平,其他六个出口高阻状态,每回都去读取PD5、PD6、PD7、PD8,那么就可以按照数值来判断究竟是哪些按键被按下。注意,此处PD1、PD2、PD3、PD4这4个引脚每一次只中间一个出口低电平的时候,其他两个不可以出口高电平,而相应是高阻,否则,尽管有六个按键被按下,则为阻隔状态!

  而至于总计器所要实现的万丈6位加减乘除,很容易实现,根本不需要运气总计,结合彰显和按键,构成应用层程序,想想一个总计器的功力,你应该很容易的画出流程图,不是吧?

  首先,不要误会,我那里的总计器是指硬件的统计器,至于纯软件的推测程序,乃至有高档功用的,比如可以求解方程甚至可编程之类,我事后找个时间的话说。这两天看到有人在博问里问类似的题目,原问是想设计一个具备数码管、有着4×4键盘的硬件里的顺序,不晓得他具体想做什么样,只是给了有些指出。联想到还有总括器这个东西,这应当很容易作为电子工程或者微电子专业的一个学业的款型出现。从前我招实习生的时候,似乎也已经叫其促成过总结器。这里给出一点方案,以供参考。

  固件

  数码管相对简便易行一些,一般的话,数码管每一位展现的数字都不同等。如我图中的共阴6位数码管,当要展现某位的时候,片选信号选用是拉低,其他片选拉高,然后再把要来得的数字所要点亮的管的引脚拉高,这样,要显示的这一位就展现出了数字,而此外的几位没有任何显示。然后很快切换,每一位都显示该展现的数字,那么遵照视觉暂留,我们就见到了完全的显得。

相关文章