“(SKU:RB-05L007)LCD4884液晶搖桿擴展板”的版本間的差異

來自ALSROBOT WiKi
跳轉至: 導航搜索
?產品相關推薦
第1行: 第1行:
 
<br/>
 
<br/>
 
[[文件:faef1.jpg|500px|有框|右]]
 
[[文件:faef1.jpg|500px|有框|右]]
?
 
+
==產品概述==
?
==概述==
+
最新推出的LCD4884 LCD Joystick Shield v2.0 LCD4884液晶屏擴展板是哈爾濱奧松機器人科技有限公司研發(fā)的一款黑白屏液晶擴展板。此擴展板采用Nokia 5110液晶屏為顯示器件。SPI接口,最大限度的節(jié)省I/O資源。特別添加五向搖桿,方便實現(xiàn)搭建人機互動接口,剩余的模擬與數(shù)字接口全部用插針引出,便于安裝其它傳感器與模塊。本品適用于各種開發(fā)板和控制器,例如:Arduino控制器、STC單片機、AVR單片機等。
?
:2012最新推出的LCD4884 LCD Joystick Shield v2.0 LCD4884液晶屏擴展板是哈爾濱奧松機器人科技有限公司研發(fā)的一款黑白屏液晶擴展板。此擴展板采用Nokia 5110液晶屏為顯示器件。SPI接口,最大限度的節(jié)省I/O資源。特別添加五向搖桿,方便實現(xiàn)搭建人機互動接口,剩余的模擬與數(shù)字接口全部用插針引出,便于安裝其它傳感器與模塊。本品適用于各種開發(fā)板和控制器,例如:Arduino控制器、STC單片機、AVR單片機等。
+
 
==規(guī)格參數(shù)==
 
==規(guī)格參數(shù)==
 
# 產品名稱:LCD4884液晶搖桿擴展板
 
# 產品名稱:LCD4884液晶搖桿擴展板
第18行: 第17行:
 
# 選配配件:3PIN傳感器連接線、Arduino 328控制器等
 
# 選配配件:3PIN傳感器連接線、Arduino 328控制器等
 
# 板載資源:
 
# 板載資源:
?
:DIGITAL:8個
+
* 數(shù)字接口:8個
?
:ANALOG IN:5個
+
* 模擬輸入借口:5個
?
:48×84液晶:1個
+
* 48×84液晶:1個
?
:五項搖桿按鍵:1個
+
* 無向搖桿按鍵:1個
?
:系統(tǒng)復位按鍵:1個
+
* 系統(tǒng)復位按鍵:1個
?
 
+
 
==使用方法==
 
