
Using Threads to control LCD display and LEDS
Dependencies: mbed mbed-rtos C12832_lcd LCD_fonts
Revision 4:3202052e5a8b, committed 2020-08-01
- Comitter:
- T00209563
- Date:
- Sat Aug 01 15:47:24 2020 +0000
- Parent:
- 3:3ec443c0842a
- Commit message:
- Using Threads to control LCD display and LEDS
Changed in this revision
THREADS.cpp | Show annotated file Show diff for this revision Revisions of this file |
main.cpp | Show diff for this revision Revisions of this file |
--- /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 + } + +}
--- a/main.cpp Wed Dec 05 08:06:20 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,119 +0,0 @@ -// 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); - - -// 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 -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 - - 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 - } - -}