Przykładowy program w ARDUINO w języku C dla sterownika SU 1.5:
Poniżej prezentuję kody źródłowe przykładowego programu dla sterownika SU 1.5. Program został napisany w języku C, w ARDUINO.
Przykładowy program prezentuje jak wstawiać kod w języku C w ARDUINO. Zadaniem programu jest wyświetlenie napisu na wyświetlaczu LCD.
W kod w języka C, z zasobów ARDUINO, została wpleciona funkcja opóźniająca Delay().
#include "global.h" unsigned char const napis1[] PROGMEM= { "Sterownik SU 1.50"}; unsigned char const napis2[] PROGMEM= { " firmy E-TRONIX 0"}; void setup() { // put your setup code here, to run once: pinMode(A5, OUTPUT); //buzer, 29 LUB A5 pinMode(A7,INPUT); //WEJSCIE OK } void loop() { // put your main code here, to run repeatedly: DDRB=0xff; //magistrala danych jako wyjscie sbi(DDRD,4); //aktywacja pinu wyswietlacza sbi(DDRC,6); //aktywacja pinu ING1 odczytu wejsc cyfrowych sbi(DDRC,7); //aktywacja pinu do sterowania wyjsc cyfrowych sbi(DDRA,4); //aktywacja pinu /OE wyjsc cyfrowych sbi(PORTC,6); //stan wysoki na ING1 sbi(PORTC,7); //stan wysoki na OUTG1 cbi(PORTA,4); //stan niski na /OE (sterowanie wyjsc cyfrowych mozliwe) sbi(PORTD,4); //stan wysoki na DISPLAY LCD_init(); LCD_clear(); LCD_TXT(napis1); LCD_xy(1,2); LCD_putchar('a'); LCD_TXT(napis2); while(1) { if (digitalRead (A7)==LOW) digitalWrite(A5, LOW); else digitalWrite(A5, HIGH); } } /* ************************************************* * Procedura zapisująca dane w wyświetlaczu LCD. * ************************************************* */ void LCD_clock(u08 data, u08 rs) { MAGIST_DATA=((data&0x0f)<<4); if (rs==1) // linia RS wyświetlacza sbi(MAGIST_DATA,LCD_RS); // ustaw linię RS wyświetlacza else cbi(MAGIST_DATA,LCD_RS); cbi(PORTB,1); sbi(DDRD,4); sbi(MAGIST_DATA,LCD_EN); // ustaw linię EN wyświetlacza delay(1); cbi(PORTD,4); // i wysłanie danych na szynę sbi(PORTD,4); delay(1); cbi(MAGIST_DATA,LCD_EN); // skasuj linię EN wyświetlacza delay(1); cbi(PORTD,4); sbi(PORTD,4); delay(1); cbi(MAGIST_DATA,LCD_RS); // skasuj liniŕ RS wyświetlacza } /* ************************************************* * Wysyłanie danych lub komend do wyświetlacza. * ************************************************* */ void LCD_send(u08 data, u08 rs) { LCD_clock(data >> 4 , rs); // bardziej znacząca część LCD_clock(data & 0x0F, rs); // mniej znacząca część } /* ************************************************* * Procedura wysyłająca komendy do wyświetlacza. * ************************************************* */ void LCD_send_0(u08 ch) { LCD_send(ch, 0); } /* ************************************************* * Procedura wysyłająca dane do wyświetlacza LCD.* ************************************************* */ void LCD_send_1(u08 ch) { LCD_send(ch, 1); } /* ************************************************* * Procedura czyszcząca wyświetlacz LCD. * ************************************************* */ void LCD_clear(void) { LCD_send_0(0x01); // wyczyść LCD delay(100); } /* ************************************************* * Procedura inicjująca wyświetlacz LCD. * ************************************************* */ void LCD_init(void) { register unsigned char i; delay(1600); for(i=0;i<3;i++) { LCD_clock(0x03, 0); //reset LCD delay(40); } LCD_clock(0x02,0); //operacje 4-bitowe LCD_send_0(0x2C); LCD_send_0(0x08); //wylacz lcd, wylacz kursor, wlacz mruganie kursora LCD_clear(); //skasuj lcd, kursor do pozycji home LCD_send_0(0x06); //przesuwaj kursor w prawo w trakcie wyswietlania LCD_send_0(0x0C); //wlacz lcd i wyłącz kursor } /* ************************************************* * Procedura wyświetlająca znak na wyświelaczu * * LCD. * ************************************************* */ void LCD_putchar(char ch) { LCD_send_1(ch); } /* ************************************************* * Procedura wyświetlająca napis umieszczony * * w pamięci programu. * ************************************************* */ void LCD_TXT(unsigned char tablica[]) { unsigned char x; x=0; for (x=0; pgm_read_byte(&tablica[x])!='0'; x++) { LCD_putchar(pgm_read_byte(&tablica[x])); } } /* ************************************************* * Procedura umieszczająca kursor wyświetlacza * * na odpowiednich współrzędnych. * ************************************************* */ void LCD_xy(u08 x, u08 y) { switch(y) { case 1: y=0x00; break; // adres 1 znaku 1 wiersza case 2: y=0x40; break; // adres 1 znaku 2 wiersza } LCD_send_0(0x80+y+x-1); // ustaw adres RAM }
Foto. 1. Efekt działania programu.
Początek ..