3线 7键, 二进制键盘, 程序超级简单, 没用中断,是缺憾!!!
本帖最后由 迷你强 于 2016-5-30 09:52 编辑2016-2-20 日 发表了一个帖子,见: 键盘输入新方法,突发奇想
http://www.geek-workshop.com/thread-26146-1-1.html
现在把程序奉上:
/************************************************************************************************
* 实验 二进制 键盘
*
* 使用 1. Arduino 328P , 2.自己做的 二进制键盘.
*
* 程序功能:用 D13 脚的 LED 灯显示按键的 健值,
* 1 平时LED 灯亮 0.1 秒,熄灭 0.1 秒,无限循环.
* 2 当有按键按下时,健值是多少,就长亮(1秒间隔)几下.
*
* 一个三位二进制数可以表述 0 - 8 的十进制数, 也就是说有 8 个状态,应用于键盘时要去掉一个常态,
* 我把 0 作为常态,剩下数字 1 - 7 就可以刚好对应 1 - 7 号数字键, 方便了编程,节省了程序空间,
* 程序运行速度也快,但是需要轮询键盘. 如果想用 中断 响应键盘也很方便,
*
* 下面是按 Arduino C 方式编的程序,如果直接操作 寄存器, 程序更干练.
**********************************************************************************************/
void setup() {
pinMode(13, OUTPUT); //D13 引脚的 LED , 键盘 按 几号键 就长闪(1秒间隔)几下,然后快闪 .等待键盘响应.
//***************定义 键盘 接口 ***************************
pinMode(9, INPUT); // 安排了键盘的位 0 ,
pinMode(10, INPUT); // 安排了键盘的位 1 ,
pinMode(11, INPUT); // 安排了键盘的位 2 ,
}
void loop() {
//********** 下面是 检测键盘 ****************
int Key_Val ; // 缓存,二进制键盘的健值,
Key_Val =digitalRead(9) + (digitalRead(10)*2)+(digitalRead(11)*4); // 读取键盘,就这一句,不需要键盘驱动库
//Key_Val =digitalRead(9) + (digitalRead(10)*2)+(digitalRead(11)*4); // 再读一次 权当延时,这一句不要也不会出错
//********* 根据键盘的值是几,就 闪几下( 间隔 1 秒 长闪) LED ,***************
for(Key_Val; Key_Val>0; Key_Val--) // key_Val是键盘的值
{
digitalWrite(13, HIGH); // LED 点亮
delay(1000);
digitalWrite(13, LOW); // LED 熄灭
delay(1000);
}
//********** 主程序,这里是快闪 *****************
digitalWrite(13, HIGH); // LED 点亮
delay(100);
digitalWrite(13, LOW); // LED 熄灭
delay(100);
}
这个程序是检验 键盘工作是否正常,但是这个程序是有缺憾的,原因是 主程序与键盘是需要轮询检测的,当主程序没有执行完时,
MCU 是没有时间 检测键盘的,所以键盘不是实时的,下面的程序予以验证.
/************************************************************************************************
* 实验 二进制 键盘
*
* 使用 1. Arduino 328P , 2.自己做的 二进制键盘.
*
* 程序功能:用 D13 脚的 LED 灯显示按键的 健值,
* 1 平时LED 灯亮 0.1 秒,熄灭 0.1 秒,无限循环.
* 2 当有按键按下时,健值是多少,就长亮(1秒)几下.
*
* 一个三位二进制数可以表述 0 - 8 的十进制数, 也就是说有 8 个状态,应用于键盘时要去掉一个常态,
* 我把 0 作为常态,剩下数字 1 - 7 就可以刚好对应 1 - 7 号数字键, 方便了编程,节省了程序空间,
* 程序运行速度也快,因为不需要轮询键盘. 如果想用 中断 响应键盘也很方便,
*
* 下面是按 Arduino C 方式编的程序,如果直接操作 寄存器, 程序更干练.
**********************************************************************************************/
void setup() {
pinMode(13, OUTPUT); //D13 引脚的 LED , 键盘 按 几号键 就长闪(1秒间隔)几下,然后快闪 .等待键盘响应.
//***************定义 键盘 接口 ***************************
pinMode(9, INPUT); // 安排了键盘的位 0 ,
pinMode(10, INPUT); // 安排了键盘的位 1 ,
pinMode(11, INPUT); // 安排了键盘的位 2 ,
}
void loop() {
//********** 下面是 检测键盘 ****************
int Key_Val ; // 缓存,二进制键盘的健值,
Key_Val =digitalRead(9) + (digitalRead(10)*2)+(digitalRead(11)*4); // 读取键盘,就这一句,不需要键盘驱动库
//Key_Val =digitalRead(9) + (digitalRead(10)*2)+(digitalRead(11)*4); // 再读一次 权当延时,这一句不要也不会出错
//********* 根据键盘的值 闪几下( 间隔 1 秒 长闪) LED ,***************
for(Key_Val; Key_Val>0; Key_Val--)
{
digitalWrite(13, HIGH); // LED 点亮
delay(1000);
digitalWrite(13, LOW); // LED 熄灭
delay(1000);
}
//********** 主程序,这里是快闪 *****************
for( int i=0;i<=100;i++) { //这里加了个 FOR 循环, 让他多闪 一段时间,在此期间,是不响应键盘的.
digitalWrite(13, HIGH); // LED 点亮
delay(100);
digitalWrite(13, LOW); // LED 熄灭
delay(100);
}
}
如果不用中断响应键盘, 一般都会有这个问题.
下次 再讲 中断, 想法不错。可是有木有见过跟简单的,用AD来做的,不同的按键对应不同的阻值电压。一个AD的口就解决啦。 PINKWALKMAN 发表于 2016-5-28 08:31 static/image/common/back.gif
想法不错。可是有木有见过跟简单的,用AD来做的,不同的按键对应不同的阻值电压。一个AD的口就解决啦。
看我的 另外一帖, 键盘输入,我只用一个端口
http://www.geek-workshop.com/thread-15272-1-1.html
也有新意 老来疯 发表于 2016-5-28 17:56 static/image/common/back.gif
看我的 另外一帖, 键盘输入,我只用一个端口
http://www.geek-workshop.com/thread-15272-1-1.htm ...
按键达人! 学习学习学习学习
页:
[1]