历史上的今天
今天是: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< buf |= (1< buf |= (1< } /*延迟*/ 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; }
上一篇:LCD驱动-JZ2440
下一篇:驱动-按键-中断模式
史海拾趣
|
如何正确选用微波无线监控系统? 随着现代技术突飞猛进的发展,微波无线图像、语音传输系统被广泛应用于广播电视、公安消防、大型住宅区、停车场、重点保护区、库区及水下作业等场所。因其中间无需架设线缆,发射主机和接收机体积小,工作电流小 ...… 查看全部问答> |
|
在下,混杀在软件行业七年左右,以c/c++为主,多半在winnt/linux/solaris上做开发. 由于行业竟急日趋激烈,小弟我打算转行做硬件. 我给自已的定位是,操作系统,电子电路.这方面. 请问大家,我该如何学习.… 查看全部问答> |
|
ssawee的maple收到了。很欣赏Arduino的设计理念,的确是把开发的注意力移到了逻辑上。不过Maple的IDE功能有点弱,没有引用查找也没有自动完成呵呵。在公司的WinXP上用的时候很顺利,可以下载代码到Flash或者RAM中。家里的Win7驱动有点搞,每次重启 ...… 查看全部问答> |
|
我在WinCE6.0下写流驱动用到VirtualAlloc与VirtualCopy函数,VirtualCopy运行出错了,GetLastError返回值为87,是参数错误,难道VirtualCopy在驱动里也不能用吗?请大虾指点一下!DWORD GPI_Init(LPCTSTR pContext){ DWORD GPIOSuccess=1;&nbs ...… 查看全部问答> |
|
小弟刚刚开始学习MSP430,前段时间有幸团购一块LaunchPad开发板,最近拿出来做了一个遥控的LED灯 我选用的主控芯片是G2231;驱动芯片是TI申请的5917,设计电流档位15个;遥控本来想用红外,可惜能理有限,最后采用模块 想拍个视频给大家,不太会 ...… 查看全部问答> |
|
U-boot移植心得《二》 下面我开始分析start.S,在分析之前,我们要了解,u-boot引导linux加载的过程分为2个阶段,第一个阶段的终极目的就是设置好各种硬件环境,将代码从nor flash或NAND flash中拷贝到外部RAM中,然后跳转到C函数中去。第二阶段 ...… 查看全部问答> |




