“(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單片機等。 |
? | + | ||
==規(guī)格參數(shù)== | ==規(guī)格參數(shù)== | ||
# 產品名稱:LCD4884液晶搖桿擴展板 | # 產品名稱:LCD4884液晶搖桿擴展板 | ||
第18行: | 第17行: | ||
# 選配配件:3PIN傳感器連接線、Arduino 328控制器等 | # 選配配件:3PIN傳感器連接線、Arduino 328控制器等 | ||
# 板載資源: | # 板載資源: | ||
? | + | * 數(shù)字接口:8個 | |
? | + | * 模擬輸入借口:5個 | |
? | + | * 48×84液晶:1個 | |
? | + | * 無向搖桿按鍵:1個 | |
? | + | * 系統(tǒng)復位按鍵:1個 | |
? | + | ||
==使用方法== | ==使用方法== | ||
? | + | ===使用硬件=== | |
? | ==LCD4884 Joystick | + | * Carduino UNO 控制器 * 1個 |
? | : | + | * LCD4884 Joystick Shield ×1 |
? | + | * USB數(shù)據(jù)通信線×1 | |
? | # LCD4884 | + | ===例子程序=== |
? | # | + | 程序上傳前需要先[http://pan.baidu.com/s/1gdg4omv 點此下載]LCD4884 程序使用到的庫文件,將它放到Arduino安裝目錄下的libraries文件夾下 |
? | : | + | <pre style='color:blue'> |
? | : | + | #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(); | ||
+ | } | ||
+ | </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的版本
目錄 |
產品概述
最新推出的LCD4884 LCD Joystick Shield v2.0 LCD4884液晶屏擴展板是哈爾濱奧松機器人科技有限公司研發(fā)的一款黑白屏液晶擴展板。此擴展板采用Nokia 5110液晶屏為顯示器件。SPI接口,最大限度的節(jié)省I/O資源。特別添加五向搖桿,方便實現(xiàn)搭建人機互動接口,剩余的模擬與數(shù)字接口全部用插針引出,便于安裝其它傳感器與模塊。本品適用于各種開發(fā)板和控制器,例如:Arduino控制器、STC單片機、AVR單片機等。
規(guī)格參數(shù)
- 產品名稱:LCD4884液晶搖桿擴展板
- 產品貨號:RB-05L007
- 工作電壓:DC5V
- 產品類型:Arduino擴展板
- 制作工藝:FR4雙面噴錫
- 人性化設計:具有可人機互動接口“五項搖桿”
- 工作溫度:10℃-30℃
- 重量:28g
- 產品尺寸:69.47mm x 53.34mm x 18mm
- 發(fā)貨清單:LCD4884液晶搖桿擴展板×1
- 包裝方式:靜電袋密封
- 選配配件:3PIN傳感器連接線、Arduino 328控制器等
- 板載資源:
- 數(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(); }
程序效果
視頻演示
產品相關推薦
購買地址
周邊產品推薦
1602液晶顯示器 藍白屏
Arduino IIC/I2C LCD1602 字符液晶顯示器
相關問題解答
LCD4884液晶搖桿擴展板顯示應用
關于arduino的LCD4884的使用