s3c2440学习之路-005 轮训模式读取key(按键)

发布者:快乐舞蹈最新更新时间:2021-09-09 来源: eefocus关键字:s3c2440  按键 手机看文章 扫描二维码
随时随地手机看文章

硬件平台:jz2440

软件平台:Ubuntu16.04 arm-linux-gcc-3.4.5

源码位置: https://github.com/lian494362816/C/tree/master/2440/006_key


1.原理分析

按键是常用的电子元器件,去读按键的方法主要有2种

1)轮训方式,就是需要不断的去读取按键的数值

2)中断方式,通过外部中断来实现,只有当按键 按下/松开 时才会触发,不需要不断的去读取按键的值

中断的方式配置比较复杂,本篇博客就先讲通过轮训的方式读取按键的值。


硬件原理很简单,从电源正极到地中间串联1个电阻和1个按键开关,然后2440的某个pin脚在连接上去,通过去读pin脚的电平来获取按键的数值。

当按键未按下时,读取到的就是高电平,2440获取到的就是1

当按键按下时,读取到的就是地电平,2440获取到的就是0

在这里插入图片描述

jz2440的原理图可能看上去有不同,因为分成了2个部分,1个是电阻上拉部分,1个是按键接地部分,不过最后组合起来就是上面那张图片的效果。这里有4按键,不过这次只用其中的3个。

EINT0–GPF0

EINT2–GPF2

EINT11–GPG3


jz2440按键原理图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.主要流程

2440的GPIO pin脚有不同的功能,不过一般GPIO pin脚有3种模式,输入模式、输出模式、特殊功能模式。


输出模式和输出模式好理解,特殊功能模式则是这个pin脚的特殊功能,每个pin脚都不一样。


如当做外部中断、当做LCD控制引脚等等。如要需要读取按键的数值,当然就需要配置成输入模式了。 这里只配置3个按键,因为开发板上刚好有3个led灯,可以通过led的亮灭来显示按键的状态


1)将GPF0,GPF2, GPG3 设置成输入模式, 通过GPFCON和GPGCON来控制

2)读取GPF0, GPF2,GPG3的数值。GPF0,GPF2的数值通过读取GPFDAT的第0,第2位来确定。GPG3 的数值通过去读GPGDAT的第3位来确定

3)通过死循环,不断的读取GPFDAT和GPGDAT的数值来判断按键状态

4)若按键按下,则led亮,若按键未按下,则led灭

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3. 源码

key.c


/*

Input =b00

EINT0   GPF0 [1:0]

EINT2   GPF2 [5:4]

EINT11 GPG3 [7:6]

*/

int key_init(void)

{

    GPFCON &= ~(0x3 << 0);

    GPFCON &= ~(0x3 << 4);

    GPGCON &= ~(0x3 << 6);

      

    return 0;

}


按键的初始化代码很简单,将3个GPIO配置成输出模式即可


key.c


int main(void)

{

    int i = 0;

    int key_gpf_value = 0;

    int key_gpg_value = 0;


    led_init();

    key_init();


    while(1)

    {

        key_gpf_value = GPFDAT;

        key_gpg_value = GPGDAT;


        /* 1 key release */

        if (key_gpf_value & (1 << 0))

        {

            led_off(6);

        }

        else /* 0 key press */

        {

            led_on(6);

        }


        if (key_gpf_value & (1 << 2))

        {

            led_off(5);

        }

        else

        {

            led_on(5);

        }


        if(key_gpg_value & (1 <<3))

        {

            led_off(4);

        }

        else

        {

            led_on(4);

        }

    }



    return 0;

}


主函数先初始化按键和led, 然后通过while(1)不断的去读取GPFDAT,GPGDAT来获取按键的状态。 led_on, led_off 传入4,5,6 分别对应3个不同的led, 这里不做展开介绍。


这个程序只是简单的介绍如何通过轮训的方式来读取按键的值,程序主要存在2个问题:

1)实际使用中,可不能使用while(1)不停的读取按键的数值,这样做很浪费CPU。(不过以前写单片机程序就是这样做的)

2)按键存在消斗的问题,实际的电平波形是会出现来回抖动的,如下图的虚线就是判断电平高地的标准线。因为电平抖动,一次按键 按下/松开 的过程中会出现多次 按下/松开 的结果。因为程序是靠led来显示结果,如果是 按下/松开 通过串口打印结果的话,一次 按下/松开 串口可能会喷出多次不同的结果。 处理的方式就是延迟一会之后再次去读取,如果数值还是一样的话,那就是正确的结果了,否则就是抖动。

在这里插入图片描述

关键字:s3c2440  按键 引用地址:s3c2440学习之路-005 轮训模式读取key(按键)

上一篇:s3c2440学习之路-006 clock的设置
下一篇:s3c2440学习之路-004 区分nand/nor 启动

推荐阅读最新更新时间:2024-11-19 07:09

