当前位置: 首页 > news >正文

Tiny4412裸机程序,按键检测

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、控制原理说明

先看一下原理图:

202006_vjcW_2888084.png

首先把按键对应的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识别出来,然后执行如下命令:

./sd_fusing.sh /dev/sdb ../../hardware_code/key/led.bin

如下图所示:

202353_8cVG_2888084.png

四、上电实验

这里就不贴图片了,有兴趣的可以自己试验。

转载于:https://my.oschina.net/cht2000/blog/1622260

相关文章:

  • 带给你设计灵感的30个超棒的暗色系网站设计
  • Linux内核中锁机制之内存屏障、读写自旋锁及顺序锁
  • Web Service概述
  • ORACLE PL/SQL编程之 触发器
  • Android开发历程_9(Frame Animation的使用)
  • HTML5与XML的区别
  • 《JavaScript高级程序设计》笔记
  • cocos2d-lua .csb文件动画播放
  • 统计程序总距离
  • Ubuntu批量修改文件后缀名
  • 如何更改silverlight datagrid header的背景
  • 关于使用AJAX获取数据时,由于IE缓存而导致数据不更新,串数据的问题!
  • 定制自己的Unity脚本模板
  • allegro查看线宽的方法
  • 对表的连接的总结
  • 【译】JS基础算法脚本:字符串结尾
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • golang 发送GET和POST示例
  • Hibernate【inverse和cascade属性】知识要点
  • java第三方包学习之lombok
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Puppeteer:浏览器控制器
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 工程优化暨babel升级小记
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 前端
  • 收藏好这篇,别再只说“数据劫持”了
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 学习JavaScript数据结构与算法 — 树
  • 原生 js 实现移动端 Touch 滑动反弹
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​业务双活的数据切换思路设计(下)
  • # C++之functional库用法整理
  • # 数论-逆元
  • #define、const、typedef的差别
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (04)odoo视图操作
  • (1)Nginx简介和安装教程
  • (175)FPGA门控时钟技术
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (安卓)跳转应用市场APP详情页的方式
  • (分布式缓存)Redis持久化
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (一)Thymeleaf用法——Thymeleaf简介
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)用.Net的File控件上传文件的解决方案
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET项目中存在多个web.config文件时的加载顺序
  • .Net中ListT 泛型转成DataTable、DataSet
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • @reference注解_Dubbo配置参考手册之dubbo:reference