INSTRUKCJA LABORATORYJNA
Temat: Badanie wyświetlaczy
LCD oraz LED.
Bielsko – Biała 2013
Badanie diod LED
Wyznaczenie charakterystyki diody LED w kierunku przewodzenia UF=f(IF).
Za pomocą potencjometru na zasilaczu zmieniać należy wartość napięcia zasilania Uz. Napięcie zmieniamy zgodnie z tabelą 1 ze skokiem 0.2V. Każda z diod ma inny próg graniczny napięcia zasilania po którym dioda zaczyna świecić. Za pomocą amperomierza odczytać należy prąd diody IF , natomiast za pomocą woltomierza odczytać należy napięcie na diodzie UF. Należy pamiętać, aby nie przekroczyć maksymalnego napięcia UFmax badanej diody.
Układ pomiarowy:
Układ do pomiaru charakterystyki w kierunku przewodzenia diody LED.
Badane diody:
D1 – biała,
D2 – żółta,
D3 – zielona,
D4 – niebieska,
D5 – czerwona.
Ważne: Podczas wykonywania pomiarów nie przekroczyć prądu zasilania diody 15mA ponieważ może doprowadzić to do jej spalenia.
Tabela pomiarowa 1:
Próg świecenia | IFmin | UFmin | IFmin | UFmin | IFmin | UFmin | IFmin | UFmin | IFmin | UFmin |
---|---|---|---|---|---|---|---|---|---|---|
D1 | D2 | D3 | D4 | D5 | ||||||
Lp. | Uz | IF | UF | IF | UF | IF | UF | IF | UF | IF |
V | mA | V | mA | V | mA | V | mA | V | mA | |
1. | 0 | |||||||||
2. | 0.5 | |||||||||
3. | 1.0 | |||||||||
4. | 1.2 | |||||||||
5. | 1.4 | |||||||||
6. | 1.6 | |||||||||
… | … |
II. Badanie wyświetlacza siedmiosegmentowego.
Wyznaczyć prąd napięcie na progu świecenia segmentu „e” oraz obliczyć moc pobieraną przez wskaźnik do zadowalającego świecenia wybranej cyfry.
Schemat pomiarowy:
Schemat połączenia wyświetlacz siedmiosegmentowego.
Aby poprawnie wyświetlać cyfrę w miejsce zacisków połączonych czerwoną linią należy je zewrzeć lub w wpiąć amperomierz, w przeciwnym wypadku w miejscu tym jest rozwarcie połączenia.
Tabela 2. Tabela wyboru stanów na wejściach dla wyświetlenia poszczególnych cyfr:
Wypełnić wiersz „znak” zaznaczając od pola świecenia wskaźnika siedmiosegmentowego oraz wiersz „liczba dziesiętna” wpisując odpowiednią wartość wyświetlanej liczby dziesiętnej w tabeli 2. W celu określenia poprawnego działanie wskaźnika siedmiosegmentowego sterowanego przez układ UCY 7447 należy na wejścia A, B, C, D dekodera UCY 7447 podać stan niski lub wysoki zgodnie z tabelą 2.
Prąd i napięcie na progu świecenia segmentu :
Segment | UF V | IF mA |
---|---|---|
e |
Obliczyć moc pobieraną przez wskaźnik do zadowalającego wyświetlania segmentu e:
"…" U = .............. , "…" I = .............., P = I ×U = .............. .
Wyznaczyć moc pobieraną przez wskaźnik siedmiosegmentowy dla następującego stanu wejść:
A -0 B-0 C-0 D-1:
"…" U = .............. , "…" I = .............., P = I ×U = .............. .
III. Programowanie wyświetlacza LCD 2x16.
Schemat połączenia mikrokontrolera ATMEGA16 z wyświetlaczem LCD:
Schemat połączenia wyświetlacza LCD z mikrokontrolerem
Schemat połączenia mikrokontrolera ATMEGA16 z programatorem USBasp.
Obsługa wyświetlacza LCD
Sterowanie wyświetlaczem odbywa się poprzez siedem linii we/wy mikrokontrolera:
trzy linie sterujące: RS, RW, E,
cztery linie danych D4,D5,D6,D7.
Wyświetlacz programowany jest w trybie 4-bitowym (cztery linie danych), wyprowadzenia wyświetlacza D0, D1, D2 ,D3 nie będą wykorzystywane.
Podłączony rezystor R służy do zmiany kontrastu wyświetlacza.
Pakiet programów WinAVR zawiera podstawowe narzędzia do pisania programu, kompilacji języka C programu na kod maszynowy oraz sam programator, do tworzenia programów dla 8-bitowych mikroprocesorów AVR ATMEL. Program jest darmowy.
Pakiet programów WinAVR składa się z:
MFile – kreator, edytor plików „Makefile”. Pliki „Makefile” pozwala na zautomatyzowanie procesu kompilacji programów, ponieważ zawiera reguły programowania np. rodzaj programowanego mikrokontrolera, użyty programator itp.
Programmers Notepad – edytor tekstu pozwala na pisanie programów w wybranym języku, kompilację na kod maszynowy.
Program Sinaprog uważany jest za najbardziej wygodny w obsłudze. Posiada on funkcję automatycznego wyszukiwania rodzaju podłączonego mikrokontrolera. Pozwala na wygodną zmianę ustawień fuesbit’ów oraz lockbit’ów. Program nie wymaga instalowania. Jest bardzo prosty w obsłudze.
Sinaprog został użyty do przesłania programu do pamięci mikrokontrolera, ponieważ pakiet programów WinAVR nie ma wszystkich potrzebnych bibliotek do programowania użytego wyświetlacza 2x16.
Programowanie wyświetlacza LCD rozpocząć należy od utworzenia folderu – katalogu projektu np. LCD, w którym będą zapisywane programy oraz inne potrzebne pliki używane podczas programowania.
Skopiować należy do katalogu projektu LCD plik: hd44780.c, hd44780.h znajdujące się w folderze Wyświetlacz LCD. Plik hd44780.c zawiera definicje funkcji do obsługi wyświetlaczy, zaś w pliku hd44780.h znajdują się deklaracje tych funkcji, makrodefinicje przypisujące sygnały wyświetlacza do wybranych wyprowadzeń AVRa oraz kilka przydatnych makroinstrukcji.
Następnie należy uruchomić program MFile i ustawić parametry programowania w nim.
Okno programu MFile.
Wpisać nazwę projektu, nazwa projektu musi być taka sama jak nazwa programu zapisanego w Programmer Notepad:
Makefile » Main file name » lcd
Wybrać mikrokontroler:
Makefile » MCU type » ATmega » atmega16.
Wybrać typ programatora:
programator, który został użyty nie jest na liście dostępnych, dlatego należy dodać go ręcznie w następujący sposób:
Make file » Enable Editing of » następnie odszukać na stronie AVRDUDE_Programmer = stk500v2 i zamiast stk500v2 wpisać usbasp.
Wybrać port do którego jest podłączony programator:
Makefile » Port » usb
Wczytać potrzebne definicje funkcji do obsługi wyświetlaczy:
Make file » C/C++source files(s) » w okienku wpisać nazwę pliku: hd44780.c (nazwę pliku należy wpisać wraz z rozszerzeniem .c).
Zmienić częstotliwość sygnału taktującego procesor:
częstotliwość należy zmienić ręcznie ponieważ nie ma takiej opcji w menu: Make file » Enable Editing of » następnie odszukać na stronie #Processor frequency i wpisać częstotliwość sygnału taktującego procesor F_CPU = 1000000
Częstotliwość można też zdefiniować podczas pisania programu na początku poprzez:
#define F_CPU 1000000UL
Kończąc pracę należy zapisać parametry w folderze utworzonym na początku LCD, nie zmieniając nazwy podczas zapisywania musi zostać Makefile w przeciwnym wypadku mogą być problemy podczas kompilacji programu.
File » Save as » Makefile
Kolejnym etapem programowania wyświetlacza jest program Programmers Notepad służy do pisania programu oraz kompilacji na kod maszynowy.
Otworzyć należy program Programmers Notepad a następnie postępować zgodnie z punkami poniżej.
Okno programu Programmers Notepad.
Otworzyć należy nowy plik języka progrmownia C:
File » New » C/C++
Napisać przykładowy program, który znajduje się poniżej lub skopiować go z folderu Wyświetlacz LCD zapisanego w notatniku pod nazwą: LCD1. Program służy wyświetlania słowa „Lukasz”.
Zapisać program w wcześniej utworzonym folderze LCD, ważne jest aby nazwa miała rozszerzenie .c oraz musi być taka sama jak nazwa projektu w Makefile czyli lcd
File » Save as » lcd.c
Kompilacja – zamiana języka programowania na kod maszynowy :
Tool » Make All
Zostanie utworzony plik lcd.hex w folderze projektu LCD
Jeśli wszystko zostało poprawnie wykonane w oknie Output zostanie wyświetlony komunikat:
„Process Exit Code: 0”
Następnie wysłać należy program do pamięci mikrokontrolera za pomocą programu SinaProg:
Okno programu SinaProg
Przed wysłaniem programu należy ustawić parametry:
W polu Hex file należy wybrać program do przesłania, wybrać należy go z folderu LCD plik lcd.hex
W polu Device należy wybrać używany mikrokontroler czyli ATmega16.
W polu Fuses częstotliwość taktowania najlepiej Int 1MHz.
W polu Programmer wybrać należy używany programator czyli USBasp.
Po wybraniu parametrów za pomocą ikony Program należy wysłać program do mikrokontrolera.
Przykładowy program do wyświetlania słowa „Lukasz”:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include "hd44780.h"
int main(void)
{
/* Napisy przechowujemy w tablicach */
char str1[ ] = "Lukasz";
/* Funkcja inicjalizuje wyswietlacz */
lcd_init();
{
// Wlacza wyswietlanie z widocznym kursorem
LCD_DISPLAY(LCDDISPLAY|LCDCURSOR);
LCD_LOCATE(15,1);
LCD_CLEAR;
LCD_LOCATE(2,0);
//Funkcja lcd_puts wysyla do
//wyswietlacza ciag znakow
lcd_puts(str1);
_delay_ms(800);
LCD_LOCATE(1,0);
}
return 0;
}
Krótki opis funkcji użytych w programie.
Celem tego przykładu jest pokazanie w jaki sposób napisać cokolwiek na ekranie wyświetlacza z użyciem funkcji zapisanych w pliku hd44780.c
Na początku pliku programu należy wstawić polecenie preprocesora include dołączając plik hd44780.h zawierający deklaracje funkcji zdefiniowanych w pliku hd44780.c ma to wyglądać następująco:
#include "hd44780.h"
W kolejnym krokiem jest wywołanie funkcję lcd_init, funkcja ta realizuje procedurę programowej inicjalizacji wyświetlacza i następnie przełącza interfejs wyświetlacza do trybu 4-bitowego. Po wykonaniu funkcji lcd_init wyświetlacz zostaje wygaszony. Włączyć wyświetlanie można z pomocą makroinstrukcji LCD_DISPLAY:
/* Funkcja inicjalizuje wyświetlacz*/
lcd_init();
/* Włącza wyświetlanie */
LCD_DISPLAY(LCDDISPLAY);
Z pomocą makra LCD_LOCATE wskazać należy pozycje na ekranie wyświetlacza (kolumnę i wiersz), gdzie należy coś napisać. Kolumny i wiersze liczone są zaczynając od zera.
/* szósta kolumna, pierwszy wiersz */
LCD_LOCATE(5,0);
Pojedyncze znaki można wysyłać do wyświetlacza wykorzystując makro: LCD_WRITE_DATA
.
/* Wysyła do wyświetlacza jeden znak*/
LCD_WRITE_DATA('S');
Po wykonaniu LCD_WRITE_DATA numer kolumny zwiększa się o jeden, więc jeśli zostanie wysłane kilka znaków jeden za drugim, to zobaczyć można na ekranie wyświetlacza napis. Napisy (ciągi znaków zakończone zerem) można wysyłać do wyświetlacza funkcją lcd_puts. Funkcja lcd_puts po prostu wysyła do wyświetlacza znak po znaku cały napis wywołując w pętli makro LCD_WRITE_DATA. Jako argument funkcji lcd_puts wstawia się nazwę tabeli z tekstem lub stałą napisową.
/* Funkcja lcd_puts wysyła do wyświetlacza ciąg znaków */
lcd_puts(str1);
/* Jako argumentu funkcji można wstawić stałą napisową */
lcd_puts("Programy");
Makro LCD_CLEAR czyści cały ekran wyświetlacza i ustawia aktualny numer kolumny i wiersza na 0.
/* Czyści cały ekran */
LCD_CLEAR;
/* Włącza wyświetlanie i kursor */
LCD_DISPLAY(LCDDISPLAY|LCDCURSOR);
Plik hd44780.c zawiera zestaw funkcji do obsługi wyświetlacza.
#include<avr/io.h>
#include<util/delay.h>
#include "hd44780.h"
/*--------------------------------------------------------*/
/* Zapis danej lub instrukcji */
void WriteToLCD (unsigned char v,unsigned char rs)
{
SET_OUT_LCD_D4;
SET_OUT_LCD_D5;
SET_OUT_LCD_D6;
SET_OUT_LCD_D7;
if(v&0x10) SET_LCD_D4; else CLR_LCD_D4;
if(v&0x20) SET_LCD_D5; else CLR_LCD_D5;
if(v&0x40) SET_LCD_D6; else CLR_LCD_D6;
if(v&0x80) SET_LCD_D7; else CLR_LCD_D7;
CLR_LCD_E;
if(rs) SET_LCD_RS;else CLR_LCD_RS;
LCD_NOP;
SET_LCD_E;
LCD_NOP;
CLR_LCD_E;
LCD_NOP;
if(v&0x01) SET_LCD_D4; else CLR_LCD_D4;
if(v&0x02) SET_LCD_D5; else CLR_LCD_D5;
if(v&0x04) SET_LCD_D6; else CLR_LCD_D6;
if(v&0x08) SET_LCD_D7; else CLR_LCD_D7;
LCD_NOP;
SET_LCD_E;
LCD_NOP;
CLR_LCD_E;
LCD_NOP;
_delay_us(100);
}
/*---------------------------------------------------------*/
/* Inicjalizacja wyswietlacza */
void lcd_init(void)
{
_delay_ms(31);
SET_OUT_LCD_RS;
SET_OUT_LCD_E;
SET_OUT_LCD_D4;
SET_OUT_LCD_D5;
SET_OUT_LCD_D6;
SET_OUT_LCD_D7;
CLR_LCD_E;
CLR_LCD_RS;
SET_LCD_D4;
SET_LCD_D5;
CLR_LCD_D6;
CLR_LCD_D7;
LCD_NOP;
SET_LCD_E;
LCD_NOP;
CLR_LCD_E;
LCD_NOP;
delay_ms(10);
LCD_NOP;
SET_LCD_E;
LCD_NOP;
CLR_LCD_E;
LCD_NOP;
_delay_ms(2);
LCD_NOP;
SET_LCD_E;
LCD_NOP;
CLR_LCD_E;
LCD_NOP;
_delay_ms(2);
CLR_LCD_D4;
LCD_NOP;
SET_LCD_E;
LCD_NOP;
CLR_LCD_E;
LCD_NOP;
_delay_us(60);
WriteToLCD (0x28 , LCDCOMMAND) ;
_delay_us(60);
LCD_DISPLAY(0) ;
_delay_us(60);
LCD_CLEAR ;
_delay_ms(2);
LCD_ENTRY_MODE(LCDINCREMENT) ;
_delay_us(60);
}
/*--------------------------------------------------------*/
/* Wyswietla tekst na aktualnej pozycji kursora */
void lcd_puts(char *str)
{
unsigned char i =0;
while( str[i])
LCD_WRITE_DATA(str[i++]) ;
}
W pliku hd44780.h znajdują się deklaracje funkcji do obsługi wyświetlacza, makrodefinicje przypisujące sygnały wyświetlacza do wybranych wyprowadzeń AVRa oraz kilka przydatnych makroinstrukcji.
/*
Plik hd44780.h
*/
#ifndef LCD_HD44780
#define LCD_HD44780
#include<util/delay.h>
/* RS */
#define SET_OUT_LCD_RS DDRA |= _BV(PA5)
#define SET_LCD_RS PORTA |= _BV(PA5)
#define CLR_LCD_RS PORTA &= ~_BV(PA5)
/* E */
#define SET_OUT_LCD_E DDRA |= _BV(PA4)
#define SET_LCD_E PORTA |= _BV(PA4)
#define CLR_LCD_E PORTA &= ~_BV(PA4)
/* D4 */
#define SET_OUT_LCD_D4 DDRA |= _BV(PA3)
#define SET_LCD_D4 PORTA |= _BV(PA3)
#define CLR_LCD_D4 PORTA &= ~_BV(PA3)
/* D5 */
#define SET_OUT_LCD_D5 DDRA |= _BV(PA2)
#define SET_LCD_D5 PORTA |= _BV(PA2)
#define CLR_LCD_D5 PORTA &= ~_BV(PA2)
/* D6 */
#define SET_OUT_LCD_D6 DDRA |= _BV(PA1)
#define SET_LCD_D6 PORTA |= _BV(PA1)
#define CLR_LCD_D6 PORTA &= ~_BV(PA1)
/* D7 */
#define SET_OUT_LCD_D7 DDRA |= _BV(PA0)
#define SET_LCD_D7 PORTA |= _BV(PA0)
#define CLR_LCD_D7 PORTA &= ~_BV(PA0)
#define LCD_NOP asm volatile("nop\n\t""nop\n\t" "nop\n\t" "nop\n\t"::);
#define LCDCOMMAND 0
#define LCDDATA 1
#define LCD_LOCATE(x,y) WriteToLCD(0x80|((x)+((y)*0x40)), LCDCOMMAND); _delay_us(60)
#define LCD_CLEAR WriteToLCD(0x01, LCDCOMMAND); _delay_ms(2)
#define LCD_HOME WriteToLCD(0x02, LCDCOMMAND); _delay_ms(2)
/* IDS */
#define LCDINCREMENT 0x02
#define LCDDECREMENT 0x00
#define LCDDISPLAYSHIFT 0x01
#define LCD_ENTRY_MODE(IDS) WriteToLCD(0x04|(IDS), LCDCOMMAND); _delay_us(60)
/* BCD */
#define LCDDISPLAY 0x04
#define LCDCURSOR 0x02
#define LCDBLINK 0x01
#define LCD_DISPLAY(DCB) WriteToLCD(0x08|(DCB), LCDCOMMAND); _delay_us(60)
/* RL */
#define LCDLEFT 0x00
#define LCDRIGHT 0x04
#define LCD_SHIFT_DISPLAY(RL) WriteToLCD(0x18|(RL), LCDCOMMAND); _delay_us(60)
#define LCD_SHIFT_CURSOR(RL) WriteToLCD(0x10|(RL), LCDCOMMAND); _delay_us(60)
#define LCD_CGRAM_ADDRESS(A) WriteToLCD(0x40|((A)&0x3f), LCDCOMMAND); _delay_us(60)
#define LCD_DDRAM_ADDRESS(A) WriteToLCD(0x80|((A)&0x7f), LCDCOMMAND); _delay_us(60)
#define LCD_WRITE_DATA(D) WriteToLCD((D),LCDDATA)
void lcd_init(void);
void WriteToLCD(unsigned char v,unsigned char rs);
void lcd_puts(char *str);
#endif
III. Programowanie wyświetlacza zbudowanego z matryc LED.
Schemat połączenia mikrokontrolera ATMEGA8 z wyświetlaczem LED.
Schemat połączenia mikrokontrolera ATMEGA8 z wyświetlaczem LED.
Schemat połączenia mikrokontrolera ATMEGA8 z programatorem USBasp.
Obsługa wyświetlacza LED.
Matryce sterowane są za pośrednictwem mikrokontrolera Atmega8, który jest programowany poprzez programator USBasp.
Wyświetlanie na matrycy polega na zapalaniu i gaszeniu odpowiednich diod tak aby zapalone diody tworzyły żądane słowo, znak, hasło.
Pakiet programów WinAVR zawiera podstawowe narzędzia do pisania programu, kompilacji języka C programu na kod maszynowy oraz sam programator, do tworzenia programów dla 8-bitowych mikroprocesorów AVR ATMEL. Program jest darmowy.
Pakiet programów WinAVR składa się z:
MFile – kreator, edytor plików „Makefile”. Pliki „Makefile” pozwala na zautomatyzowanie procesu kompilacji programów, ponieważ zawiera reguły programowania np. rodzaj programowanego mikrokontrolera, użyty programator itp.
Programmers Notepad – edytor tekstu pozwala na pisanie programów w wybranym języku, kompilację na kod maszynowy oraz wysyłanie do mikrokontrolera.
Programowanie matryc LED rozpocząć należy od utworzenia folderu – katalogu projektu np. LED, w którym będą zapisywane programy oraz inne potrzebne pliki używane podczas programowania.
Skopiować należy do katalogu projektu LED plik: hc595.h znajdujące się w folderze Wyświetlacz LED. Plik hc595.h zawiera deklaracje użytych funkcji, oraz kilka przydatnych makroinstrukcji.
Następnie należy uruchomić program MFile i ustawić parametry programowania w nim.
Okno programu MFile.
Wpisać nazwę projektu, nazwa projektu musi być taka sama jak nazwa programu zapisanego w Programmer Notepad:
Makefile » Main file name » led
Wybrać mikrokontroler:
Makefile » MCU type » ATmega » atmega8.
Wybrać typ programatora:
programator, który został użyty nie jest na liście dostępnych, dlatego należy dodać go ręcznie w następujący sposób:
Make file » Enable Editing of » następnie odszukać na stronie AVRDUDE_Programmer = stk500v2 i zamiast stk500v2 wpisać usbasp.
Wybrać port do którego jest podłączony programator:
Makefile » Port » usb
Zmienić częstotliwość sygnału taktującego procesor:
częstotliwość należy zmienić ręcznie ponieważ nie ma takiej opcji w menu: Make file » Enable Editing of » następnie odszukać na stronie #Processor frequency i wpisać częstotliwość sygnału taktującego procesor F_CPU = 1000000
Częstotliwość można też zdefiniować podczas pisania programu na początku poprzez:
#define F_CPU 1000000UL
Kończąc pracę należy zapisać parametry w folderze utworzonym na początku LCD, nie zmieniając nazwy podczas zapisywania musi zostać Makefile w przeciwnym wypadku mogą być problemy podczas kompilacji programu.
File » Save as » Makefile
Kolejnym etapem programowania wyświetlacza jest program Programmers Notepad służy do pisania programu oraz kompilacji na kod maszynowy.
Otworzyć należy program Programmers Notepad a następnie postępować zgodnie z punkami poniżej.
Okno programu Programmers Notepad.
Otworzyć należy nowy plik języka progrmownia C:
File » New » C/C++
Napisać przykładowy program, który znajduje się poniżej lub skopiować go z folderu Wyświetlacz LED zapisanego w notatniku pod nazwą: LED1. Program służy wyświetlania słowa „Lukasz”.
Zapisać program w wcześniej utworzonym folderze LCD, ważne jest aby nazwa miała rozszerzenie .c oraz musi być taka sama jak nazwa projektu w Makefile czyli lcd
File » Save as » led.c
Kompilacja – zamiana języka programowania na kod maszynowy :
Tool » Make All
Zostanie utworzony plik program1.hex w folderze projektu LED.
Jeśli wszystko zostało poprawnie wykonane w oknie Output zostanie wyświetlony komunikat:
„Process Exit Code: 0”
Wysłanie programu do pamięci mikrokontrolera:
Tools » Program
Uruchomiony zostaje program „avrdude” odczyta program program1.hex i zaprogramuje pamięć Flash układu atmega8.
Jeśli programowanie zakończy się pomyślnie to w oknie Output edytora pojawi się komunikat:
Process Exit Code: 0.
Przykładowy program.
/*
* program1
*
* Created: 2013-03-23 15:25:11
* Author: Lukasz
* Atmel Studio 6
* ATmega8A 8MHz
*/
#define F_CPU 800000UL // zegar 8MHz
#include <avr/io.h>
#include <util/delay.h>
#include "hc595.h" // makra
void write_to_HC595(char data);
const char bitmap[32] = {0b10000000, 0b00000000, 0b00001111, 0b00000011, // bitmapa do wyswietlenia
0b10100100, 0b10000001, 0b11101000, 0b01111011,
0b11000100, 0b10100101, 0b00101100, 0b00001011,
0b10000100, 0b10101001, 0b00100111, 0b00010011,
0b10000100, 0b10110001, 0b11100001, 0b00100011,
0b11110100, 0b10110001, 0b00101111, 0b01000000,
0b00000111, 0b10101001, 0b00100000, 0b01111011,
0b00000000, 0b00100100, 0b00000000, 0b00000011};
int main(void) {
char buf[32];
char i, row;
SET_OUT_PB0; // PB0 jako wyjscie ENABLE do modulu matryc LED
SET_OUT_PB1; // PB1 jako wyjscie CLK -//-
SET_OUT_PB2; // PB2 jako wyjscie DATA -//-
DDRD = 0xFF; // port D jako wyjscie podlaczone do wierszy ROW0-ROW7 modulu matryc LED
PORTD = 0x00; // zgas wszystkie wiersze
for (i = 0; i < 32; i++)
buf[i] = bitmap[i]; // teraz na obrazie znajdujacym sie w buf mozna
// wykonywac dowolne operacje
for (;;)
{
row = 0x01; // w row pierwszy wiersz (pierwsza od gory linia obrazu)
for (i = 0; i < 8; i++) { // poczatek procedury wyswietlajacej obraz
// powtorz w petli dla kazdej z 8-u linii obrazu
CLR_CLOCK; // ustaw odpowiednio piny sterujace ukladami
CLR_ENABLE; // HC595 modulu matryc LED
// kazda linia obrazu to 4 bajty, ktore trzeba wyslac do modulu
write_to_HC595(buf[i*4+3]); // wyslanie 3 bajtu obrazu i-tej linii
write_to_HC595(buf[i*4+2]); // wyslanie 2 bajtu obrazu i-tej linii
write_to_HC595(buf[i*4+1]); // wyslanie 1 bajtu obrazu i-tej linii
write_to_HC595(buf[i*4]); // wyslanie 0 bajtu obrazu i-tej linii
SET_ENABLE; // zatrzasnij dane w HC595 i wystaw na anody matryc LED
CLR_ENABLE;
PORTD = row; // wlacz i-ta linie obrazu (w row aktualny
// wiersz (0x01,0x02,0x04,...,0x40,0x80))
_delay_us(1250); // odczekaj 1250us (100Hz * 8wierszy = 800Hz -> 1250us)
PORTD = 0x00; // zgas wszystkie wiersze
row <<= 1; // teraz w row numer kolejnego wiersza
}
}
}
void write_to_HC595(char temp) // precedura wysylajaca 1 bajt linii obrazu do modulu LED
{
char i;
for (i = 0; i < 8; i++) // wysylaj 8 kolejnych bitow do DATA
{
if((temp & 0x80) != 0) // poczawszy od bitu MSB do LSB
SET_DATA; // bit 1
else
CLR_DATA; // bit 0
SET_CLOCK;
CLR_CLOCK;
temp <<= 1;
}
}
Krótki opis programu:
Najważniejsze w programie jest odpowiednie zapalanie diod tablica poniżej przedstawia jakie diody mają być zapalone w celu wyświetlenia słowa: „Lukasz”:
0b10100100, 0b10000001, 0b11101000, 0b01111011,
0b11000100, 0b10100101, 0b00101100, 0b00001011,
0b10000100, 0b10101001, 0b00100111, 0b00010011,
0b10000100, 0b10110001, 0b11100001, 0b00100011,
0b11110100, 0b10110001, 0b00101111, 0b01000000,
0b00000111, 0b10101001, 0b00100000, 0b01111011,
0b00000000, 0b00100100, 0b00000000, 0b00000011};
Aby było bardziej widoczne co przedstawia tablica poniżej pokazane jest to w kolorze: