开发环境

 

    • 硬件平台: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

 #include "2410addr.h"

 void delay(long long max)      //延迟函数
{
for(; max > ; max--); } int main(void)
{
int read_value; rGPFCON = rGPFCON & (~(0xff) << ) | (0x55 << ); //设置4个LED灯为输出(GPF4-GPF7输出)
rGPFDAT |= (0xf << ); //先将4个灯都熄灭掉 rGPGCON = ( << ) | ( << ) | ( << ); //GPG3, GPG11 输入,GPG6, GPE11, GPE13输出
rGPECON = ( << ) | ( << ); while()
{
rGPEDAT &= ( << ); //将GPE11置0,同时将GPE13和GPG6置1
rGPEDAT |= ( << );
rGPGDAT |= ( << ); read_value = rGPGDAT & 0x808; //读取GPG11和GPG3的输入值 if((read_value & 0x800) == ) //判断GPG11输入是否为0,以此判断K1键是否按下
{
read_value = 0x800;
delay(); //按键去抖 if((read_value &= rGPGDAT) == )
{
if((rGPFDAT & ( << )) == ) //判断D12是否亮着,如果亮着则熄灭,反之相反
rGPFDAT |= (0x1 << );
else
rGPFDAT &= (0xe << );
}
}
else
{
if((read_value & 0x8) == ) //判断GPG3输入的值是否为0, 以此K4键是否按下
{
read_value = 0x8;
delay(); //按键去抖 if((read_value &= rGPGDAT) == )
{
if((rGPFDAT & (0x8 << )) == ) //判断D9是都亮着,如果亮着则熄灭,反之相反
rGPFDAT |= (0x8 << );
else
rGPFDAT &= (0x7 << );
}
}
} rGPEDAT |= ( << ); //将GPE11和GPE13置1,同时将GPG6置0
rGPEDAT |= ( << );
rGPGDAT &= ( << ); read_value = rGPGDAT & (0x8 << ); //读取GPG11的值 if(read_value == ) //判断GPG11是否输入0,以此判断K2键按下
{
read_value = 0x800;
delay(); //按键去抖 if((read_value &= rGPGDAT) == )
{
if((rGPFDAT & (0x2 << )) == ) //判断D11是否亮着, 如果亮着则熄灭,反之相反
rGPFDAT |= (0x2 << );
else
rGPFDAT &= (0xd << );
}
} rGPEDAT &= ( << ); //将GPE13置0, 同时将GPE11和GPG6置1
rGPEDAT |= ( << );
rGPGDAT |= ( << ); read_value = rGPGDAT & 0x800; //读取GPG11的值 if(read_value == ) //判断GPG11是否为0,以此判断K3键是否按下
{
read_value = 0x800;
delay(); //按键去抖,延迟一段时间 if((read_value &= rGPGDAT) == )
{
if((rGPFDAT & (0x4 << )) == ) //判断D10是否亮着,如果亮着则熄灭,反之相反
rGPFDAT |= (0x4 << );
else
rGPFDAT &= (0xb << );
}
}
} return ;
}

//启动文件start.S

 .text
.global _start
_start:
#define WATCHDOG 0x53000000
ldr r0, =WATCHDOG
mov r1, #
str r1, [r0] ldr sp, =*
bl main loop:
b loop

//Makefile

 led.bin:start.S led_key.c
arm-linux-gcc -c start.S -o start.o
arm-linux-gcc -c led_key.c -o led_key.o
arm-linux-ld -Ttext 0x30008000 start.o led_key.o -o led_key
arm-linux-objcopy -O binary -S led_key led_key.bin
clean:
rm -f *.o led_key.bin

编译

 

OK,生成 led_key.bin文件了


下载执行

 

OK,运行成功!

