本帖最后由 迷你强 于 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++) { // [color=Red]这里加了个 FOR 循环, 让他多闪 一段时间[/color],在此期间,是不响应键盘的.
- digitalWrite(13, HIGH); // LED 点亮
- delay(100);
- digitalWrite(13, LOW); // LED 熄灭
- delay(100);
-
- }
- }
复制代码
如果不用中断响应键盘, 一般都会有这个问题.
下次 再讲 中断, |