==使用方法==
?
:先將本模塊直接插接至Arduino控制器,再用USB線纜將控制器連接到計算機。
+
===使用硬件===
?
==LCD4884 Joystick Shield擴展板的測試==
+
* Carduino UNO 控制器 * 1個
?
:我們使用Arduino控制器來做個測試,要用到硬件設備如下:
+
* LCD4884 Joystick Shield ×1
?
# Arduino控制器 ×1
+
* USB數(shù)據(jù)通信線×1
?
# LCD4884 Joystick Shield ×1
+
===例子程序===
?
# USB數(shù)據(jù)通信線×1
+
程序上傳前需要先[http://pan.baidu.com/s/1gdg4omv 點此下載]LCD4884 程序使用到的庫文件,將它放到Arduino安裝目錄下的libraries文件夾下
?
:先將本模塊直接插接至Arduino控制器,再用USB線纜將控制器連接到計算機。
+
<pre style='color:blue'>
?
:本模塊需要Arduino 1.0或以上版本。需先添加庫文件(注:庫文件在您購買本產品后由客服人員提供,如若丟失可憑購買信息向客服人員索取),添加庫文件后方能編譯,方法是:
+
#include "LCD4884.h"
?
# 將例程文件包中的“LCD4884_Joystick_Shield_Demo”文件夾拷貝至C:\Program Files\arduino-1.0.1\libraries文件夾下
+
#include "Robotbase_bmp.h"
?
# 打開Arduino軟件,F(xiàn)ile>Examples>LCD4884_Joystick_Shield_Demo>LCD4884 Demo
+
#include "Robotbase.h"
?
# 點擊軟件界面上的下載按鈕,片刻后,液晶會有顯示。
+
//keypad debounce parameter
?
:Arduino例程代碼詳見例程文件包。
+
#define DEBOUNCE_MAX 15
?
:例程運行效果如下:
+
#define DEBOUNCE_ON  10
 +
#define DEBOUNCE_OFF 3
 +
#define NUM_KEYS 5
 +
#define NUM_MENU_ITEM 4
 +
// joystick number
 +
#define LEFT_KEY 0
 +
#define CENTER_KEY 1
 +
#define DOWN_KEY 2
 +
#define RIGHT_KEY 3
 +
#define UP_KEY 4
 +
// menu starting points
 +
#define MENU_X 10 // 0-83
 +
#define MENU_Y 1 // 0-5
 +
int analogPin = 1;
 +
int ADC_result = 0;
 +
char qian = 0,bai = 0,shi = 0,ge = 0;
 +
int  adc_key_val[5] ={ 50, 200, 400, 600, 800 };
 +
// debounce counters
 +
byte button_count[NUM_KEYS];
 +
// button status - pressed/released
 +
byte button_status[NUM_KEYS];
 +
// button on flags for user program
 +
byte button_flag[NUM_KEYS];
 +
 
 +
// menu definition
 +
char menu_items[NUM_MENU_ITEM][12]={
 +
  "Temperature",
 +
  " Char Map  ",
 +
  "  Picture  ",
 +
  "  About  "
 +
};
 +
void (*menu_funcs[NUM_MENU_ITEM])(void) = {
 +
  temperature,
 +
  charmap,
 +
  bitmap,
 +
  about
 +
};
 +
char current_menu_item;
 +
void setup()
 +
{
 +
  // setup interrupt-driven keypad arrays 
 +
  // reset button arrays
 +
  for(byte i=0; i<NUM_KEYS; i++){
 +
    button_count[i]=0;
 +
    button_status[i]=0;
 +
    button_flag[i]=0;
 +
  }
 +
  // Setup timer2 -- Prescaler/256
 +
  TCCR2A &= ~((1<<WGM21) | (1<<WGM20));
 +
  TCCR2B &= ~(1<<WGM22);
 +
  TCCR2B = (1<<CS22)|(1<<CS21);     
 +
  ASSR |=(0<<AS2);
 +
  // Use normal mode 
 +
  TCCR2A =0;   
 +
  //Timer2 Overflow Interrupt Enable 
 +
  TIMSK2 |= (0<<OCIE2A);
 +
  TCNT2=0x6;  // counting starts from 6; 
 +
  TIMSK2 = (1<<TOIE2);   
 +
  SREG|=1<<SREG_I;
 +
  lcd.LCD_init();
 +
  lcd.LCD_clear();
 +
  //menu initialization
 +
  init_MENU();
 +
  current_menu_item = 0;
 +
  lcd.backlight(ON);//Turn on the backlight
 +
  //lcd.backlight(OFF); // Turn off the backlight 
 +
}
 +
/* loop */
 +
void loop()
 +
{
 +
  byte i;
 +
  for(i=0; i<NUM_KEYS; i++){
 +
    if(button_flag[i] !=0){
 +
      button_flag[i]=0;  // reset button flag
 +
      switch(i){
 +
      case UP_KEY:
 +
        // current item to normal display
 +
        lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_NORMAL );
 +
        current_menu_item -=1;
 +
        if(current_menu_item <0)  current_menu_item = NUM_MENU_ITEM -1;
 +
        // next item to highlight display
 +
        lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_HIGHLIGHT );
 +
        break;
 +
      case DOWN_KEY:
 +
        // current item to normal display
 +
        lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_NORMAL );
 +
        current_menu_item +=1;
 +
        if(current_menu_item >(NUM_MENU_ITEM-1))  current_menu_item = 0;
 +
        // next item to highlight display
 +
        lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_HIGHLIGHT );
 +
        break;
 +
      case LEFT_KEY:
 +
        init_MENU();
 +
        current_menu_item = 0;
 +
        break; 
 +
      case CENTER_KEY:
 +
        lcd.LCD_clear();
 +
        (*menu_funcs[current_menu_item])();
 +
        lcd.LCD_clear();
 +
        init_MENU();
 +
        current_menu_item = 0;         
 +
        break;
 +
      }
 +
    }
 +
  }
 +
}
 +
/* menu functions */
 +
void init_MENU(void){
 +
  byte i;
 +
  lcd.LCD_clear();
 +
  lcd.LCD_write_string(MENU_X, MENU_Y, menu_items[0], MENU_HIGHLIGHT );
 +
  for (i=1; i<NUM_MENU_ITEM; i++){
 +
    lcd.LCD_write_string(MENU_X, MENU_Y+i, menu_items[i], MENU_NORMAL);
 +
  }
 +
}
 +