【ARM】2410裸机系列-按键查询式控制led的更多相关文章

  1. 【ARM】2410裸机系列-流水灯

    开发环境   1.硬件平台:FS2410(s3c2410) 2.主机:Ubuntu 12.04 LTS LED原理图 LED的GPIO的配置 配置GPFCON寄存器,设置GPF4-7为输出 配置GPF ...

  2. 【ARM】2410裸机系列-ADC数模转换

    开发环境   1.硬件平台:FS2410 2.主机:Ubuntu 12.04 ADC寄存器配置       1.初始化ADC(ADCCON) 设置预分频,预分频因子,选择A/D转换通道,并选择正常模式 ...

  3. 【ARM】2410裸机系列-uart串口通信

    开发环境 (1)硬件平台:FS2410 (2)主机:Ubuntu 12.04 FS2410串口的原理图 串口UART寄存器配置   配置TXD0与RXD0(GPH2.GPH3) 设置波特率(UBRDI ...

  4. 【ARM】2410裸机系列-中断处理

    目的 为了更好地掌握S3C2410中断的原理及中断程序的编写. 内容利用S3C2410的外部中断0和外部中断1实现两个按键功能 原理 本次选择的是外部中断EXTINT0和EXTINT11.中断的产生分 ...

  5. [蓝点ZigBee] Zstack 之按键驱动以及控制LED灯 ZigBee/CC2530 视频资料

    这一节主要演示如何在Zstack 下根据板子的不同修改按键驱动,实际演示的时候代码跳动比较多,建议大家除了看视频资料以外,还需要在网上找一下相关资料进一步学习. 视频总览:http://bphero. ...

  6. Spring系列之事务的控制 注解实现+xml实现+事务的隔离等级

    Spring系列之事务的控制 注解实现+xml实现 在前面我写过一篇关于事务的文章,大家可以先去看看那一篇再看这一篇,学习起来会更加得心应手 链接:https://blog.csdn.net/pjh8 ...

  7. ZigBee按键查询实践

    按键查询 即硬件上电后,程序开始运行,当检测到按键按下,触发按键语句,执行按键触发的事件: 玩单片机需要清楚两件东西,第一个是单片机的电路图,另一个则是单片机的寄存器: CC2530是51的升级版,我 ...

  8. 51单片机-独立按键控制led矩阵的左移和右移

    51单片机学习 独立按键 控制led灯光矩阵的左移和右移 开发板采用的是普中的A2学习开发板,具体的代码如下: typedef unsigned int u16; void delay(u16 tim ...

  9. Sql Server来龙去脉系列之三 查询过程跟踪

    我们在读写数据库文件时,当文件被读.写或者出现错误时,这些过程活动都会触发一些运行时事件.从一个用户角度来看,有些时候会关注这些事件,特别是我们调试.审核.服务维护.例如,当数据库错误出现.列数据被更 ...

随机推荐

  1. spring下Junit_jdbc回滚demo

    配置测试类 添加如下内容在class前,用于配置applicationContext.xml文件的位置. @RunWith(SpringJUnit4ClassRunner.class) @Contex ...

  2. ext4文件系统的delalloc选项造成单次写延迟增加的分析

    最近我们的服务进程遇到kill -15后处于Z的状态,变为了僵尸进程,经过/proc/{thread_id}/stack查看其上线程的栈,发现是卡在了fwrite的过程中,而我们的系统中所有文件系统挂 ...

  3. iOS App转让流程详情教程篇

    最近对公司旗下两款app进行转让,正好记一下操作流程: 1.登录iTunes发布网站,找到app,查看App信息下方有个[转让 App] 按钮. 2.点进去,是如下界面,里面包含是否满足转让条件,理论 ...

  4. hihocoder217周 树形DP

    题目链接 一棵树,树中包含TRUE.FALSE.AND.OR四种结点,其中TRUE和FALSE是叶子结点,AND和OR结点的儿子包含多个结点,现在要求执行最少次数的以下操作: 把AND变成OR 把OR ...

  5. Learning to Rank:Point-wise、Pair-wise 和 List-wise区别

    机器学习的 ranking 技术——learning2rank,包括 pointwise.pairwise.listwise 三大类型. [Ref-1]给出的: <Point wise rank ...

  6. 【转】fileno函数与ftruncate函数

      fileno函数与ftruncate函数 2011-10-25 10:03:33 分类: LINUX fileno()函数 功    能:把文件流指针转换成文件描述符相关函数:open, fope ...

  7. php安装 出现Sorry, I cannot run apxs. ***错误解决方法

    # tar zvxf php-5.1.2.tar.gz# cd php-5.1.2# ./configure --prefix=/usr/local/php --with-mysql=/usr/loc ...

  8. 简单几步让CentOS系统时间同步(转)

    在使用CentOS系统的时候,我们可能会遇到时间不准的问题,那我们如何解决这个我问题呢,下面就来教大家一个CentOS系统时间同步的方法,希望大家可以解决自己所存在的疑问. CentOS系统时间同步的 ...

  9. 【C#】C#项目如何获得项目的根目录

    编写程序的时候,经常需要用的项目根目录.自己总结如下 1.取得控制台应用程序的根目录方法     方法1.Environment.CurrentDirectory 取得或设置当前工作目录的完整限定路径 ...

  10. Tomcat之如何使用Nginx进行集群部署

    目录结构: contents structure [+] 1,为什么需要集群 2,如何使用Nginx部署tomcat集群 2.1,下载Nginx 2.2,在同一台电脑上部署多个Tomcat服务器 2. ...