2017-01-08 74 views
5

我是nodejs的新手,我所做的是將LCD面板和4x4薄膜矩陣鍵盤連接到Raspberry Pi,並使用Node.js對它們進行編程。我想要實現的是每按一次按鍵,它應該立即顯示在液晶顯示屏上,當我按#時,它應該停止輸入。異步功能在循環內不產生直接結果

爲此,我已經使用的包LCD https://www.npmjs.com/package/lcd和RPIO https://github.com/jperkin/node-rpio,因爲我必須爲用戶輸入的連續檢查我已經把代碼同時輸入,同時循環&裏面我寫了打印語句,這是在問題即將到來。當按下鍵盤上的按鍵時,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(); 
}); 

任何幫助將不勝感激。謝謝。

+0

我會建議打破你的代碼小塊,並專注於問題。 – niry

+0

你不能在JS中使用'while(true)'循環。這就是爲什麼你有事件得到關注按鍵爲例。看看'rpio.poll()'。由於我不完全理解你的兩個for循環是如何工作的,以及你在那裏使用的'rpio.write()'和'rpio.read()',所以我不能重寫你的代碼 – Thomas

+0

我猜' col'和'row'包含某種位掩碼!? – Thomas

回答

0

根據上面關於@Thomas的討論,我建議你模擬while(true)循環與setImediate調用,其中您請求矩陣並執行LCD.print。這是因爲LCD.print將操作添加到javascripts事件隊列中。但事件隊列的操作將被阻止,直到實際操作完成。只要您在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。它應該給你一個如何解決問題的想法。

一個非常酷的解決方案是將一個微控制器(MSP430,...)添加到關鍵矩陣中。 MC掃描矩陣並通過SPI或I2C將按鍵傳輸到raspi。 ....好吧,好的,不要打我;-)