// waiting for center key press
 +
void waitfor_OKkey(){
 +
  byte i;
 +
  byte key = 0xFF;
 +
  while (key!= CENTER_KEY){
 +
    for(i=0; i<NUM_KEYS; i++){
 +
      if(button_flag[i] !=0){
 +
        button_flag[i]=0;  // reset button flag
 +
        if(i== CENTER_KEY) key=CENTER_KEY;
 +
      }
 +
    }
 +
  }
 +
}
 +
void temperature()
 +
{
 +
  byte i;
 +
  byte key = 0xFF;
 +
  while (key!= CENTER_KEY){
 +
    ADC_result = analogRead(analogPin);
 +
    qian = ADC_result / 1000;
 +
    bai = ADC_result % 1000 / 100;
 +
    shi = ADC_result % 1000 % 100 / 10;
 +
    ge = ADC_result % 10;
 +
    lcd.LCD_write_char_big(10, 1, '+', MENU_NORMAL);
 +
    lcd.LCD_write_char_big(22, 1, qian-48, MENU_NORMAL);
 +
    lcd.LCD_write_char_big(35, 1, bai-48, MENU_NORMAL);
 +
    lcd.LCD_write_char_big(48, 1, '.', MENU_NORMAL);
 +
    lcd.LCD_write_char_big(51, 1, shi-48, MENU_NORMAL);
 +
    lcd.LCD_write_char_big(64, 1, ge-48, MENU_NORMAL);
 +
    lcd.LCD_write_string(78, 2, "C", MENU_NORMAL);
 +
    lcd.LCD_write_string(36, 5, "OK", MENU_HIGHLIGHT );
 +
    for(i=0; i<NUM_KEYS; i++){
 +
      if(button_flag[i] !=0){
 +
        button_flag[i]=0;  // reset button flag
 +
        if(i== CENTER_KEY) key=CENTER_KEY;
 +
      }
 +
    }
 +
  }
 +
}
 +
void charmap(){
 +
  char i,j;
 +
  for(i=0; i<5; i++){
 +
    for(j=0; j<14; j++){
 +
      lcd.LCD_set_XY(j*6,i);
 +
      lcd.LCD_write_char(i*14+j+32, MENU_NORMAL);
 +
    }
 +
  }
 +
  lcd.LCD_write_string(36, 5, "OK", MENU_HIGHLIGHT );
 +
  waitfor_OKkey(); 
 +
}
 +
void bitmap(){
 +
  lcd.LCD_draw_bmp_pixel(0,0, Robotbase_bmp, 84,24);
 +
  lcd.LCD_write_chinese(12,3, Robotbase_chinese,12,5,0,0);
 +
  lcd.LCD_write_string(36, 5, "OK", MENU_HIGHLIGHT );
 +
  waitfor_OKkey();
 +
}
 +
void about(){
 +
  lcd.LCD_write_string( 0, 0, "LCD4884 Shield", MENU_NORMAL);
 +
  lcd.LCD_write_string( 32, 1, "www", MENU_NORMAL);
 +
  lcd.LCD_write_string( 10, 2, ".robotbase.", MENU_NORMAL);
 +
  lcd.LCD_write_string( 35, 3, "cn", MENU_NORMAL);
 +
  lcd.LCD_write_string(36, 5, "OK", MENU_HIGHLIGHT );
 +
  waitfor_OKkey();
 +
}
 +
// The followinging are interrupt-driven keypad reading functions
 +
// which includes DEBOUNCE ON/OFF mechanism, and continuous pressing detection
 +
// Convert ADC value to key number
 +
char get_key(unsigned int input)
 +
{
 +
  char k;
 +
  for (k = 0; k < NUM_KEYS; k++)
 +
  {
 +
    if (input < adc_key_val[k])
 +
    {
 +
      return k;
 +
    }
 +
  }
 +
  if (k >= NUM_KEYS)
 +
    k = -1;    // No valid key pressed
 +
  return k;
 +
}
 +
