我是新手,正在学习nodejs。我已经将LCD面板和4x4薄膜键盘连接到了树莓派,并使用Node.js进行了编程。我的目标是,每当按下一个键时,它都应该立即显示在LCD面板上;当我按下#时,输入应该停止。
为此,我使用了LCD包https://www.npmjs.com/package/lcd和RPIOhttps://github.com/jperkin/node-rpio。由于我需要不断地检查用户输入,所以我将获取输入的代码放在while循环中,在其中写入打印语句,这就是问题所在。当我按下键盘上的一个键时,LCD面板上没有显示任何字符,但是当我按下#键时,程序退出并且所有字符都显示在LCD面板上。
我编写的代码如下。
任何帮助都将不胜感激。谢谢。
为此,我使用了LCD包https://www.npmjs.com/package/lcd和RPIOhttps://github.com/jperkin/node-rpio。由于我需要不断地检查用户输入,所以我将获取输入的代码放在while循环中,在其中写入打印语句,这就是问题所在。当我按下键盘上的一个键时,LCD面板上没有显示任何字符,但是当我按下#键时,程序退出并且所有字符都显示在LCD面板上。
我编写的代码如下。
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();
});
任何帮助都将不胜感激。谢谢。
while(true)
循环。这就是为什么有事件可以让您注意到按键等操作。请查看rpio.poll()
。由于我不完全理解您的两个for循环以及您在那里使用的rpio.write()
和rpio.read()
,因此无法重写您的代码。 - Thomascol
和row
包含某种位掩码!? - Thomascol[1]
,这可能是问题所在。你的while(true)
使用没有问题,因为你扫描键盘矩阵(行和列)时没有使用任何中断或其他事件源。 - Peter Paul Kieferwhile(true)
来检查(键盘/鼠标)按钮状态一样。它基本上是一个无限循环,永远不会中断以使任何其他JS代码执行;就像lcd.print()
后面的代码似乎堆积起来一样。直到此循环被终止(通过按下#
)。然后刷新堆栈并执行所有(挂起的)异步代码。这正是他描述的问题。 - Thomas