Test application for the LCD4884. It uses the LCD 4884 from SainSmart / DFRobot, the on board accelerometer and RGB LED.
Dependencies: LCD4884 MMA8451Q mbed
This is the first version.
- I want to add support for a smaller font (like 5x6).
- Update the 5 way read and de-bounce.
It was my first try with MBED on the FRDM KL25Z board and LCD shield.
!!!!!
The shield needs to be modified to work correctly. It has the 5V routed to the 5 way switch so it is more than the 3V threshold for the ADC.
!!!!!
main.cpp@1:0dee51d54fd6, 2013-03-09 (annotated)
- Committer:
- COX
- Date:
- Sat Mar 09 21:13:31 2013 +0000
- Revision:
- 1:0dee51d54fd6
- Parent:
- 0:b06425bd412a
Testing code for the LCD4884 library.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
COX | 0:b06425bd412a | 1 | #include "mbed.h" |
COX | 0:b06425bd412a | 2 | #include "LCD4884.h" |
COX | 0:b06425bd412a | 3 | #include "MMA8451Q.h" |
COX | 0:b06425bd412a | 4 | |
COX | 0:b06425bd412a | 5 | #define MMA8451_I2C_ADDRESS (0x1d<<1) |
COX | 0:b06425bd412a | 6 | #define SERIAL_FREQ 10 |
COX | 0:b06425bd412a | 7 | |
COX | 0:b06425bd412a | 8 | //keypad debounce parameter |
COX | 0:b06425bd412a | 9 | #define DEBOUNCE_MAX 10 |
COX | 0:b06425bd412a | 10 | //#define DEBOUNCE_ON 10 |
COX | 0:b06425bd412a | 11 | //#define DEBOUNCE_OFF 3 |
COX | 0:b06425bd412a | 12 | |
COX | 0:b06425bd412a | 13 | #define NUM_KEYS 5 |
COX | 0:b06425bd412a | 14 | |
COX | 0:b06425bd412a | 15 | #define NUM_MENU_ITEM 6 |
COX | 0:b06425bd412a | 16 | |
COX | 0:b06425bd412a | 17 | // joystick number |
COX | 0:b06425bd412a | 18 | #define LEFT_KEY 0 |
COX | 0:b06425bd412a | 19 | #define CENTER_KEY 1 |
COX | 0:b06425bd412a | 20 | #define DOWN_KEY 2 |
COX | 0:b06425bd412a | 21 | #define RIGHT_KEY 3 |
COX | 0:b06425bd412a | 22 | #define UP_KEY 4 |
COX | 0:b06425bd412a | 23 | |
COX | 0:b06425bd412a | 24 | // menu starting points |
COX | 0:b06425bd412a | 25 | |
COX | 0:b06425bd412a | 26 | #define MENU_X 4 // 0-83 |
COX | 0:b06425bd412a | 27 | #define MENU_Y 0 // 0-5 |
COX | 0:b06425bd412a | 28 | |
COX | 0:b06425bd412a | 29 | /*------------------------------------------------------------------------------ |
COX | 0:b06425bd412a | 30 | ; DFrobot bitmap - size 48x24 pixels, black/white image |
COX | 0:b06425bd412a | 31 | ------------------------------------------------------------------------------*/ |
COX | 0:b06425bd412a | 32 | unsigned char demo_bmp[]= |
COX | 0:b06425bd412a | 33 | |
COX | 0:b06425bd412a | 34 | { |
COX | 0:b06425bd412a | 35 | 0x00,0x00,0x10,0x20,0x20,0x60,0xE0,0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0xF0,0xF0,0xF8,0xF8,0xFC,0xFC,0x3E,0x3E,0x32,0x61,0x00,0x00, |
COX | 0:b06425bd412a | 36 | 0x00,0x00,0x61,0x32,0x3E,0x3E,0xFC,0xFC,0xF8,0xF8,0xF0,0xF0,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xE0,0x60,0x20,0x20,0x10,0x00,0x00, |
COX | 0:b06425bd412a | 37 | |
COX | 0:b06425bd412a | 38 | 0x00,0x00,0x00,0x00,0x00,0x08,0x78,0xF3,0xFB,0xF3,0x1B,0x18,0xE8,0xEC,0xC0,0xC4,0xC0,0xF0,0xE0,0x70,0x73,0xE7,0xFE,0xFE,0xF8,0xFE,0xDE,0x0F,0x0F,0xBF,0xFF,0xEB,0x83,0x06,0x06,0x0F,0x0F,0x1C,0x18,0x20,0x00,0x00, |
COX | 0:b06425bd412a | 39 | 0x00,0x00,0x20,0x18,0x1C,0x0F,0x0F,0x06,0x06,0x83,0xEB,0xFF,0xBF,0x0F,0x0F,0xDE,0xFE,0xF8,0xFE,0xFE,0xE7,0x73,0x70,0xE0,0xF0,0xC0,0xC4,0xC0,0xEC,0xE8,0x18,0x1B,0xF3,0xFB,0xF3,0x78,0x08,0x00,0x00,0x00,0x00,0x00, |
COX | 0:b06425bd412a | 40 | |
COX | 0:b06425bd412a | 41 | 0x00,0x00,0x02,0x03,0x03,0x03,0x03,0x06,0x06,0x0F,0x1F,0x2E,0x68,0xF3,0xE7,0xEF,0xDF,0x9D,0xBC,0xB8,0xB8,0x9C,0xD8,0xE3,0x7F,0x7F,0xFE,0xF0,0xC7,0x87,0x07,0x07,0xFF,0x7E,0x1C,0xFC,0xFC,0xFC,0xFC,0xFE,0xE0,0xF8, |
COX | 0:b06425bd412a | 42 | 0xF8,0xE0,0xFE,0xFC,0xFC,0xFC,0xFC,0x1C,0x7E,0xFF,0x07,0x07,0x87,0xC7,0xF0,0xFE,0x7F,0x7F,0xE3,0xD8,0x9C,0xB8,0xB8,0xBC,0x9D,0xDF,0xEF,0xE7,0xF3,0x68,0x2E,0x1F,0x0F,0x06,0x06,0x03,0x03,0x03,0x03,0x02,0x00,0x00, |
COX | 0:b06425bd412a | 43 | |
COX | 0:b06425bd412a | 44 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x21,0x39,0x1F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0E,0x0E,0x1E,0x1F,0x3F,0x7F,0xFE,0xFC,0xF9,0xF2,0xFE,0xF8,0xE3,0x8F,0xE7,0xCF,0xC7, |
COX | 0:b06425bd412a | 45 | 0xC7,0xCF,0xE7,0x8F,0xE3,0xF8,0xFE,0xF2,0xF9,0xFC,0xFE,0x7F,0x3F,0x1F,0x1E,0x0E,0x0E,0x0F,0x0F,0x0F,0x0F,0x0F,0x1F,0x39,0x21,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
COX | 0:b06425bd412a | 46 | |
COX | 0:b06425bd412a | 47 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xDF,0x3F,0x01,0x03,0x07,0x0F,0x1F,0x3F,0xFF,0xFF, |
COX | 0:b06425bd412a | 48 | 0xFF,0xFF,0x3F,0x1F,0x0F,0x07,0x03,0x01,0x3F,0xDF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 |
COX | 0:b06425bd412a | 49 | }; |
COX | 0:b06425bd412a | 50 | /******************************************************************************/ |
COX | 0:b06425bd412a | 51 | |
COX | 0:b06425bd412a | 52 | |
COX | 0:b06425bd412a | 53 | /*------------------------------------------------------------------------------ |
COX | 0:b06425bd412a | 54 | ; DFrobot chinese - size 12x12 |
COX | 0:b06425bd412a | 55 | ------------------------------------------------------------------------------*/ |
COX | 0:b06425bd412a | 56 | /*unsigned char DFrobot_chinese[]= |
COX | 0:b06425bd412a | 57 | { |
COX | 0:b06425bd412a | 58 | 0x84,0x64,0xFF,0x24,0x44,0xFE,0x02,0x02,0xFF,0x02,0x00,0x00,0x01,0x00,0x07,0x04,0x02,0x01,0x00,0x00,0x07,0x04,0x07,0x00, |
COX | 0:b06425bd412a | 59 | 0xA0,0xAF,0xA9,0xE9,0xAF,0x30,0xAF,0xA9,0xF9,0xAF,0xA0,0x00,0x00,0x07,0x04,0x04,0x07,0x00,0x07,0x04,0x04,0x07,0x00,0x00, |
COX | 0:b06425bd412a | 60 | 0x00,0x00,0x00,0x80,0x60,0x1F,0x60,0x80,0x00,0x00,0x00,0x00,0x04,0x04,0x02,0x01,0x00,0x00,0x00,0x01,0x02,0x04,0x04,0x00, |
COX | 0:b06425bd412a | 61 | 0x22,0x12,0x0A,0xBF,0x6A,0x52,0x4A,0x7F,0xCA,0x12,0x22,0x00,0x04,0x05,0x05,0x04,0x05,0x02,0x02,0x01,0x00,0x00,0x00,0x00, |
COX | 0:b06425bd412a | 62 | 0x00,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,0x03,0x02,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0x04,0x00, |
COX | 0:b06425bd412a | 63 | 0x00,0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 |
COX | 0:b06425bd412a | 64 | };*/ |
COX | 0:b06425bd412a | 65 | |
COX | 0:b06425bd412a | 66 | |
COX | 0:b06425bd412a | 67 | LCD4884 lcd; |
COX | 0:b06425bd412a | 68 | AnalogIn JStick(PTB0); |
COX | 0:b06425bd412a | 69 | Timeout readJStick; |
COX | 0:b06425bd412a | 70 | MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS); |
COX | 0:b06425bd412a | 71 | |
COX | 0:b06425bd412a | 72 | //DigitalOut TestPin1(PTA13); |
COX | 0:b06425bd412a | 73 | //DigitalOut TestPin2(PTD5); |
COX | 0:b06425bd412a | 74 | PwmOut r (LED_RED); |
COX | 0:b06425bd412a | 75 | PwmOut g (LED_GREEN); |
COX | 0:b06425bd412a | 76 | PwmOut b (LED_BLUE); |
COX | 0:b06425bd412a | 77 | |
COX | 0:b06425bd412a | 78 | PwmOut rgb[3] = {PwmOut(LED_RED), PwmOut(LED_GREEN), PwmOut(LED_BLUE)}; |
COX | 0:b06425bd412a | 79 | |
COX | 0:b06425bd412a | 80 | //LEFT_KEY, CENTER_KEY, DOWN_KEY, RIGHT_KEY, UP_KEY |
COX | 0:b06425bd412a | 81 | float adc_key_val[5] ={ |
COX | 0:b06425bd412a | 82 | 0.10, 0.20, 0.40, 0.60, 0.90 }; |
COX | 0:b06425bd412a | 83 | |
COX | 0:b06425bd412a | 84 | float lcdBrightness = 1; |
COX | 0:b06425bd412a | 85 | float JStickReadSpeed = 0.015; |
COX | 0:b06425bd412a | 86 | float x, y, z; |
COX | 0:b06425bd412a | 87 | |
COX | 0:b06425bd412a | 88 | // debounce counters |
COX | 0:b06425bd412a | 89 | char button_count[NUM_KEYS]; |
COX | 0:b06425bd412a | 90 | // button status - pressed/released |
COX | 0:b06425bd412a | 91 | char button_status[NUM_KEYS]; |
COX | 0:b06425bd412a | 92 | |
COX | 0:b06425bd412a | 93 | // menu definition |
COX | 0:b06425bd412a | 94 | char menu_items[NUM_MENU_ITEM][14]={ |
COX | 0:b06425bd412a | 95 | "BRIGHTNESS", |
COX | 0:b06425bd412a | 96 | "RGB", |
COX | 0:b06425bd412a | 97 | "CHAR MAP", |
COX | 0:b06425bd412a | 98 | "BITMAP", |
COX | 0:b06425bd412a | 99 | "ACCELEROMETER", |
COX | 0:b06425bd412a | 100 | "ABOUT" |
COX | 0:b06425bd412a | 101 | }; |
COX | 0:b06425bd412a | 102 | |
COX | 0:b06425bd412a | 103 | void brightness(); |
COX | 0:b06425bd412a | 104 | void rgb_led_ctrl(); |
COX | 0:b06425bd412a | 105 | void charmap(); |
COX | 0:b06425bd412a | 106 | void bitmap(); |
COX | 0:b06425bd412a | 107 | void accelerometer(); |
COX | 0:b06425bd412a | 108 | void about(); |
COX | 0:b06425bd412a | 109 | void init_MENU(void); |
COX | 0:b06425bd412a | 110 | void update_adc_key(); |
COX | 0:b06425bd412a | 111 | void waitfor_OKkey(); |
COX | 0:b06425bd412a | 112 | |
COX | 0:b06425bd412a | 113 | void (*menu_funcs[NUM_MENU_ITEM])(void) = { |
COX | 0:b06425bd412a | 114 | brightness, |
COX | 0:b06425bd412a | 115 | rgb_led_ctrl, |
COX | 0:b06425bd412a | 116 | charmap, |
COX | 0:b06425bd412a | 117 | bitmap, |
COX | 0:b06425bd412a | 118 | accelerometer, |
COX | 0:b06425bd412a | 119 | about |
COX | 0:b06425bd412a | 120 | }; |
COX | 0:b06425bd412a | 121 | |
COX | 0:b06425bd412a | 122 | char current_menu_item = 0; |
COX | 0:b06425bd412a | 123 | char rgb_menu_item = 0; |
COX | 0:b06425bd412a | 124 | |
COX | 0:b06425bd412a | 125 | void setup() |
COX | 0:b06425bd412a | 126 | { |
COX | 0:b06425bd412a | 127 | |
COX | 0:b06425bd412a | 128 | /* reset button arrays */ |
COX | 0:b06425bd412a | 129 | for(char i=0; i<NUM_KEYS; i++){ |
COX | 0:b06425bd412a | 130 | button_count[i]=0; |
COX | 0:b06425bd412a | 131 | button_status[i]=0; |
COX | 0:b06425bd412a | 132 | } |
COX | 0:b06425bd412a | 133 | |
COX | 0:b06425bd412a | 134 | lcd.LCD_init(); |
COX | 0:b06425bd412a | 135 | lcd.LCD_clear(); |
COX | 0:b06425bd412a | 136 | |
COX | 0:b06425bd412a | 137 | /*Setup RGB LED*/ |
COX | 0:b06425bd412a | 138 | rgb[0].period_us(100); |
COX | 0:b06425bd412a | 139 | for(char i=0; i<3; i++){ |
COX | 0:b06425bd412a | 140 | rgb[i] = 1; |
COX | 0:b06425bd412a | 141 | } |
COX | 0:b06425bd412a | 142 | |
COX | 0:b06425bd412a | 143 | /*Menu initialization*/ |
COX | 0:b06425bd412a | 144 | init_MENU(); |
COX | 0:b06425bd412a | 145 | current_menu_item = 0; |
COX | 0:b06425bd412a | 146 | |
COX | 0:b06425bd412a | 147 | lcd.backlight(ON);//Turn on the backlight |
COX | 0:b06425bd412a | 148 | |
COX | 0:b06425bd412a | 149 | readJStick.attach(&update_adc_key, JStickReadSpeed); |
COX | 0:b06425bd412a | 150 | } |
COX | 0:b06425bd412a | 151 | |
COX | 0:b06425bd412a | 152 | unsigned long buttonFlasher = 0; |
COX | 0:b06425bd412a | 153 | |
COX | 0:b06425bd412a | 154 | /* loop */ |
COX | 0:b06425bd412a | 155 | |
COX | 0:b06425bd412a | 156 | void loop() |
COX | 0:b06425bd412a | 157 | { |
COX | 0:b06425bd412a | 158 | for(char i=0; i<NUM_KEYS; i++){ |
COX | 0:b06425bd412a | 159 | if(button_status[i] != 0){ |
COX | 0:b06425bd412a | 160 | button_status[i] = 0; // reset button flag |
COX | 0:b06425bd412a | 161 | |
COX | 0:b06425bd412a | 162 | switch(i){ |
COX | 0:b06425bd412a | 163 | case UP_KEY: |
COX | 0:b06425bd412a | 164 | // current item to normal display |
COX | 0:b06425bd412a | 165 | lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_NORMAL ); |
COX | 0:b06425bd412a | 166 | if(current_menu_item == 0) |
COX | 0:b06425bd412a | 167 | current_menu_item = NUM_MENU_ITEM -1; |
COX | 0:b06425bd412a | 168 | else |
COX | 0:b06425bd412a | 169 | current_menu_item -=1; |
COX | 0:b06425bd412a | 170 | // next item to highlight display |
COX | 0:b06425bd412a | 171 | lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_HIGHLIGHT ); |
COX | 0:b06425bd412a | 172 | break; |
COX | 0:b06425bd412a | 173 | |
COX | 0:b06425bd412a | 174 | case DOWN_KEY: |
COX | 0:b06425bd412a | 175 | // current item to normal display |
COX | 0:b06425bd412a | 176 | lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_NORMAL ); |
COX | 0:b06425bd412a | 177 | current_menu_item +=1; |
COX | 0:b06425bd412a | 178 | if(current_menu_item >(NUM_MENU_ITEM-1)) current_menu_item = 0; |
COX | 0:b06425bd412a | 179 | // next item to highlight display |
COX | 0:b06425bd412a | 180 | lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_HIGHLIGHT ); |
COX | 0:b06425bd412a | 181 | break; |
COX | 0:b06425bd412a | 182 | |
COX | 0:b06425bd412a | 183 | /*case LEFT_KEY: |
COX | 0:b06425bd412a | 184 | case RIGHT_KEY: |
COX | 0:b06425bd412a | 185 | init_MENU(); |
COX | 0:b06425bd412a | 186 | current_menu_item = 0; |
COX | 0:b06425bd412a | 187 | break;*/ |
COX | 0:b06425bd412a | 188 | |
COX | 0:b06425bd412a | 189 | case CENTER_KEY: |
COX | 0:b06425bd412a | 190 | lcd.LCD_clear(); |
COX | 0:b06425bd412a | 191 | lcd.LCD_write_string(36, 5, "OK", MENU_HIGHLIGHT ); |
COX | 0:b06425bd412a | 192 | (*menu_funcs[current_menu_item])(); |
COX | 0:b06425bd412a | 193 | init_MENU(); |
COX | 0:b06425bd412a | 194 | break; |
COX | 0:b06425bd412a | 195 | } |
COX | 0:b06425bd412a | 196 | } |
COX | 0:b06425bd412a | 197 | } |
COX | 0:b06425bd412a | 198 | } |
COX | 0:b06425bd412a | 199 | |
COX | 0:b06425bd412a | 200 | /* menu functions */ |
COX | 0:b06425bd412a | 201 | |
COX | 0:b06425bd412a | 202 | void init_MENU(void) |
COX | 0:b06425bd412a | 203 | { |
COX | 0:b06425bd412a | 204 | lcd.LCD_clear(); |
COX | 0:b06425bd412a | 205 | |
COX | 0:b06425bd412a | 206 | for (char i=0; i<NUM_MENU_ITEM; i++){ |
COX | 0:b06425bd412a | 207 | if(i==current_menu_item) |
COX | 0:b06425bd412a | 208 | lcd.LCD_write_string(MENU_X, MENU_Y+i, menu_items[i], MENU_HIGHLIGHT); |
COX | 0:b06425bd412a | 209 | else |
COX | 0:b06425bd412a | 210 | lcd.LCD_write_string(MENU_X, MENU_Y+i, menu_items[i], MENU_NORMAL); |
COX | 0:b06425bd412a | 211 | } |
COX | 0:b06425bd412a | 212 | } |
COX | 0:b06425bd412a | 213 | |
COX | 0:b06425bd412a | 214 | // waiting for center key press |
COX | 0:b06425bd412a | 215 | void waitfor_OKkey() |
COX | 0:b06425bd412a | 216 | { |
COX | 0:b06425bd412a | 217 | char stay = 1; |
COX | 0:b06425bd412a | 218 | |
COX | 0:b06425bd412a | 219 | while(stay) |
COX | 0:b06425bd412a | 220 | { |
COX | 0:b06425bd412a | 221 | for(char i=0; i<NUM_KEYS; i++) |
COX | 0:b06425bd412a | 222 | { |
COX | 0:b06425bd412a | 223 | if(button_status[i] != 0){ |
COX | 0:b06425bd412a | 224 | if(CENTER_KEY == i) |
COX | 0:b06425bd412a | 225 | { |
COX | 0:b06425bd412a | 226 | stay = 0; |
COX | 0:b06425bd412a | 227 | button_status[i] = 0; |
COX | 0:b06425bd412a | 228 | } |
COX | 0:b06425bd412a | 229 | } |
COX | 0:b06425bd412a | 230 | } |
COX | 0:b06425bd412a | 231 | } |
COX | 0:b06425bd412a | 232 | } |
COX | 0:b06425bd412a | 233 | |
COX | 0:b06425bd412a | 234 | void brightness() |
COX | 0:b06425bd412a | 235 | { |
COX | 0:b06425bd412a | 236 | char redraw = 1; |
COX | 0:b06425bd412a | 237 | |
COX | 0:b06425bd412a | 238 | lcd.LCD_write_string(14, 1, "LCD", MENU_NORMAL); |
COX | 0:b06425bd412a | 239 | |
COX | 0:b06425bd412a | 240 | while(1) |
COX | 0:b06425bd412a | 241 | { |
COX | 0:b06425bd412a | 242 | if(redraw) |
COX | 0:b06425bd412a | 243 | { |
COX | 0:b06425bd412a | 244 | lcd.LCD_set_XY(12,2); |
COX | 0:b06425bd412a | 245 | for(char i=0; i<10; i++) |
COX | 0:b06425bd412a | 246 | { |
COX | 0:b06425bd412a | 247 | if(i < lcdBrightness * 10) |
COX | 0:b06425bd412a | 248 | lcd.LCD_write_char(92, MENU_NORMAL); |
COX | 0:b06425bd412a | 249 | else |
COX | 0:b06425bd412a | 250 | lcd.LCD_write_char(95, MENU_NORMAL); |
COX | 0:b06425bd412a | 251 | } |
COX | 0:b06425bd412a | 252 | redraw = 0; |
COX | 0:b06425bd412a | 253 | } |
COX | 0:b06425bd412a | 254 | |
COX | 0:b06425bd412a | 255 | if (button_status[RIGHT_KEY]) |
COX | 0:b06425bd412a | 256 | { |
COX | 0:b06425bd412a | 257 | button_status[RIGHT_KEY] = 0; |
COX | 0:b06425bd412a | 258 | redraw = 1; |
COX | 0:b06425bd412a | 259 | if(lcdBrightness < 1) |
COX | 0:b06425bd412a | 260 | { |
COX | 0:b06425bd412a | 261 | lcdBrightness += 0.1; |
COX | 0:b06425bd412a | 262 | lcd.backlight(lcdBrightness); |
COX | 0:b06425bd412a | 263 | } |
COX | 0:b06425bd412a | 264 | } |
COX | 0:b06425bd412a | 265 | if (button_status[LEFT_KEY]) |
COX | 0:b06425bd412a | 266 | { |
COX | 0:b06425bd412a | 267 | button_status[LEFT_KEY] = 0; |
COX | 0:b06425bd412a | 268 | redraw = 1; |
COX | 0:b06425bd412a | 269 | if(lcdBrightness > 0) |
COX | 0:b06425bd412a | 270 | { |
COX | 0:b06425bd412a | 271 | lcdBrightness -= 0.1; |
COX | 0:b06425bd412a | 272 | lcd.backlight(lcdBrightness); |
COX | 0:b06425bd412a | 273 | } |
COX | 0:b06425bd412a | 274 | } |
COX | 0:b06425bd412a | 275 | |
COX | 0:b06425bd412a | 276 | if (button_status[CENTER_KEY]) |
COX | 0:b06425bd412a | 277 | { |
COX | 0:b06425bd412a | 278 | button_status[CENTER_KEY] = 0; |
COX | 0:b06425bd412a | 279 | break; |
COX | 0:b06425bd412a | 280 | } |
COX | 0:b06425bd412a | 281 | } |
COX | 0:b06425bd412a | 282 | } |
COX | 0:b06425bd412a | 283 | |
COX | 0:b06425bd412a | 284 | void rgb_led_ctrl() |
COX | 0:b06425bd412a | 285 | { |
COX | 0:b06425bd412a | 286 | char redraw = 1; |
COX | 0:b06425bd412a | 287 | float temp; |
COX | 0:b06425bd412a | 288 | |
COX | 0:b06425bd412a | 289 | lcd.LCD_write_string(14, 0, "RGB", MENU_NORMAL); |
COX | 0:b06425bd412a | 290 | |
COX | 0:b06425bd412a | 291 | while(1) |
COX | 0:b06425bd412a | 292 | { |
COX | 0:b06425bd412a | 293 | if(redraw) |
COX | 0:b06425bd412a | 294 | { |
COX | 0:b06425bd412a | 295 | lcd.LCD_write_string(5, 2, "R:", (rgb_menu_item == 0)?MENU_HIGHLIGHT:MENU_NORMAL); |
COX | 0:b06425bd412a | 296 | lcd.LCD_write_string(5, 3, "G:", (rgb_menu_item == 1)?MENU_HIGHLIGHT:MENU_NORMAL); |
COX | 0:b06425bd412a | 297 | lcd.LCD_write_string(5, 4, "B:", (rgb_menu_item == 2)?MENU_HIGHLIGHT:MENU_NORMAL); |
COX | 0:b06425bd412a | 298 | |
COX | 0:b06425bd412a | 299 | for(char j=0; j<3; j++) |
COX | 0:b06425bd412a | 300 | { |
COX | 0:b06425bd412a | 301 | lcd.LCD_set_XY(17,2+j); |
COX | 0:b06425bd412a | 302 | temp = rgb[j]; |
COX | 0:b06425bd412a | 303 | for(char i=0; i<10; i++) |
COX | 0:b06425bd412a | 304 | { |
COX | 0:b06425bd412a | 305 | if(i < (1-temp)*10) |
COX | 0:b06425bd412a | 306 | lcd.LCD_write_char(92, MENU_NORMAL); |
COX | 0:b06425bd412a | 307 | else |
COX | 0:b06425bd412a | 308 | lcd.LCD_write_char(32, MENU_NORMAL); |
COX | 0:b06425bd412a | 309 | } |
COX | 0:b06425bd412a | 310 | } |
COX | 0:b06425bd412a | 311 | redraw = 0; |
COX | 0:b06425bd412a | 312 | } |
COX | 0:b06425bd412a | 313 | |
COX | 0:b06425bd412a | 314 | if (button_status[RIGHT_KEY]) |
COX | 0:b06425bd412a | 315 | { |
COX | 0:b06425bd412a | 316 | button_status[RIGHT_KEY] = 0; |
COX | 0:b06425bd412a | 317 | redraw = 1; |
COX | 0:b06425bd412a | 318 | temp = rgb[rgb_menu_item]; |
COX | 0:b06425bd412a | 319 | if(temp > 0){ |
COX | 0:b06425bd412a | 320 | rgb[rgb_menu_item] = temp - 0.1; |
COX | 0:b06425bd412a | 321 | } |
COX | 0:b06425bd412a | 322 | } |
COX | 0:b06425bd412a | 323 | if (button_status[LEFT_KEY]) |
COX | 0:b06425bd412a | 324 | { |
COX | 0:b06425bd412a | 325 | button_status[LEFT_KEY] = 0; |
COX | 0:b06425bd412a | 326 | redraw = 1; |
COX | 0:b06425bd412a | 327 | temp = rgb[rgb_menu_item]; |
COX | 0:b06425bd412a | 328 | if(temp < 1){ |
COX | 0:b06425bd412a | 329 | rgb[rgb_menu_item] = temp + 0.1; |
COX | 0:b06425bd412a | 330 | } |
COX | 0:b06425bd412a | 331 | } |
COX | 0:b06425bd412a | 332 | if (button_status[UP_KEY]) |
COX | 0:b06425bd412a | 333 | { |
COX | 0:b06425bd412a | 334 | button_status[UP_KEY] = 0; |
COX | 0:b06425bd412a | 335 | redraw = 1; |
COX | 0:b06425bd412a | 336 | if(rgb_menu_item == 0) |
COX | 0:b06425bd412a | 337 | rgb_menu_item = 2; |
COX | 0:b06425bd412a | 338 | else |
COX | 0:b06425bd412a | 339 | rgb_menu_item--; |
COX | 0:b06425bd412a | 340 | } |
COX | 0:b06425bd412a | 341 | if (button_status[DOWN_KEY]) |
COX | 0:b06425bd412a | 342 | { |
COX | 0:b06425bd412a | 343 | button_status[DOWN_KEY] = 0; |
COX | 0:b06425bd412a | 344 | redraw = 1; |
COX | 0:b06425bd412a | 345 | if(rgb_menu_item == 2) |
COX | 0:b06425bd412a | 346 | rgb_menu_item = 0; |
COX | 0:b06425bd412a | 347 | else |
COX | 0:b06425bd412a | 348 | rgb_menu_item++; |
COX | 0:b06425bd412a | 349 | } |
COX | 0:b06425bd412a | 350 | |
COX | 0:b06425bd412a | 351 | if (button_status[CENTER_KEY]) |
COX | 0:b06425bd412a | 352 | { |
COX | 0:b06425bd412a | 353 | button_status[CENTER_KEY] = 0; |
COX | 0:b06425bd412a | 354 | break; |
COX | 0:b06425bd412a | 355 | } |
COX | 0:b06425bd412a | 356 | } |
COX | 0:b06425bd412a | 357 | } |
COX | 0:b06425bd412a | 358 | |
COX | 0:b06425bd412a | 359 | void charmap(){ |
COX | 0:b06425bd412a | 360 | char i,j; |
COX | 0:b06425bd412a | 361 | for(i=0; i<5; i++){ |
COX | 0:b06425bd412a | 362 | for(j=0; j<14; j++){ |
COX | 0:b06425bd412a | 363 | lcd.LCD_set_XY(j*6,i); |
COX | 0:b06425bd412a | 364 | lcd.LCD_write_char(i*14+j+32, MENU_NORMAL); |
COX | 0:b06425bd412a | 365 | } |
COX | 0:b06425bd412a | 366 | } |
COX | 0:b06425bd412a | 367 | waitfor_OKkey(); |
COX | 0:b06425bd412a | 368 | } |
COX | 0:b06425bd412a | 369 | |
COX | 0:b06425bd412a | 370 | void bitmap(){ |
COX | 0:b06425bd412a | 371 | lcd.LCD_draw_bmp_pixel(0,0, demo_bmp, 84,40); |
COX | 0:b06425bd412a | 372 | //lcd.LCD_write_chinese(6,3, DFrobot_chinese,12,6,0,0); |
COX | 0:b06425bd412a | 373 | waitfor_OKkey(); |
COX | 0:b06425bd412a | 374 | } |
COX | 0:b06425bd412a | 375 | |
COX | 0:b06425bd412a | 376 | void accelerometer(){ |
COX | 0:b06425bd412a | 377 | while(1) |
COX | 0:b06425bd412a | 378 | { |
COX | 0:b06425bd412a | 379 | x = abs(acc.getAccX()); |
COX | 0:b06425bd412a | 380 | y = abs(acc.getAccY()); |
COX | 0:b06425bd412a | 381 | z = abs(acc.getAccZ()); |
COX | 0:b06425bd412a | 382 | wait(0.1); |
COX | 0:b06425bd412a | 383 | lcd.LCD_set_XY(5,2); |
COX | 0:b06425bd412a | 384 | lcd.LCD_write_char(48+int(x),MENU_NORMAL); |
COX | 0:b06425bd412a | 385 | lcd.LCD_write_char('.',MENU_NORMAL); |
COX | 0:b06425bd412a | 386 | lcd.LCD_write_char(48+int((x-int(x))*10),MENU_NORMAL); |
COX | 0:b06425bd412a | 387 | lcd.LCD_set_XY(32,2); |
COX | 0:b06425bd412a | 388 | lcd.LCD_write_char(48+int(y),MENU_NORMAL); |
COX | 0:b06425bd412a | 389 | lcd.LCD_write_char('.',MENU_NORMAL); |
COX | 0:b06425bd412a | 390 | lcd.LCD_write_char(48+int((y-int(y))*10),MENU_NORMAL); |
COX | 0:b06425bd412a | 391 | lcd.LCD_set_XY(59,2); |
COX | 0:b06425bd412a | 392 | lcd.LCD_write_char(48+int(z),MENU_NORMAL); |
COX | 0:b06425bd412a | 393 | lcd.LCD_write_char('.',MENU_NORMAL); |
COX | 0:b06425bd412a | 394 | lcd.LCD_write_char(48+int((z-int(z))*10),MENU_NORMAL); |
COX | 0:b06425bd412a | 395 | if (button_status[CENTER_KEY]) |
COX | 0:b06425bd412a | 396 | { |
COX | 0:b06425bd412a | 397 | button_status[CENTER_KEY] = 0; |
COX | 0:b06425bd412a | 398 | break; |
COX | 0:b06425bd412a | 399 | } |
COX | 0:b06425bd412a | 400 | } |
COX | 0:b06425bd412a | 401 | } |
COX | 0:b06425bd412a | 402 | void about(){ |
COX | 0:b06425bd412a | 403 | lcd.LCD_write_string( 0, 1, "LCD4884 Shield", MENU_NORMAL); |
COX | 0:b06425bd412a | 404 | lcd.LCD_write_string( 0, 3, "sainsmart.com", MENU_NORMAL); |
COX | 0:b06425bd412a | 405 | waitfor_OKkey(); |
COX | 0:b06425bd412a | 406 | } |
COX | 0:b06425bd412a | 407 | |
COX | 0:b06425bd412a | 408 | // which includes DEBOUNCE ON/OFF mechanism, and continuous pressing detection |
COX | 0:b06425bd412a | 409 | // Convert ADC value to key number |
COX | 0:b06425bd412a | 410 | |
COX | 0:b06425bd412a | 411 | char get_key(float input) |
COX | 0:b06425bd412a | 412 | { |
COX | 0:b06425bd412a | 413 | char k; |
COX | 0:b06425bd412a | 414 | |
COX | 0:b06425bd412a | 415 | for (k = 0; k < NUM_KEYS; k++) |
COX | 0:b06425bd412a | 416 | { |
COX | 0:b06425bd412a | 417 | if (input < adc_key_val[k]) |
COX | 0:b06425bd412a | 418 | { |
COX | 0:b06425bd412a | 419 | return k; |
COX | 0:b06425bd412a | 420 | } |
COX | 0:b06425bd412a | 421 | } |
COX | 0:b06425bd412a | 422 | if (k >= NUM_KEYS) |
COX | 0:b06425bd412a | 423 | k = NUM_KEYS; // No valid key pressed |
COX | 0:b06425bd412a | 424 | |
COX | 0:b06425bd412a | 425 | return k; |
COX | 0:b06425bd412a | 426 | } |
COX | 0:b06425bd412a | 427 | |
COX | 0:b06425bd412a | 428 | //poor attempt at a debounce mechanism. |
COX | 0:b06425bd412a | 429 | void update_adc_key(){ |
COX | 0:b06425bd412a | 430 | float adc_key_in; |
COX | 0:b06425bd412a | 431 | char key_in; |
COX | 0:b06425bd412a | 432 | char i; |
COX | 0:b06425bd412a | 433 | |
COX | 0:b06425bd412a | 434 | //TestPin2 = HIGH; |
COX | 0:b06425bd412a | 435 | |
COX | 0:b06425bd412a | 436 | adc_key_in = JStick.read(); |
COX | 0:b06425bd412a | 437 | |
COX | 0:b06425bd412a | 438 | key_in = get_key(adc_key_in); |
COX | 0:b06425bd412a | 439 | for(i=0; i<NUM_KEYS; i++) |
COX | 0:b06425bd412a | 440 | { |
COX | 0:b06425bd412a | 441 | if(key_in == i) //one key is pressed |
COX | 0:b06425bd412a | 442 | { |
COX | 0:b06425bd412a | 443 | if(button_count[i] < DEBOUNCE_MAX) button_count[i]++; |
COX | 0:b06425bd412a | 444 | if(button_count[i] == DEBOUNCE_MAX){ |
COX | 0:b06425bd412a | 445 | button_status[i] = 1; |
COX | 0:b06425bd412a | 446 | button_count[i] = 1; |
COX | 0:b06425bd412a | 447 | JStickReadSpeed = 0.200; |
COX | 0:b06425bd412a | 448 | } |
COX | 0:b06425bd412a | 449 | } |
COX | 0:b06425bd412a | 450 | else // no button pressed |
COX | 0:b06425bd412a | 451 | { |
COX | 0:b06425bd412a | 452 | if(button_count[i] > 0) button_count[i]--; |
COX | 0:b06425bd412a | 453 | if(button_count[i] == 0){ |
COX | 0:b06425bd412a | 454 | button_status[i] = 0; |
COX | 0:b06425bd412a | 455 | JStickReadSpeed = 0.015; |
COX | 0:b06425bd412a | 456 | } |
COX | 0:b06425bd412a | 457 | } |
COX | 0:b06425bd412a | 458 | } |
COX | 0:b06425bd412a | 459 | |
COX | 0:b06425bd412a | 460 | readJStick.attach(&update_adc_key, JStickReadSpeed); |
COX | 0:b06425bd412a | 461 | |
COX | 0:b06425bd412a | 462 | //TestPin2 = LOW; |
COX | 0:b06425bd412a | 463 | |
COX | 0:b06425bd412a | 464 | } |
COX | 0:b06425bd412a | 465 | |
COX | 0:b06425bd412a | 466 | int main(void) |
COX | 0:b06425bd412a | 467 | { |
COX | 0:b06425bd412a | 468 | lcd = LCD4884(); |
COX | 0:b06425bd412a | 469 | setup(); |
COX | 0:b06425bd412a | 470 | while(1) { |
COX | 0:b06425bd412a | 471 | //TestPin1 = HIGH; |
COX | 0:b06425bd412a | 472 | loop(); |
COX | 0:b06425bd412a | 473 | //TestPin1 = LOW; |
COX | 0:b06425bd412a | 474 | }; |
COX | 0:b06425bd412a | 475 | } |