历史上的今天
返回首页

历史上的今天

今天是:2024年09月16日(星期一)

2019年09月16日 | 按键-LED

2019-09-16 来源:eefocus

利用查询IO口的方式实现按键控制LED‘灯的亮灭

#include "s3c24xx.h"

 

#define LED_ON 0

#define LED_OFF 1

 

#define KEY1_POS (0)//按键1在IO端口的位置,此处为GPF0端口,则值为0

 

#define KEY2_POS (2)//按键2在IO端口的位置,此处为GPF2端口,则值为

#define KEY3_POS (3)//GPG3   EINT11

 

#define LED1_POS (1<<4)//LED1在IO端口的位置,此处为GPF4端口,则值为4

#define LED2_POS (1<<5)//LED2在IO端口的位置,此处为GPF5端口,则值为

#define LED3_POS (1<<6)     //GPF6

 

 

 

//软件关系,与硬件无关 buffe

#define OFS_KEY1 (0)//按键1的状态保存在变量中的位置,此处为保存在变量的第0位

#define OFS_KEY2 (1)// 

#define OFS_KEY3 (2)

 

#define GPF4_out (1<<(4*2))//设置GPFCON的第8,9位,即设置GPF4位输出

#define GPF5_out (1<<(5*2))//设置GPFCON的第10,11位,即设置GPF5位输出

#define GPF6_out (1<<(6*2))//设置GPFCON的第12,13位,即设置GPF6位输出

#define GPF7_out (1<<(7*2))

 

#define hrdReadKey1 ((GPFDAT>>KEY1_POS)&0X01)//读取按键1的状态 

#define hrdReadKey2 ((GPFDAT>>KEY2_POS)&0X01)//读取按键2的状态 

#define hrdReadKey3        ((GPGDAT>>KEY3_POS)&0X01)//读取按键2的状态

 

 

#define hrdLed1On (GPFDAT &= (~LED1_POS))//使GPF4输出0

#define hrdLed1Off (GPFDAT |= (LED1_POS))//使GPF4输出1

#define hrdLed2On (GPFDAT &= (~LED2_POS))//使GPF5输出0

#define hrdLed2Off (GPFDAT |= (LED2_POS))//使GPF5输出1

#define hrdLed3On (GPGDAT &= (~LED3_POS))//使GPG6输出0

#define hrdLed3Off (GPGDAT |= (LED3_POS))//使GPG6输出1

 

 

 

typedef union

{

unsigned long byte;

struct

{

unsigned long key1 :1;

unsigned long key2 :1;

unsigned long key3 :1;

unsigned long notused :5;

}bits;

}mmiFlag_t;

 

mmiFlag_t mmiFlag;

 

#define mmiFlag_Key1 mmiFlag.bits.key1  //判断按键按下后是否为首次处理

 

#define mmiFlag_Key2 mmiFlag.bits.key2  //判断按键按下后是否为首次处理

#define mmiFlag_Key3 mmiFlag.bits.key3  //判断按键按下后是否为首次处理

 

typedef union

{

unsigned long byte;

struct

{

unsigned long led1 :1;

unsigned long led2 :1;

unsigned long led3 :1;

unsigned long notused :5;

}bits;

}ledStatus_t;

ledStatus_t ledStatus;

#define led1Status    ledStatus.bits.led1

#define led2Status    ledStatus.bits.led2

#define led3Status ledStatus.bits.led3

 

 

 

 

volatile unsigned long dgtInBuf=1;//保存开关量输入状态

volatile unsigned long dgtInPre;//预存存开关输入状态

volatile unsigned long dgtCount;//开关量输入的延迟计数

 

 

 

 

 

 

 

//初始化IO口

void ioInitialize_IO(void)

{

GPFCON |= GPF4_out;    // 设置GPF4,GPF5,GPF6为输出口, 位[9:8]=0b01

GPFCON &=(~GPF5_out);

GPFCON |= GPF5_out;

GPFCON |= GPF6_out;  

  GPFDAT = 0x00000000;    // GPF4输出0,LED1点亮

}

 

 

 

 

 

//刷新IO口,在此处做读取或者写IO端口操作

void ioRefresh_IO(void)

