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

S3C2440-按键

哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处

http://blog.csdn.net/woshixingaaa/archive/2010/12/14/6075129.aspx

使用按键控制跑马灯。扫描哪个按键被按下有两种方式。一个是查询扫描,一个是中断扫描。查询扫描就是不断轮询哪个引脚变成低电平了。中断扫描主要通过中断方式实现。

image

查询扫描程序:

#define rGPFCON (*(volatile unsigned *)0x56000050) #define rGPFDAT (*(volatile unsigned *)0x56000054) #define rGPFUP (*(volatile unsigned *)0x56000058) #define rGPBCON (*(volatile unsigned *)0x56000010) #define rGPBDAT (*(volatile unsigned *)0x56000014) #define rGPBUP (*(volatile unsigned *)0x56000018) int KeyMain(){ void Delay(unsigned int x); unsigned char ledtab[]={0xf7,0xef,0xdf,0xbf}; unsigned int t; rGPBCON = 0xffc3fc; //0,2 为输入,3,4,5,6为输出 rGPBDAT = 0x7fe; rGPFCON = 0xd54c; //5,6为输入 rGPFDAT = 0xff; rGPBUP &= 0xf9f; rGPFUP &= 0x82; while(1){ while(((rGPBDAT & 0x7ff) == 0x7fe) && ((rGPFDAT & 0xff) == 0xff)); //不断轮询,如果找到往下执行,看是那个被按下 if((rGPBDAT & (0x1<<5)) == 0){ rGPFDAT = ledtab[0]; Delay(70); } if((rGPBDAT & (0x1<<6)) == 0){ //取出rGPBDAT的第6位,看是不是0 rGPFDAT = ledtab[1]; Delay(70); } if((rGPFDAT & (0x1<<0)) == 0){ rGPFDAT = ledtab[2]; Delay(70); } if((rGPFDAT & (0x1<<2)) == 0){ rGPFDAT = ledtab[3]; Delay(70); } rGPFDAT = 0xff; //恢复,以便重新响应按键 } } void Delay(unsigned int x){ unsigned int i, j, k; for(i =0; i <= x; i++) for(j = 0; j <= 0xff; j++) for(k = 0; k <= 0xff; k++) ; }

中断扫描程序:

#define rGPFCON (*(volatile unsigned *)0x56000050) #define rGPFDAT (*(volatile unsigned *)0x56000054) #define rGPFUP (*(volatile unsigned *)0x56000058) #define SRCPND (*(volatile unsigned *)0x4a000000) #define INTPND (*(volatile unsigned *)0x4a000010) #define INTMSK (*(volatile unsigned *)0x4a000008) #define _ISR_STARTADDRESS 0x33ffff00 #define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x20)) #define pISR_EINT2 (*(unsigned *)(_ISR_STARTADDRESS+0x28)) #define U32 unsigned int void delay(U32 x){ int i,j,k; for(i = 0; i < x; i++) for(j = 0; j < 0xff; j++) for(k = 0; k < 0xff; k++) ; } void __irq EINT0_ISR(void){ SRCPND |= 1; //SRCPND 通过写入数据清零,如果不清零,会反复进行请求 INTPND |= 1; //INDPND 通过置1清零 rGPFDAT = 0xf7; delay(1000); rGPFDAT = 0xff; delay(1000); } void __irq EINT2_ISR(void){ //使用__irq这个关键字定义终端服务例程,这样系统会自动为我们保留一些变量,并能在中断处理完后正确的返回 SRCPND |= 1<<2; INTPND |= 1<<2; rGPFDAT = 0xef; delay(1000); rGPFDAT = 0xff; delay(1000); } int Main(){ rGPFCON &= 0xfc0c; //0 2 3 4 rGPFCON |= (1<<1)|(1<<5)|(1<<6)|(1<<8); rGPFUP = 0xe2; SRCPND |= (1<<0)|(1<<2); INTPND |= (1<<0)|(1<<2); INTMSK &= (~(0x1<<0)) & (~(0x1<<2)); //开中断 pISR_EINT0 = (U32)EINT0_ISR; //给中断服务例程入口地址 pISR_EINT2 = (U32)EINT2_ISR; while(1); return 0; }

相关文章:

  • 内存分类
  • java第二天(关键字、常量、进制等问题)
  • S3C2440-SDRAM
  • css布局模型
  • 延长笔记本电脑寿命的四个简单方法
  • 用 PHP 读取文件的正确方法
  • 如何开启Centos6.4系统的SSH服务
  • myEclipse和eclipse修改或复制项目名称后-更新部署名称
  • 编译静态expect现undefined reference to `openpty' 错误解决方法
  • css布局
  • [分类整理I]微软等100题系列V0.1版:c/c++基础面试题集锦
  • iOS项目开发中的知识点与问题收集整理②(Part 二)
  • [分类整理II]微软等100题系列V0.1版:链表面试题集锦
  • 网游定位人群应当有底线!
  • iOS进阶学习笔记
  • CentOS 7 防火墙操作
  • Fabric架构演变之路
  • HomeBrew常规使用教程
  • httpie使用详解
  • javascript 哈希表
  • js对象的深浅拷贝
  • Laravel核心解读--Facades
  • Redux系列x:源码分析
  • web标准化(下)
  • windows下mongoDB的环境配置
  • 阿里云购买磁盘后挂载
  • 工作中总结前端开发流程--vue项目
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 警报:线上事故之CountDownLatch的威力
  • 前嗅ForeSpider中数据浏览界面介绍
  • 我看到的前端
  • 鱼骨图 - 如何绘制?
  • 白色的风信子
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • #if 1...#endif
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (二)PySpark3:SparkSQL编程
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (转) Android中ViewStub组件使用
  • (转)EOS中账户、钱包和密钥的关系
  • (转)菜鸟学数据库(三)——存储过程
  • .chm格式文件如何阅读
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .Net Remoting常用部署结构
  • .net打印*三角形
  • .NET关于 跳过SSL中遇到的问题
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @ModelAttribute 注解