void update_adc_key(){
 +
  int adc_key_in;
 +
  char key_in;
 +
  byte i;
 +
  adc_key_in = analogRead(0);
 +
  key_in = get_key(adc_key_in);
 +
  for(i=0; i<NUM_KEYS; i++)
 +
  {
 +
    if(key_in==i)  //one key is pressed
 +
    {
 +
      if(button_count[i]<DEBOUNCE_MAX)
 +
      {
 +
        button_count[i]++;
 +
        if(button_count[i]>DEBOUNCE_ON)
 +
        {
 +
          if(button_status[i] == 0)
 +
          {
 +
            button_flag[i] = 1;
 +
            button_status[i] = 1; //button debounced to 'pressed' status
 +
          }
 +
        }
 +
      }
 +
    }
 +
    else // no button pressed
 +
    {
 +
      if (button_count[i] >0)
 +
      { 
 +
        button_flag[i] = 0;
 +
        button_count[i]--;
 +
        if(button_count[i]<DEBOUNCE_OFF){
 +
          button_status[i]=0;  //button debounced to 'released' status
 +
        }
 +
      }
 +
    }
 +
  }
 +
}
 +
// Timer2 interrupt routine -
 +
// 1/(160000000/256/(256-6)) = 4ms interval
 +
 
 +
ISR(TIMER2_OVF_vect) { 
 +
  TCNT2  = 6;
 +
  update_adc_key();
 +
}
 +
</pre>
 +
===程序效果===
 
[[文件:faef2.jpg|500px|有框|居中]]
 
[[文件:faef2.jpg|500px|有框|居中]]
 
[[文件:faef3.jpg|500px|有框|居中]]
 
[[文件:faef3.jpg|500px|有框|居中]]
第72行: 第310行:
 
