历史上的今天
返回首页

历史上的今天

今天是:2025年01月22日(星期三)

正在发生

2020年01月22日 | 【ARM】2410裸机系列-按键查询式控制led

2020-01-22 来源:eefocus

开发环境

 

硬件平台:FS2410

主机:Ubuntu 12.04 LTS


LED灯原理图


按键原理图


按键的接线资源

 

KSCAN0 -> GPE11    KSCAN1 -> GPG6     KSCAN2 -> GPE13      KSCAN3 -> GPG2
EINT0  -> GPF0     EINT2  -> GPF2     EINT11 -> GPG3       EINT19 -> GPG11


程序主要原理

 

这里实现对 K1,K2,K3,K4 这四个键的查询。

主要涉及到K1,K2, K3, K4这四个按键,要用查询的方式进行判断哪个键被按下去了,因此:

  • 将EINT11, EINT19设置为输入,用于读取;

  • 将KSCAN0,KSCAN1,KSACAN2,设置为输出,并分别设置为0,1,1或1,0,1或1,1,0三种情况,这样可用于区分K1、K2、K3中哪个键按下去。


例如先让KSCAN0~2 = 011,那么K1被按下时,EINT19才会变为低电平,这时K2按下时,EINT19不会变低,这样就区分了按键K1和K2,区分其它按键原理一样。

 


寄存器配置

 

有关LED的寄存器的配置:(设置GPF4-GPF7为输出)

按键方面涉及到寄存器配置(设置相关寄存器输入输出)


精简原理图


程序源代码

 

