ftf connect lab1

Dependencies:   PCAL955x ST7567 SoftPWM

Committer:
uLipe
Date:
Fri Nov 04 23:59:00 2016 +0000
Revision:
0:b69f739ab07a
first working version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
uLipe 0:b69f739ab07a 1 /**
uLipe 0:b69f739ab07a 2 * @brief NXP FTF LAB1 - measure analog input, control LEDS an prints on GLCD
uLipe 0:b69f739ab07a 3 */
uLipe 0:b69f739ab07a 4
uLipe 0:b69f739ab07a 5
uLipe 0:b69f739ab07a 6 #include "mbed.h"
uLipe 0:b69f739ab07a 7 #include "ST7567.h"
uLipe 0:b69f739ab07a 8 #include "AnalogIn.h"
uLipe 0:b69f739ab07a 9 #include "PwmOut.h"
uLipe 0:b69f739ab07a 10 #include "PCAL9555.h"
uLipe 0:b69f739ab07a 11 #include "SoftPWM.h"
uLipe 0:b69f739ab07a 12
uLipe 0:b69f739ab07a 13 /* LCD screen dimensions */
uLipe 0:b69f739ab07a 14 #define LCD_HEIGHT 64
uLipe 0:b69f739ab07a 15 #define LCD_WIDTH 128
uLipe 0:b69f739ab07a 16
uLipe 0:b69f739ab07a 17 /* LCD font dimensions */
uLipe 0:b69f739ab07a 18 #define FONT_HEIGHT 10
uLipe 0:b69f739ab07a 19 #define FONT_WIDTH 5
uLipe 0:b69f739ab07a 20
uLipe 0:b69f739ab07a 21 /* Joystick keys mask */
uLipe 0:b69f739ab07a 22 #define JOY_UP_MASK 0x10
uLipe 0:b69f739ab07a 23 #define JOY_DO_MASK 0x01
uLipe 0:b69f739ab07a 24 #define JOY_EN_MASK 0x02
uLipe 0:b69f739ab07a 25
uLipe 0:b69f739ab07a 26
uLipe 0:b69f739ab07a 27 /** Instance a on board GLCD object */
uLipe 0:b69f739ab07a 28 ST7567 glcd(D11, D13, D12, D9, D10);
uLipe 0:b69f739ab07a 29
uLipe 0:b69f739ab07a 30 /** Instance a Io expander class */
uLipe 0:b69f739ab07a 31 PCAL9555 joy_input(SDA, SCL);
uLipe 0:b69f739ab07a 32 GpioBusIn joy_bus(joy_input,X0_0, X0_1, X0_2, X0_3, X0_4);
uLipe 0:b69f739ab07a 33
uLipe 0:b69f739ab07a 34
uLipe 0:b69f739ab07a 35 /** Instance three PWM Objects */
uLipe 0:b69f739ab07a 36 SoftPWM led_red(LED1);
uLipe 0:b69f739ab07a 37 SoftPWM led_grn(LED2);
uLipe 0:b69f739ab07a 38 SoftPWM led_blu(LED3);
uLipe 0:b69f739ab07a 39
uLipe 0:b69f739ab07a 40 /** Instance a Analog Input */
uLipe 0:b69f739ab07a 41 AnalogIn potentiometer(A3);
uLipe 0:b69f739ab07a 42
uLipe 0:b69f739ab07a 43 /* screen messages */
uLipe 0:b69f739ab07a 44 const char msg[] = {"Welcome to NXP FTF !\0"};
uLipe 0:b69f739ab07a 45 const char led_r_msg[] = {"Led red value:\0"};
uLipe 0:b69f739ab07a 46 const char led_b_msg[] = {"Led blu value:\0"};
uLipe 0:b69f739ab07a 47 const char led_g_msg[] = {"Led grn value:\0"};
uLipe 0:b69f739ab07a 48
uLipe 0:b69f739ab07a 49
uLipe 0:b69f739ab07a 50
uLipe 0:b69f739ab07a 51 /**
uLipe 0:b69f739ab07a 52 * @brief main application loop
uLipe 0:b69f739ab07a 53 */
uLipe 0:b69f739ab07a 54 int main(void)
uLipe 0:b69f739ab07a 55 {
uLipe 0:b69f739ab07a 56 int current_cursor = 0, prev_cursor =0;
uLipe 0:b69f739ab07a 57 bool enter_pressed = false;
uLipe 0:b69f739ab07a 58
uLipe 0:b69f739ab07a 59 /* setup our on-board glcd */
uLipe 0:b69f739ab07a 60 glcd.set_contrast(0x35);
uLipe 0:b69f739ab07a 61 glcd.cls();
uLipe 0:b69f739ab07a 62
uLipe 0:b69f739ab07a 63 /* Center the LCD cursor based on message size*/
uLipe 0:b69f739ab07a 64 glcd.locate(LCD_WIDTH - (sizeof(msg) * FONT_WIDTH),
uLipe 0:b69f739ab07a 65 (LCD_HEIGHT - FONT_HEIGHT) / 2);
uLipe 0:b69f739ab07a 66
uLipe 0:b69f739ab07a 67 /* prints a welcome message */
uLipe 0:b69f739ab07a 68 glcd.printf(msg);
uLipe 0:b69f739ab07a 69 Thread::wait(2000);
uLipe 0:b69f739ab07a 70 glcd.cls();
uLipe 0:b69f739ab07a 71
uLipe 0:b69f739ab07a 72 /* prints the initial screen */
uLipe 0:b69f739ab07a 73 glcd.locate(3*FONT_WIDTH, FONT_HEIGHT * 2);
uLipe 0:b69f739ab07a 74 glcd.printf(led_r_msg);
uLipe 0:b69f739ab07a 75 glcd.locate(3*FONT_WIDTH, FONT_HEIGHT * 3);
uLipe 0:b69f739ab07a 76 glcd.printf(led_g_msg);
uLipe 0:b69f739ab07a 77 glcd.locate(3*FONT_WIDTH, FONT_HEIGHT * 4);
uLipe 0:b69f739ab07a 78 glcd.printf(led_b_msg);
uLipe 0:b69f739ab07a 79
uLipe 0:b69f739ab07a 80
uLipe 0:b69f739ab07a 81 /* put all pwms to a known value at 1KHz period */
uLipe 0:b69f739ab07a 82
uLipe 0:b69f739ab07a 83 led_red.period_ms(1);
uLipe 0:b69f739ab07a 84 led_red.pulsewidth_us(1000);
uLipe 0:b69f739ab07a 85 led_grn.period_ms(1);
uLipe 0:b69f739ab07a 86 led_grn.pulsewidth_us(1000);
uLipe 0:b69f739ab07a 87 led_blu.period_ms(1);
uLipe 0:b69f739ab07a 88 led_blu.pulsewidth_us(1000);
uLipe 0:b69f739ab07a 89
uLipe 0:b69f739ab07a 90
uLipe 0:b69f739ab07a 91 /* run the main loop at 200ms period */
uLipe 0:b69f739ab07a 92 for(;;Thread::wait(200)) {
uLipe 0:b69f739ab07a 93
uLipe 0:b69f739ab07a 94 /* read the joystick status */
uLipe 0:b69f739ab07a 95 int keys = joy_bus.read();
uLipe 0:b69f739ab07a 96 if((keys & JOY_DO_MASK) == 0) {
uLipe 0:b69f739ab07a 97 /* navigate downward */
uLipe 0:b69f739ab07a 98 current_cursor = (current_cursor + 1) % 3;
uLipe 0:b69f739ab07a 99 } else if ((keys & JOY_UP_MASK) == 0) {
uLipe 0:b69f739ab07a 100 /* navigate upward */
uLipe 0:b69f739ab07a 101 current_cursor--;
uLipe 0:b69f739ab07a 102 if(current_cursor < 0) current_cursor = 2;
uLipe 0:b69f739ab07a 103 } else if ((keys & JOY_EN_MASK) == 0) {
uLipe 0:b69f739ab07a 104
uLipe 0:b69f739ab07a 105 /* catch the enter pressed */
uLipe 0:b69f739ab07a 106 enter_pressed = true;
uLipe 0:b69f739ab07a 107 }
uLipe 0:b69f739ab07a 108
uLipe 0:b69f739ab07a 109 if(current_cursor != prev_cursor) {
uLipe 0:b69f739ab07a 110 /* joystick action ocurred */
uLipe 0:b69f739ab07a 111
uLipe 0:b69f739ab07a 112 /* erase previous selection */
uLipe 0:b69f739ab07a 113 glcd.locate(0, FONT_HEIGHT * (2+prev_cursor));
uLipe 0:b69f739ab07a 114 glcd.printf(" ");
uLipe 0:b69f739ab07a 115
uLipe 0:b69f739ab07a 116 /* update for next action */
uLipe 0:b69f739ab07a 117 prev_cursor = current_cursor;
uLipe 0:b69f739ab07a 118 enter_pressed = false;
uLipe 0:b69f739ab07a 119 }
uLipe 0:b69f739ab07a 120
uLipe 0:b69f739ab07a 121
uLipe 0:b69f739ab07a 122 /* move the arrow between options */
uLipe 0:b69f739ab07a 123 glcd.locate(0, FONT_HEIGHT * (2+current_cursor));
uLipe 0:b69f739ab07a 124 glcd.printf("->");
uLipe 0:b69f739ab07a 125
uLipe 0:b69f739ab07a 126 if(enter_pressed != false) {
uLipe 0:b69f739ab07a 127 /* enter pressed, allow editing the field */
uLipe 0:b69f739ab07a 128 glcd.locate((sizeof(led_r_msg) + 3) * FONT_WIDTH,
uLipe 0:b69f739ab07a 129 FONT_HEIGHT * (2+current_cursor));
uLipe 0:b69f739ab07a 130 glcd.printf("%5d", potentiometer.read_u16());
uLipe 0:b69f739ab07a 131
uLipe 0:b69f739ab07a 132 switch(current_cursor) {
uLipe 0:b69f739ab07a 133 case 0:{
uLipe 0:b69f739ab07a 134 /* update the led duty cicle */
uLipe 0:b69f739ab07a 135 int duty = (potentiometer.read_u16() * 1000)/65535;
uLipe 0:b69f739ab07a 136 led_red.pulsewidth_us(1000 - duty);
uLipe 0:b69f739ab07a 137 }
uLipe 0:b69f739ab07a 138 break;
uLipe 0:b69f739ab07a 139
uLipe 0:b69f739ab07a 140 case 1:{
uLipe 0:b69f739ab07a 141 /* update the led duty cicle */
uLipe 0:b69f739ab07a 142 int duty = (potentiometer.read_u16() * 1000)/65535;
uLipe 0:b69f739ab07a 143 led_blu.pulsewidth_us(1000 - duty);
uLipe 0:b69f739ab07a 144 }
uLipe 0:b69f739ab07a 145 break;
uLipe 0:b69f739ab07a 146
uLipe 0:b69f739ab07a 147 case 2:{
uLipe 0:b69f739ab07a 148 /* update the led duty cicle */
uLipe 0:b69f739ab07a 149 int duty = (potentiometer.read_u16() * 1000)/65535;
uLipe 0:b69f739ab07a 150 led_grn.pulsewidth_us(1000 - duty);
uLipe 0:b69f739ab07a 151 }
uLipe 0:b69f739ab07a 152 break;
uLipe 0:b69f739ab07a 153 }
uLipe 0:b69f739ab07a 154 }
uLipe 0:b69f739ab07a 155
uLipe 0:b69f739ab07a 156 }
uLipe 0:b69f739ab07a 157 }