【发布时间】:2017-01-09 01:45:42
【问题描述】:
我是 nodejs 的新手,我所做的是将 LCD 面板和 4x4 膜矩阵键盘连接到 Raspberry Pi,并使用 Node.js 对其进行了编程。我想要实现的是,无论何时按下一个键,它都应该立即显示在 LCD 面板上,当我按下 # 时,它应该停止输入。
为此,我使用了 LCD https://www.npmjs.com/package/lcd 和 RPIO https://github.com/jperkin/node-rpio 包,因为我必须不断检查用户输入,所以我已将用于接收输入的代码放入 while 循环和其中,我已经编写了 print 语句,并且问题出在哪里。当我在键盘上按一个键时液晶面板不显示任何字符,但当我按#时,程序退出并且所有字符都显示在液晶面板上。
我写的代码如下。
var rpio = require('rpio');
var Lcd = require('lcd'),//This is asynchronous function
lcd = new Lcd({
rs: 18,
e: 23,
data: [24, 17, 27, 22],
cols: 8,
rows: 2
});
var matrix=[[1,2,3,'A'],
[4,5,6,'B'],
[7,8,9,'C'],
['*',0,'#','D']]
var row=[37,35,33,31];
var col=[29,23,40,38];
for (var i = 0; i < 4; i++) {
rpio.open(col[i], rpio.OUTPUT, rpio.HIGH);
}
for (var i = 0; i < 4; i++) {
rpio.open(row[i], rpio.INPUT, rpio.PULL_UP);
}
var code="";
var comeout=0;
lcd.on('ready', function() {
lcd.setCursor(0, 0);
//start of keypad code
while(true){
for (var j = 0; j < 4; j++) {
rpio.write(col[j],rpio.LOW);
for (var i = 0; i < 4; i++) {
if(rpio.read(row[i])==0){
console.log(matrix[i][j]);
lcd.print(matrix[i][j]);
if(matrix[i][j]=='#'){
comeout=1;
break;
}
while(rpio.read(row[i])==0);
}
}
if(comeout==1)
break;
else
rpio.write(col[j],rpio.HIGH);
}
if(comeout==1)
break;
}
//end of keypad code
});
// If ctrl+c is hit, free resources and exit.
process.on('SIGINT', function() {
lcd.clear();
lcd.close();
process.exit();
});
任何帮助将不胜感激。谢谢。
【问题讨论】:
-
我建议将您的代码分解成小块并专注于问题。
-
你不能在 JS 中那样使用
while(true)循环。这就是为什么您有一些事件需要引起注意,例如按键。查看rpio.poll()。由于我不完全了解您的两个 for 循环是如何工作的以及您在那里使用的rpio.write()和rpio.read(),因此我无法重写您的代码 -
我猜
col和row包含某种位掩码!? -
您将引脚 23 用于 LCD 启用和
col[1];也许这就是问题所在。使用while(true)没有任何问题,因为您在不使用任何中断或其他事件源的情况下扫描您的键矩阵(行和列)。 -
@PeterPaulKiefer,是的。这就像在 JS 中使用
while(true)来检查更改(键盘/鼠标)按钮状态。它基本上是一个无限循环,永远不会中断以使任何其他 JS 代码能够执行;就像lcd.print()背后的代码一样,似乎堆积如山。直到此循环终止(按#)。然后刷新堆栈并执行所有(待处理的)异步代码。这正是他所描述的问题。
标签: javascript node.js npm raspberry-pi