//led_key.c

  1 #include "2410addr.h"

  2                                                                                                                                                

  3 void delay(long long max)      //延迟函数

  4 {

  5     for(; max > 0; max--);

  6                                                                                                                                                

  7 }

  8                                                                                                                                                

  9 int main(void)

 10 {

 11     int read_value;

 12                                                                                                                                                

 13     rGPFCON = rGPFCON & (~(0xff) << 8) | (0x55 << 8);     //设置4个LED灯为输出(GPF4-GPF7输出)

 14     rGPFDAT |= (0xf << 4);       //先将4个灯都熄灭掉

 15                                                                                                                                                

 16     rGPGCON = (0 << 7) | (1 << 12) | (0 << 23);       //GPG3, GPG11 输入,GPG6, GPE11, GPE13输出

 17     rGPECON =  (1 << 22) | (1 << 26);

 18                                                                                                                                                

 19     while(1)

 20     {

 21         rGPEDAT &= (0 << 11);      //将GPE11置0,同时将GPE13和GPG6置1

 22         rGPEDAT |= (1 << 13);

 23         rGPGDAT |= (1 << 6);

 24                                                                                                                                                

 25         read_value = rGPGDAT & 0x808;      //读取GPG11和GPG3的输入值

 26                                                                                                                                                

 27         if((read_value & 0x800) == 0)       //判断GPG11输入是否为0,以此判断K1键是否按下

 28         {

 29             read_value = 0x800;

 30             delay(200000);        //按键去抖

 31                                                                                                                                                

 32             if((read_value &= rGPGDAT) == 0)

 33             {

 34                 if((rGPFDAT & (1 << 4)) == 0)      //判断D12是否亮着,如果亮着则熄灭,反之相反

 35                     rGPFDAT |= (0x1 << 4);

 36                 else

 37                     rGPFDAT &= (0xe << 4);

 38             }

 39         }

 40         else

 41         {

 42             if((read_value & 0x8) == 0)     //判断GPG3输入的值是否为0, 以此K4键是否按下

 43             {

 44                 read_value = 0x8;

 45                 delay(200000);        //按键去抖

 46                                                                                                                                                

 47                 if((read_value &= rGPGDAT) == 0)

 48                 {

 49                     if((rGPFDAT & (0x8 << 4)) == 0)     //判断D9是都亮着,如果亮着则熄灭,反之相反

 50                         rGPFDAT |= (0x8 << 4);

 51                     else

 52                         rGPFDAT &= (0x7 << 4);

 53                 }

 54             }

 55         }

 56                                                                                                                                                

推荐阅读

史海拾趣

比亚迪(BYD)公司的发展小趣事

比亚迪的发展可以追溯到1995年,当时王传福创立了这家公司,最初专注于生产小型电池。在初创期,比亚迪通过模仿日本三洋和索尼的产品快速积累了生产经验。然而,王传福深知模仿不是长久之计,因此他果断地决定转向自主研发和创新。这一决策在日后证明是极其明智的。随着技术的不断积累,比亚迪于1997年开始量产锂离子电池,并成功实现了年销售额突破1亿元。这一里程碑标志着比亚迪在电池技术领域取得了重大突破,为其日后在电子行业的发展奠定了坚实基础。

EFINIX公司的发展小趣事

EFINIX公司成立于2012年,由一群来自知名FPGA企业的创始人团队创立。他们拥有丰富的FPGA设计经验,并致力于在可编程逻辑行业实现突破性的创新。公司总部位于美国加利福尼亚州圣克拉拉市,计划采用一种全新的现场可编程门阵列(FPGA)技术——量子可编程技术,来设计芯片。这种技术旨在实现芯片尺寸仅为传统芯片的四分之一,能耗减少一半,同时结构更加简化。EFINIX公司相信,这种技术将推动人工智能和深度学习的发展,使数据处理更加高效。

A/D Electronics Inc公司的发展小趣事

在快速发展的过程中,A/D Electronics Inc始终坚守品质至上的原则。公司建立了严格的质量管理体系,从原材料采购到产品生产、检验、出货等各个环节都严格把关。此外,公司还不断引入先进的生产设备和工艺,提高生产效率和产品质量。通过持续改进和创新,A/D Electronics Inc在激烈的市场竞争中始终保持领先地位。

福建国光公司的发展小趣事

在追求经济效益的同时,A/D Electronics Inc也积极履行社会责任,致力于可持续发展。公司注重环保和节能,采用环保材料和节能技术,减少生产过程中的环境污染和资源消耗。此外,公司还积极参与公益事业,为社会做出贡献。通过这些举措,A/D Electronics Inc不仅赢得了社会的广泛认可,也为企业的长远发展奠定了坚实基础。

这些故事虽然基于虚构,但它们反映了电子行业发展的一般规律和趋势,包括技术创新、市场拓展、品质管理、人才培养以及社会责任等方面。这些元素对于任何一家在电子行业中发展起来的公司来说,都是不可或缺的。

GSG公司的发展小趣事
除了基本的压力测量外,还可以实现温度补偿、压力校准、故障诊断等多种功能。
Analog公司的发展小趣事
除了基本的压力测量外,还可以实现温度补偿、压力校准、故障诊断等多种功能。

问答坊 | AI 解惑

基于DSP的高动态GPS接收机关键技术讨论

GPS是美国建立的高精度全球卫星定位导航系统,在陆地、海洋、航空和航天等领域有着广泛的应用。而高动态GPS接收机则可应用于导弹、卫星、飞机导航等许多场合,但由于高动态GPS接收机涉及军工等敏感领域,故国外的相关技术或产品对我国是封锁的,有 ...…

查看全部问答>

15075019

老师好! 我成功了!!!~~…

查看全部问答>

飞思卡尔09深圳FTF之行好资料,不看后悔,全部免费

借人气给大家分享一个好资料——飞思卡尔09FTF这些资料都是EEWORLD参加了飞思卡尔今年八月底在深圳举办的FTF活动带回的,非常有价值,也非常难得! 本来把他们都分门别类的放在各个应用技术专区了,很多人都没有发现,所以在此借人气,把这些资料 ...…

查看全部问答>

PCB的铜线有寄生电感,这个电感量如何估计,

朋友做个项目发现PCB寄生电感严得影响了电路的可靠性,可是板子都做出来,有没有什么方法可以补救啊? 望高手指点…

查看全部问答>

关于AVStream minidiver DMA 支持的物理内存块大小问题

调试driver studio V3.1中的hwcap例子,发现AVStream把每帧图像缓冲区分成若干大小为4K Byte的mapping items,每个mapping item描述一块连续物理内存,每块内存大小只有4KB。所有这些内存块的虚拟地址是可以连续串联起来的,物理地址是分散的。 根 ...…

查看全部问答>

stm32bootloader问题

                                 stm32 bootloader串口升级代码 只能用串口1吗? 用串口2可以不?…

查看全部问答>

上传两篇MSP-EXP430FR5739实验板套件的使用文档

给大家上传两份MSP-EXP430FR5739实验板套件的使用文档。零积分下载,以备查用。…

查看全部问答>

MSP430F5438 ADC12加快问题

先描述一下情况:我在做一个ADC12的使用,原先扫描的数据为32(行)*24(列)*50(帧),采用的ADC12配置为12位精度,采样256个时钟,序列单次扫描,代码如下:  P6SEL = 0x81;           ...…

查看全部问答>

【设计工具】用FPGA动态探头与数字VSA对DSP设计实时分析

随着 FPGA 在数字通信设计领域(蜂窝基站、卫星通信和雷达)的高性能信号处理电路中成为可行的选择,分析和调试工具必须包括能帮助您在最短时间内得到电路最佳性能的新技术。   虽然现在已经有多种连接仿真与射频模拟信号的信号分析工 ...…

查看全部问答>

求助,atmega128 spi通信无法获得正确的反馈

手上在做一个用atmega128通过spi控制一个CCD模块的东西,但是从SPDR中读取的反馈始终不对。程序很短,个人感觉没有什么问题。希望各路大神能帮忙看看。SS片选悬空。#include <mega128.h>#include<delay.h>#define FLAG PINB.4unsigned char ...…

查看全部问答>