TI CC2530 学习笔记-2-NewBit-CC2530-IO-按键
检测按键是否按下有两种方法:
- 扫描(查询):CPU频繁地检测按键对应的IO的电平是否发生变化(假设IO电平被拉低代表按键被按下),如果有按键被按下则延时一段时间(这段时间称为:消抖,一般10ms)再检测一次,还是检测到按键按下就证明按键真的是被按下了,不是抖动。
- 中断:通过配置IO为输入方式并且当IO发生变化时产生中断再进行消抖,与扫描相比,不用占用 CPU太多时间。
TI CC2530 按键-扫描方式
- 配置时钟和IO
/*不配置的话CC2530运行在内部16MHz晶振*/
CLKCONCMD &= ~0x47; //选择外部32MHZ时钟, 不分频
while( (CLKCONSTA & 0x47) != 0x00 ); //切换时钟源后再次等待稳定
P0DIR |= 0x40; //配置IO为输出,P06为LED
P0DIR &= ~0x01; //配置为输入,P01为按键
P0_6 = LED_ACTIVE;//点亮LED, 高电平开灯
- 按键扫描
uint8 halScanKey( void )
{
uint8 key = 0;
if ( KEY_IO == KEY_ACTIVE )//检测按键是否被按下
{
halMcuWaitUs(10000);//延时10ms消抖
if (KEY_IO == KEY_ACTIVE)//按键被按下
{
key |= KV_1;//设置对应键值
}
}
return key; //返回键值
}
- main函数
void main( void )
{
halMcuWaitUs(10000); //等待时间稳定,约10ms
/*不配置的话CC2530运行在内部16MHz晶振*/
CLKCONCMD &= ~0x47; //选择外部32MHZ时钟, 不分频
while( (CLKCONSTA & 0x47) != 0x00 ); //切换时钟源后再次等待稳定
P0DIR |= 0x40; //配置IO为输出,P06为LED
P0DIR &= ~0x01; //配置为输入,P01为按键
P0_6 = LED_ACTIVE;//点亮LED, 高电平开灯
while(1)
{
if (halScanKey() == KV_1)//按键1被按下?
{
P0_6 = !P0_6; //改变灯的状态
while( halScanKey() == KV_1 ); //等待按键释放
}
}
}