Przykładowy program 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().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 | #include "global.h" unsigned char const napis1[] PROGMEM= { "Sterownik SU 1.50" }; 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 } |
Efekt działania programu