{

unsigned long buf=0;

if(hrdReadKey1==0)//读取按键1的输入状态

buf |= (1< else if(hrdReadKey2==0)

buf |=  (1< else if(hrdReadKey3==0)

buf |=  (1< dgtInBuf = buf;//将读取到的按键状态保存到dgtInBuf中

}

/*延迟*/

void wait(unsigned long dly)

{

for(;dly>0;dly--);

}

/*

    *******************************按键处理函数*****************************************

    利用查询  IO口的方式实现,不是中断

*/

void mmiProcess_Key1(void)

{

//mmiFlag_Key1判断按键是否为首次按下,直到释放,才判断下一次的按下与否

if((dgtInBuf&(1< {

mmiFlag_Key1 = 1;//标志位设为1,防止按键未释放,再次进入此判断体

if(led1Status==0)//LED灯状态翻转

{

led1Status = 1;

hrdLed1Off;

}

else

{

led1Status = 0;

hrdLed1On;

}

}

else if((dgtInBuf&(1< {

mmiFlag_Key1 = 0;//标志位设为0,等待下次按键按下

}

}

 

void mmiProcess_Key2(void)

{

//mmiFlag_Key2判断按键是否为首次按下,直到释放,才判断下一次的按下与否

if((dgtInBuf&(1< {

mmiFlag_Key2 = 1;//标志位设为1,防止按键未释放,再次进入此判断体

if(led2Status==0)//LED灯状态翻转

{

led2Status = 1;

hrdLed2Off;

}

else

{

led2Status = 0;

hrdLed2On;

}

}

else if((dgtInBuf&(1< {

mmiFlag_Key2= 0;//标志位设为0,等待下次按键按下

}

}

 

 

void mmiProcess_Key3(void)

{

//mmiFlag_Key3判断按键是否为首次按下,直到释放,才判断下一次的按下与否

if((dgtInBuf&(1< {

mmiFlag_Key3 = 1;//标志位设为1,防止按键未释放,再次进入此判断体

if(led3Status==0)//LED灯状态翻转

{

led3Status = 1;

hrdLed3Off;

}

else

{

led3Status = 0;

hrdLed3On;

}

}

else if((dgtInBuf&(1< {

mmiFlag_Key3= 0;//标志位设为0,等待下次按键按下

}

}

 

 

 

 

 

 

 

 

 

 

void mmiHandle_MMI(void)

{

if(dgtInBuf!=dgtInPre)//判断按键输入状态是否与上一次一致

{

dgtInPre = dgtInBuf;//将此次状态赋值给Pre变量

dgtCount = 0;//计数清0

}

else//如果按键输入状态与上一次一致

{

dgtCount++;//计数加1

if(dgtCount>=5)//做了5*1ms=5ms的延迟,连续5次状态一致,则认为此次输入为有效输入

{

dgtCount = 0;

mmiProcess_Key1();

mmiProcess_Key2();

mmiProcess_Key3();

}

}

}

int main()

{

ioInitialize_IO();

for(;;)

{

wait(1000);//  1ms的延迟

ioRefresh_IO();

mmiHandle_MMI();

}

  return 0;

}

推荐阅读

史海拾趣

COMPUTAR公司的发展小趣事

COMPUTAR公司的前身是日本CBC株式会社,成立于1925年,总部设立在繁华的东京。自创立之初,CBC便致力于光学技术的研究与应用,为后续的镜头制造奠定了坚实的基础。在随后的几十年里,CBC不断积累技术经验,逐步在光学领域建立起自己的声誉。

Geo Semiconductor Inc公司的发展小趣事
针对CPU等发热量大的元件,增加散热片、风扇等散热措施,确保元件在正常工作温度范围内运行。
C&D公司的发展小趣事

为了保持技术领先地位,C&D公司积极与高校、科研机构等开展产学研合作。通过与这些机构的紧密合作,C&D公司不断引进新技术、新工艺和新材料,推动产品的持续创新。同时,公司还鼓励员工参与各种技术创新活动,激发员工的创新热情,为公司的持续发展注入新的活力。

A/D Electronics Inc公司的发展小趣事

随着产品线的不断丰富,A/D Electronics Inc开始积极拓展国内外市场。公司通过与全球知名电子品牌建立战略合作关系,成功将产品打入国际市场。同时,公司还积极参加国际电子展会,展示其最新技术成果和产品,进一步提升了品牌知名度和市场影响力。

Comtech AHA Corp公司的发展小趣事

在电子行业快速发展的背景下,Comtech AHA Corp敏锐地洞察到了物联网、5G等新兴领域的市场潜力。公司及时调整战略方向,加大在这些领域的研发投入,推出了一系列符合市场需求的新产品。凭借精准的市场定位和优质的产品质量,Comtech AHA Corp成功抓住了市场机遇,实现了业务的快速增长。

DELTA公司的发展小趣事

面对全球能源危机和环保意识的提高,Delta公司敏锐地捕捉到了能源管理市场的巨大潜力。于是,公司开始积极拓展能源管理业务,通过系统集成与解决方案,帮助客户提升效能、降低运营成本与资本支出。Delta的能源管理业务涵盖了工业自动化、太阳能、风能、车用电子与通讯电源等多个领域,为全球客户提供了全方位的能源管理解决方案。

问答坊 | AI 解惑

如何正确选用微波无线监控系统?

如何正确选用微波无线监控系统? 随着现代技术突飞猛进的发展,微波无线图像、语音传输系统被广泛应用于广播电视、公安消防、大型住宅区、停车场、重点保护区、库区及水下作业等场所。因其中间无需架设线缆,发射主机和接收机体积小,工作电流小 ...…

查看全部问答>

天祥老师arm视频

ARM视频文件 http://www.namipan.com/d/98e9cc219f47a50b97c114bf104511a47cb4d0b700b4c404 http://www.namipan.com/d/575b6eda34b81d94e36dedd069d9eb6572a2d46300b4c404 http://www.namipan.com/d/223543cf15d8c088e4016c70a367da0c8b7e98fa00 ...…

查看全部问答>

bts4880r 功能

哪里可以找到这样的资料介绍啊,汉语版本…

查看全部问答>

请求帮助

那位高手可以说一下计算机机与单片机之间的通讯原理?还有就是单片机的工作原理?谢谢了!…

查看全部问答>

各位大侠,请给兄弟我指条明路吧.

在下,混杀在软件行业七年左右,以c/c++为主,多半在winnt/linux/solaris上做开发. 由于行业竟急日趋激烈,小弟我打算转行做硬件. 我给自已的定位是,操作系统,电子电路.这方面. 请问大家,我该如何学习.…

查看全部问答>

团购的Maple收到,初感受……

ssawee的maple收到了。很欣赏Arduino的设计理念,的确是把开发的注意力移到了逻辑上。不过Maple的IDE功能有点弱,没有引用查找也没有自动完成呵呵。在公司的WinXP上用的时候很顺利,可以下载代码到Flash或者RAM中。家里的Win7驱动有点搞,每次重启 ...…

查看全部问答>

传感器实用电路150例(强鉴)

本帖最后由 paulhyde 于 2014-9-15 03:38 编辑 是本书,但字不是非常清晰,有需要的朋友可以下来看看  …

查看全部问答>

WinCE6.0流驱动VirtualCopy映射失败

我在WinCE6.0下写流驱动用到VirtualAlloc与VirtualCopy函数,VirtualCopy运行出错了,GetLastError返回值为87,是参数错误,难道VirtualCopy在驱动里也不能用吗?请大虾指点一下!DWORD GPI_Init(LPCTSTR pContext){  DWORD GPIOSuccess=1;&nbs ...…

查看全部问答>

LaunchPad制作的遥控LED台灯完成

小弟刚刚开始学习MSP430,前段时间有幸团购一块LaunchPad开发板,最近拿出来做了一个遥控的LED灯 我选用的主控芯片是G2231;驱动芯片是TI申请的5917,设计电流档位15个;遥控本来想用红外,可惜能理有限,最后采用模块 想拍个视频给大家,不太会 ...…

查看全部问答>

U-boot移植心得《二》

U-boot移植心得《二》 下面我开始分析start.S,在分析之前,我们要了解,u-boot引导linux加载的过程分为2个阶段,第一个阶段的终极目的就是设置好各种硬件环境,将代码从nor flash或NAND flash中拷贝到外部RAM中,然后跳转到C函数中去。第二阶段 ...…

查看全部问答>