[http://www.makerspace.cn/forum.php?mod=viewthread&tid=4009&highlight=lcd4884 LCD4884液晶搖桿擴展板顯示應用]<br/>
 
[http://www.makerspace.cn/forum.php?mod=viewthread&tid=4009&highlight=lcd4884 LCD4884液晶搖桿擴展板顯示應用]<br/>
 
[http://www.makerspace.cn/forum.php?mod=viewthread&tid=3250&highlight=lcd4884 關于arduino的LCD4884的使用]
 
[http://www.makerspace.cn/forum.php?mod=viewthread&tid=3250&highlight=lcd4884 關于arduino的LCD4884的使用]
?
 
 
===相關學習資料===
 
===相關學習資料===
 
[http://v.youku.com/v_show/id_XNDU0MzE5NjIw.html 操作視頻]<br/>
 
[http://v.youku.com/v_show/id_XNDU0MzE5NjIw.html 操作視頻]<br/>
 
[http://www.makerspace.cn/portal.php 奧松機器人技術論壇]
 
[http://www.makerspace.cn/portal.php 奧松機器人技術論壇]

2015年10月29日 (四) 14:17的版本


Faef1.jpg

目錄

產品概述

最新推出的LCD4884 LCD Joystick Shield v2.0 LCD4884液晶屏擴展板是哈爾濱奧松機器人科技有限公司研發(fā)的一款黑白屏液晶擴展板。此擴展板采用Nokia 5110液晶屏為顯示器件。SPI接口,最大限度的節(jié)省I/O資源。特別添加五向搖桿,方便實現(xiàn)搭建人機互動接口,剩余的模擬與數(shù)字接口全部用插針引出,便于安裝其它傳感器與模塊。本品適用于各種開發(fā)板和控制器,例如:Arduino控制器、STC單片機、AVR單片機等。

規(guī)格參數(shù)

  1. 產品名稱:LCD4884液晶搖桿擴展板
  2. 產品貨號:RB-05L007
  3. 工作電壓:DC5V
  4. 產品類型:Arduino擴展板
  5. 制作工藝:FR4雙面噴錫
  6. 人性化設計:具有可人機互動接口“五項搖桿”
  7. 工作溫度:10℃-30℃
  8. 重量:28g
  9. 產品尺寸:69.47mm x 53.34mm x 18mm
  10. 發(fā)貨清單:LCD4884液晶搖桿擴展板×1
  11. 包裝方式:靜電袋密封
  12. 選配配件:3PIN傳感器連接線、Arduino 328控制器等
  13. 板載資源:
  • 數(shù)字接口:8個
  • 模擬輸入借口:5個
  • 48×84液晶:1個
  • 無向搖桿按鍵:1個
  • 系統(tǒng)復位按鍵:1個

使用方法

使用硬件

  • Carduino UNO 控制器 * 1個
  • LCD4884 Joystick Shield ×1
  • USB數(shù)據(jù)通信線×1

例子程序

程序上傳前需要先點此下載LCD4884 程序使用到的庫文件,將它放到Arduino安裝目錄下的libraries文件夾下

#include "LCD4884.h"
#include "Robotbase_bmp.h"
#include "Robotbase.h"
//keypad debounce parameter
#define DEBOUNCE_MAX 15
#define DEBOUNCE_ON  10
#define DEBOUNCE_OFF 3 
#define NUM_KEYS 5
#define NUM_MENU_ITEM	4
// joystick number
#define LEFT_KEY 0
#define CENTER_KEY 1
#define DOWN_KEY 2
#define RIGHT_KEY 3
#define UP_KEY 4
// menu starting points
#define MENU_X	10		// 0-83
#define MENU_Y	1		// 0-5
int analogPin = 1;
int ADC_result = 0;
char qian = 0,bai = 0,shi = 0,ge = 0;
int  adc_key_val[5] ={ 50, 200, 400, 600, 800 };
// debounce counters
byte button_count[NUM_KEYS];
// button status - pressed/released
byte button_status[NUM_KEYS];
// button on flags for user program 
byte button_flag[NUM_KEYS];

// menu definition
char menu_items[NUM_MENU_ITEM][12]={
  "Temperature",
  " Char Map  ",
  "  Picture  ",
  "   About   "	
};
void (*menu_funcs[NUM_MENU_ITEM])(void) = {
  temperature,
  charmap,
  bitmap,
  about
};
char current_menu_item;
void setup()
{
  // setup interrupt-driven keypad arrays  
  // reset button arrays
  for(byte i=0; i<NUM_KEYS; i++){
    button_count[i]=0;
    button_status[i]=0;
    button_flag[i]=0;
  }
  // Setup timer2 -- Prescaler/256
  TCCR2A &= ~((1<<WGM21) | (1<<WGM20));
  TCCR2B &= ~(1<<WGM22);
  TCCR2B = (1<<CS22)|(1<<CS21);      
  ASSR |=(0<<AS2);
  // Use normal mode  
  TCCR2A =0;    
  //Timer2 Overflow Interrupt Enable  
  TIMSK2 |= (0<<OCIE2A);
  TCNT2=0x6;  // counting starts from 6;  
  TIMSK2 = (1<<TOIE2);    
  SREG|=1<<SREG_I;
  lcd.LCD_init();
  lcd.LCD_clear();
  //menu initialization
  init_MENU();
  current_menu_item = 0;	
  lcd.backlight(ON);//Turn on the backlight
  //lcd.backlight(OFF); // Turn off the backlight  
}
/* loop */
void loop()
{
  byte i;
  for(i=0; i<NUM_KEYS; i++){
    if(button_flag[i] !=0){
      button_flag[i]=0;  // reset button flag
      switch(i){
      case UP_KEY:
        // current item to normal display
        lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_NORMAL );
        current_menu_item -=1;
        if(current_menu_item <0)  current_menu_item = NUM_MENU_ITEM -1;
        // next item to highlight display
        lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_HIGHLIGHT );
        break;
      case DOWN_KEY:
        // current item to normal display
        lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_NORMAL );
        current_menu_item +=1;
        if(current_menu_item >(NUM_MENU_ITEM-1))  current_menu_item = 0;
        // next item to highlight display
        lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_HIGHLIGHT );
        break;
      case LEFT_KEY:
        init_MENU();
        current_menu_item = 0;
        break;   
      case CENTER_KEY:
        lcd.LCD_clear();
        (*menu_funcs[current_menu_item])();
        lcd.LCD_clear();
        init_MENU();
        current_menu_item = 0;           
        break;	
      }
    }
  }
}
/* menu functions */
void init_MENU(void){
  byte i;
  lcd.LCD_clear();
  lcd.LCD_write_string(MENU_X, MENU_Y, menu_items[0], MENU_HIGHLIGHT );
  for (i=1; i<NUM_MENU_ITEM; i++){
    lcd.LCD_write_string(MENU_X, MENU_Y+i, menu_items[i], MENU_NORMAL);
  }
}
// waiting for center key press
void waitfor_OKkey(){
  byte i;
  byte key = 0xFF;
  while (key!= CENTER_KEY){
    for(i=0; i<NUM_KEYS; i++){
      if(button_flag[i] !=0){
        button_flag[i]=0;  // reset button flag
        if(i== CENTER_KEY) key=CENTER_KEY;
      }
    }
  }
}
void temperature()
{
  byte i;
  byte key = 0xFF;
  while (key!= CENTER_KEY){
    ADC_result = analogRead(analogPin);
    qian = ADC_result / 1000;
    bai = ADC_result % 1000 / 100;
    shi = ADC_result % 1000 % 100 / 10;
    ge = ADC_result % 10;
    lcd.LCD_write_char_big(10, 1, '+', MENU_NORMAL);
    lcd.LCD_write_char_big(22, 1, qian-48, MENU_NORMAL);
    lcd.LCD_write_char_big(35, 1, bai-48, MENU_NORMAL);
    lcd.LCD_write_char_big(48, 1, '.', MENU_NORMAL);
    lcd.LCD_write_char_big(51, 1, shi-48, MENU_NORMAL);
    lcd.LCD_write_char_big(64, 1, ge-48, MENU_NORMAL);
    lcd.LCD_write_string(78, 2, "C", MENU_NORMAL);
    lcd.LCD_write_string(36, 5, "OK", MENU_HIGHLIGHT );
    for(i=0; i<NUM_KEYS; i++){
      if(button_flag[i] !=0){
        button_flag[i]=0;  // reset button flag
        if(i== CENTER_KEY) key=CENTER_KEY;
      }
    }
  }
}
void charmap(){
  char i,j;
  for(i=0; i<5; i++){
    for(j=0; j<14; j++){
      lcd.LCD_set_XY(j*6,i);
      lcd.LCD_write_char(i*14+j+32, MENU_NORMAL);
    }
  }
  lcd.LCD_write_string(36, 5, "OK", MENU_HIGHLIGHT );
  waitfor_OKkey();   
}
void bitmap(){
  lcd.LCD_draw_bmp_pixel(0,0, Robotbase_bmp, 84,24);
  lcd.LCD_write_chinese(12,3, Robotbase_chinese,12,5,0,0);
  lcd.LCD_write_string(36, 5, "OK", MENU_HIGHLIGHT );
  waitfor_OKkey();
}
void about(){
  lcd.LCD_write_string( 0, 0, "LCD4884 Shield", MENU_NORMAL);
  lcd.LCD_write_string( 32, 1, "www", MENU_NORMAL);
  lcd.LCD_write_string( 10, 2, ".robotbase.", MENU_NORMAL);
  lcd.LCD_write_string( 35, 3, "cn", MENU_NORMAL);
  lcd.LCD_write_string(36, 5, "OK", MENU_HIGHLIGHT );
  waitfor_OKkey();
}
// The followinging are interrupt-driven keypad reading functions
// which includes DEBOUNCE ON/OFF mechanism, and continuous pressing detection
// Convert ADC value to key number
char get_key(unsigned int input)
{
  char k;
  for (k = 0; k < NUM_KEYS; k++)
  {
    if (input < adc_key_val[k])
    {
      return k;
    }
  }
  if (k >= NUM_KEYS)
    k = -1;     // No valid key pressed
  return k;
}
void update_adc_key(){
  int adc_key_in;
  char key_in;
  byte i;
  adc_key_in = analogRead(0);
  key_in = get_key(adc_key_in);
  for(i=0; i<NUM_KEYS; i++)
  {
    if(key_in==i)  //one key is pressed 
    { 
      if(button_count[i]<DEBOUNCE_MAX)
      {
        button_count[i]++;
        if(button_count[i]>DEBOUNCE_ON)
        {
          if(button_status[i] == 0)
          {
            button_flag[i] = 1;
            button_status[i] = 1; //button debounced to 'pressed' status
          }
        }
      }
    }
    else // no button pressed
    {
      if (button_count[i] >0)
      {  
        button_flag[i] = 0;	
        button_count[i]--;
        if(button_count[i]<DEBOUNCE_OFF){
          button_status[i]=0;   //button debounced to 'released' status
        }
      }
    }
  }
}
// Timer2 interrupt routine -
// 1/(160000000/256/(256-6)) = 4ms interval

ISR(TIMER2_OVF_vect) {  
  TCNT2  = 6;
  update_adc_key();
}

程序效果

Faef2.jpg
Faef3.jpg
Faef4.jpg
Faef5.jpg

視頻演示

LCD4884 01.png


















產品相關推薦

Erweima.png

購買地址

LCD4884液晶搖桿擴展板

周邊產品推薦

1602液晶顯示器 藍白屏
Arduino IIC/I2C LCD1602 字符液晶顯示器

相關問題解答

LCD4884液晶搖桿擴展板顯示應用
關于arduino的LCD4884的使用

相關學習資料

操作視頻
奧松機器人技術論壇