📄 key.c
字号:
/*****************************
key.c
********************************/
#include "key.h"
//按键端口初始化
void keyPort_init(void)
{
//DDRD = 0x33; //PD2\3\6\7定义为输入口
//PORTD |= key2 | key3 | key4; //按键key1\2\3内部上拉电阻使能
DDRD = 0x00; //PD口全部为输入脚
PORTD = 0xfb; //按键key1内部上拉电阻不使能,其余使能
}
//按键检测
unsigned char keyScan(void)
{
if((!(PIND & key4)) || (!(PIND & key3)) ||
(!(PIND & key2)) || ((PIND & key1))) //是否有按键按下
{
Delayms(20);
if((!(PIND & key4)) || (!(PIND & key3)) ||
(!(PIND & key2)) || ((PIND & key1))) //按键消除抖动后,是否有按键按下
{
return 1; //有按键按下,返回1
}
return 0; //干扰信号,返回0
}
return 0; //没有按键按下,返回0
}
//获取按键值
unsigned char KeyValue(void)
{
if(keyScan()) //判断那个按键被按下
{
if(!(PIND & key4)) //按键4被按下,则返回键值4
return 4;
if(!(PIND & key3)) //按键3被按下,则返回键值3
return 3;
if(!(PIND & key2)) //按键2被按下,则返回键值2
return 2;
if(PIND & key1) //按键1被按下,则返回键值1
return 1;
}
return 0; //没有按键按下,返回0
}
//us级别的延时函数
void Delayus(unsigned int lus)
{
while(lus--)
{
_delay_loop_2(4); //_delay_loop_2(1)是延时4个时钟周期,参数为3则延时12
//个时钟周期,本实验用12M晶体,则12个时钟周期为12/12=1us
}
}
//ms级别的延时函数
void Delayms(unsigned int lms)
{
while(lms--)
{
Delayus(1000); //延时1ms
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -