我是nodejs的新手,我要做的是将LCD面板和4x4膜矩阵键盘连接到Raspberry Pi,并使用Node.js对其进行了编程。我想要实现的是,每当按下一个键时,它应该立即显示在LCD面板上,而当我按下#键时,它应该停止输入。
为此,我使用了LCD https://www.npmjs.com/package/lcd和RPIO https://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();
});
任何帮助将非常感激。谢谢你。
最佳答案
根据上面与@Thomas进行的讨论,我建议您使用while(true)
调用模拟setImediate
循环,在该循环中,您需要矩阵并执行LCD.print。这是因为LCD.print将操作添加到javascript事件队列中。但是事件队列的操作将被阻止,直到实际操作完成为止。只要您处于while(true)
循环中,它就永远不会完成。
因此,您必须结束事件操作并提供事件循环控制,该控制又执行打印命令。但是同时,您必须确保只要不按“#”键,就再次扫描键矩阵。
这是一个例子:
lcd.on('ready', function()
{
lcd.setCursor(0, 0);
setImediate(
function scanMatrix()
{
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]!='#')
{
setImmediate(scanMatrix);
}
while(rpio.read(row[i])==0);
}
}
rpio.write(col[j],rpio.HIGH);
}
});
});
该代码未经测试,因为我在这里没有raspi。它应该给您一个有关如何解决问题的想法。
一个非常酷的;-)解决方案是在 key 矩阵中添加一个微 Controller (MSP430,...)。 MC扫描矩阵并将按键通过SPI或I2C传输到raspi。 ....好吧,好吧,好吧,别打败我;-)
关于javascript - 异步函数在while循环内未产生立即结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41529688/