S3C2440 Linux驱动移植——SPI
1. 配置内核 首先,修改arch/arm/plat-s3c24xx/Kconfig,这一步的目的是为了可以在内核中使能SPI0的配置函数。 修改后的内容如下: config S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13 bool S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13 help SPI GPIO configuration code for BUS0 when connected to GPE11, GPE12 and GPE13. 接着配置内核,首先打开S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13选项,这样编译的时候会将 ar
[单片机]
<font color='red'>S3C2440</font> Linux驱动移植——SPI
S3C2440定时器4中断测试程序
__irq为一个标识,用来表示一个函数是否为中断函数。对于不同的编译器,__irq在函数名中的位置不一样,例如: ADS编译器中 : void __irq IRQ_Eint0(void); Keil编译器中 : void IRQ_Eint0(void) __irq; 但是其意义一样,它所完成的任务是标识该函数为中断函数,在编译器编译是调用此函数时,先保护函数入口现场,然后执行中断函数,函数执行完毕,恢复中断现场,这整个过程不需要用户重新编写代码来完成,由编译器自动完成。因而这也给不具备中断嵌套功能的ARM系统带来了问题,若使用 __irq 时有中断嵌套产生,这现场保护就会混乱。中断嵌套处理可以自己编写中断入口现场保护代码,并不使用
[单片机]
s3c2440 ads程序移植到keil中(二) 初步完成
如果我把参数配置发生改变呢 然后再一次编译 要包错误 如下所示 错误如下 这个错误解决不了 最后查看了网上网友的方法 又可以修改 但是引入了nand文件 最后反正知道了2440init.s文件要修改许多 所以我就不再这里继续整了 浪费时间 直接运用网上网友的东西即可 网友编写的地址 https://blog.csdn.net/hannibaychty/article/details/44873327 从买板子到现在,想想也有2个月啦,开始就想跑裸奔的,可是工程都是在ADS下,win7系统根本不能用,于是就想着怎么在MDK跑,可是MDK上s3c2440的启动文件是不完整的,因此不推荐使用,为此蛋疼聊好长一段时间,查了很
[单片机]
<font color='red'>s3c2440</font> ads程序移植到keil中(二) 初步完成
C51单片机学习笔记(三)——按键对灯、蜂鸣器等器件的控制
1.独立按键的原理 一般的独立按键有四个脚,无论按键是否被按下,1和2总是相通的,3和4也是相通的。当按键按下时,1、2脚与3、4脚接通,按住不放则保持接通状态 按键通断过程的抖动:当按键按下时(释放时)输出的理想波形是标准的矩形波,但是,由于机械触点的弹性作用,闭合时电路不会马上稳定的接通,这中间会出现一连串的抖动,如图所示,抖动时间一般为5~10ms 按键的消抖:按键的抖动会造成一次按下被误认为多次按下,所以要进行消抖处理,一般分为硬件消抖和软件消抖,这里讨论软件消抖,方法是当单片机检测到按键闭合时,采用延时程序产生5~10ms的延时,等抖动消失后,再判断是否处于闭合状态,同理释放的时候,也要给延时。 按键给单片机
[单片机]
C51单片机学习笔记(三)——<font color='red'>按键</font>对灯、蜂鸣器等器件的控制
STM32——按键
一、GPIO工作模式 1、当I/O端口配置为输入时: 输出缓冲器被禁止 施密特触发输入被激活 根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器 对输入数据寄存器的读访问可得到I/O状态 2、当I/O端口被配置为输出时: 输出缓冲器被激活 ─ 开漏模式:输出寄存器上的’0’激活 N-MOS,而输出寄存器上的’1’将端口置于高阻状态(P-MOS 从不被激活)。 ─ 推挽模式:输出寄存器上的’0’激活 N-MOS,而输出寄存器上的’1’将激活 P-MOS。 施密特触发输入被激活 弱上拉和下拉电阻被禁止 出现在I/O脚上的数据在每个APB2时
[单片机]
STM32——<font color='red'>按键</font>
S3C2440裸机------Nor Flash编程_擦写读
1.读NorFlash 我们首先来实现读flash的函数,我们默认每次读取64个字节,然后我们把读取到的内容打印出来,其中前面打印数值,后面打印字符,对于不可见字符用...代替。 void do_read_nor_flash(void) { unsigned int addr; volatile unsigned char *p; int i, j; unsigned char c; unsigned char str ; /* 获得地址 */ printf( Enter the address to read: ); addr = get_uint(); p =
[单片机]
<font color='red'>S3C2440</font>裸机------Nor Flash编程_擦写读
51单片机-按键
矩阵按键: 实现功能按一个键,相应的灯亮。 左边的是普通二极管,右边的是发光二极管。左边的二极管如果想导通,则右边要比左边电平低。如果导通就是按键可以控制灯亮,那么按键左下的都为低电平,系统复位时默认I/O是高电平,所以给垂直方向的I/O拉低,这样如果按键按下,电路导通,那么垂直方向I/O的低电平会把水平方向的拉低。这样就可以通过检测水平方向哪个I/O为低电平来检测哪个键被按下。 开始时对程序的错误想法:被按下的键两边肯定都是低电平,把它们存在一个数组里,然后检测。这样是不对的,用一个临时变量去存P0的值,不会有相同的,开始P0的值为oxff,这样即使按下按键,那么两边的引脚还是高电平,所以失败了。 #
[单片机]
51单片机-<font color='red'>按键</font>
基于ARM处理器S3C2440和Linux的I2C触摸屏设计
  0引言   随着计算机相关技术的发展,ARM嵌入式系统受到越来越广泛的应用,与人们生活的结合也越来越紧密。触摸屏设备因其友善的人机交互性,操作方便灵活,输入速度快,被广泛的应用于这种嵌入式领域中。嵌入式Linux系统具有开发源代码、内核稳定、可裁减性等特点,吸引着众多商业公司和自由软件开发者的目光,成为嵌入式系统领域不可或缺的操作系统之一。触摸屏是一种输入设备,操作简单易学,可靠性高,不占额外的空间,是最常用的便携式系统的输入设备。特别是电阻式触摸屏,它结构简单,成本低,透光效果好,工作环境和外界完全隔离,不怕灰尘和水气,同时具有高解析度、高速传输反应、一次校正、稳定性高、不漂移等特点,因而被广泛用于工业控制领域。   1
[单片机]
小广播
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved