历史上的今天
今天是:2024年10月14日(星期一)
2018年10月14日 | Exynos4412按键检测(轮询方式)
2018-10-14 来源:eefocus
用的是轮询方式,后面会有中断方式的实现,闲话少说,进入正题,程序由前一个实验Tiny4412之C语言实现流水灯更改而来:
一、控制原理说明
先看一下原理图:

按键原理图
首先把按键对应的GPIO设置为输入模式,修改GPX3CON寄存器(板子不同,可能对应的GPIO管脚不同),通过上图可知当没有按下按键时,对应的GPIO状态为高电平,当有按键被按下时,对应的GPIO变为低,我们在程序一直检测这几个GPIO状态即可;
二、程序说明
其中Start.s文件同上一个实验完全相同;链接脚本key.lds的内容和led.lds完全相同,只把名字改了改;Makefile的内容也大部分一样,也只是改了改里边文件的名字,key.c的文件需要重新编写,代码如下:
====================================================================
// 程序说明
//一上电,4个LED全亮,当某个按键被按下,则对应的LED熄灭(可同时按下多个键)
//对应关系:KEY1-LED1,KEY2-LED2,KEY3-LED3,KEY4-LED4
//按键对应的GPIO
#define GPX3CON (*(volatile unsigned int *)0x11000C60)
#define GPX3DAT (*(volatile unsigned int *)0x11000C64)
//LED对应的GPIO
#define GPM4CON (*(volatile unsigned int *)0x110002E0)
#define GPM4DAT (*(volatile unsigned int *)0x110002E4)
void delay(volatile int time)
{
for(; time > 0; time-- );
}
int main(void)
{
unsigned long tmp = 0;
unsigned char keyValue = 0;
//GPX3_2-GPX3_5 设置为输入功能,用于检测按键引脚的状态
tmp = GPX3CON;
tmp &= ~(0xffff << 8);
GPX3CON = tmp;
// GPM4_0-GPM4_3 设置为输出功能,用于控制LED的亮灭
tmp = GPM4CON;
tmp &= ~0xffff;
tmp |= 0x1111;
GPM4CON = tmp;
while(1)
{
//读按键引脚状态
keyValue = GPX3DAT;
keyValue = (keyValue & (0xf << 2)) >> 2;
if(keyValue != 0xf) //说明有按键被按下,再详细判断是哪个按键被按下
{
delay(1000); //防抖
keyValue = GPX3DAT;
keyValue = (keyValue & (0xf << 2)) >> 2;
GPM4DAT = ~keyValue; //设置LED亮、灭
}
else
{
GPM4DAT = 0x00;
}
}
return 0;
}
====================================================================
其中注释也比较详细,控制原理上边也说得很清楚了,这里就不多说了,有问题可以留言。
三、程序编译及烧写
1.编译
通过FTP或者其他工具将Start.s、Makefile、key.lds 、key.c四个文件上传到服务器上去,输入make命令进行编译将得到key.bin文件。
2.烧写
将SD卡插入电脑,并让VmWare里的Ubuntu识别出来,然后执行如下命令:
1 | sudo ./sd_fusing.sh /dev/sdb ../3_key_scan/key.bin |
如下图所示:

将程序烧到SD卡
四、上电实验

程序运行图一

程序运行图二
上图所示,图一是没有按键被按下,四个LED全都被点亮,图二是有两个键被我同时按下
上一篇:Exynos4412时钟体系分析
史海拾趣
|
为了在保留紧凑砖型模式的同时缩减电源尺寸,电源制造商必须降低砖型模块的高度,并(或)尽量将外部的供电元件移至砖型模块内部。但同时采取上述两种做法却给电源设计者带来了诸多挑战,其中包括:如何处理高功率密度所需的散 ...… 查看全部问答> |
|
RT,平台是2440+wince5.0,现在想在eboot中通过以太网下载映像,在网上找了DM9000中的代码,把iobase修改了下,读取ID正确,然后经过下面配置后: /* set the internal PHY power-on, GPIOs normal */ & ...… 查看全部问答> |
|
在keil uvision3平台下便宜rtx51tny下面的例子程序时总是出现下面的问题,不知道是什么原因,请师兄们帮忙谢谢。 --- Error: can\'t execute \'D:\\Keil\\C51\\BIN\\C51.EXE\'… 查看全部问答> |
|
我用430169的SPI总线与74HC595相连,总共有4片595,它们之间级连. 数据静态显示.从异步串口接收的数据通过SPI口发送给595显示出来. 这中间的过程我不太清楚,尤其是怎么样把四位数据发送给595并显示这部分? 请路过的各位有识之士给小弟解答下!拜托啦 ...… 查看全部问答> |
|
请问有tms320c6747(evmomapl137)的emifa nandflash驱动吗?紧急啊,关系到我的转正工资问题,要我这周搞定。还有三天了。把emifa的手册看了遍,没看出什么名堂,不知道怎么写。 手册里关于nandflash的寄存器只有那几个,没找到可以读写数据的寄存 ...… 查看全部问答> |
|
在使用proteus仿真时,出现timestep too small 的提示,感觉电路挺简单的,麻烦问下,这种问题该怎么解决,调设置的话,具体怎么调呢?… 查看全部问答> |
|
在路由分析过程中涉及到路由表,路由发现表,邻居节点表,RREQ,RREP、RERR。 路由表:包含此条路由下一跳节点地址,路由状态,目的地址。 路由搜索表:在路由表建立过程中存在,应该是用来建立路由 ...… 查看全部问答> |
|
用基于cordic算法写的dds的verilog程序,带modelsim的仿真程序,写这个主要是在做dds时想用cpld来做,但是我的cpld资源太少,只有570个LE,而我又想用12位以上的da,大家懂的,如果刷波表是做不来的,所以就写了这个基于cordic算法的dds,也可以说 ...… 查看全部问答> |




