
Using Threads to control LCD display and LEDS
Dependencies: mbed mbed-rtos C12832_lcd LCD_fonts
Diff: THREADS.cpp
- Revision:
- 4:3202052e5a8b
diff -r 3ec443c0842a -r 3202052e5a8b THREADS.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/THREADS.cpp Sat Aug 01 15:47:24 2020 +0000 @@ -0,0 +1,143 @@ +// example to test the mbed Lab Board lcd lib with the mbed rtos +// Pot1 change the contrast +// Pot2 change the speed of the sin wave + +#include "mbed.h" +#include "rtos.h" +#include "Small_6.h" +#include "Small_7.h" +#include "Arial_9.h" +#include "stdio.h" +#include "C12832_lcd.h" + +// LCD object +C12832_LCD LCD; + +AnalogIn Pot1(p19); +AnalogIn Pot2(p20); +BusIn joy(p15,p12,p13,p16); +DigitalIn fire(p14); + +BusOut leds(LED1,LED2,LED3,LED4); + + +// mutex to make the lcd lib thread save +Mutex lcd_mutex; + +// Thread 1 +// print counter into first line and wait for 1 s +void thread1(void const *args) +{ + int i; + while(true) { // thread loop + lcd_mutex.lock(); + LCD.locate(0,0); + LCD.set_font((unsigned char*) Small_6); + LCD.printf("Thread1 count: %d",i); + lcd_mutex.unlock(); + i++; + Thread::wait(1000); + } +} + +// Thread 2 +// print counter into third line and wait for 0,5s +void thread2(void const *args) +{ + int k; + while(true) { // thread loop + lcd_mutex.lock(); + LCD.locate(0,20); + LCD.set_font((unsigned char*) Arial_9); + LCD.printf("Thread 2 count : %d",k); + lcd_mutex.unlock(); + k++; + Thread::wait(500); // wait 0.5s + } +} + +// Thread 3 +// print a sin function in a small window +// the value of pot 1 change the speed of the sinwave +void thread3(void const *args) +{ + int i,k,v; + double s,a; + k = 1; + lcd_mutex.lock(); + LCD.rect(89,0,127,17,1); + lcd_mutex.unlock(); + while(true) { // thread loop + v = Pot1.read_u16(); // get value of pot 1 + lcd_mutex.lock(); + for (i=90; i<127; i++) { + s = 8 * sin((long double)(i+k) /5); // pixel to print + a = 8 * sin((long double)(i+k-1) /5); // old pixel to erase + LCD.pixel(i,9 + (int)a,0); // erase pixel + LCD.pixel(i,9 + (int)s,1); // print pixel + } + LCD.copy_to_lcd(); // LCD.pixel do not update the lcd + lcd_mutex.unlock(); + k++; + Thread::wait(v/100); // value of pot1 / 100 + } +} + +// Thread 4 +// input pot 2 and change the contrast of lcd +void thread4(void const *args) +{ + int k; + while(true) { // thread loop + k = Pot2.read_u16(); // get the value of poti 2 + k = k >> 10; // we need only 6 bit for contrast + lcd_mutex.lock(); + LCD.set_contrast(k); + lcd_mutex.unlock(); + Thread::wait(500); // wait 0.5s + } +} + + +// print the actual contrast + +//Thraed 5 +// using joystick to control Leds +void thread5(void const *args) +{ + while(1) { + if (fire) { + leds=0xf; + } else { + leds=joy; + } + wait(0.1); + } +} + + + + +int main() +{ + int j; + LCD.cls(); + + Thread t1(thread1); //start thread1 + Thread t2(thread2); //start thread2 + Thread t3(thread3); //start thread3 + Thread t4(thread4); //start thread4 + Thread t5(thread5); //start thread5 + + + while(true) { // main is the next thread + lcd_mutex.lock(); + LCD.locate(0,9); + LCD.set_font((unsigned char*) Small_7); + j = LCD.get_contrast(); // read the actual contrast + LCD.printf("contrast : %d",j); + lcd_mutex.unlock(); + Thread::wait(500); // wait 0.5s + } + +}