DIY TV LCD skärm med Arduino och Smart fjärrkontroll (4 / 5 steg)
Steg 4: Gör kodning och ansluta Smart fjärrkontrollen
Nästa steg är tekniskt svårast, kodning. Läsa inte all kod här, denna kod är kod språk C, få en miljö att programmera en styrelse med mottagare som tar emot vågorna från smarta fjärrkontrollen, jag har en smart fjärr form och Osepp kit och den är kompatibel med arduino. Kopiera denna kod på din miljö och programmera den till arduino eller styrelsen som är ansluten till en LCD-skärm/TV.
/****************************************************************************
LCD-AVR-4d.c - en HD44780U baserade LCD med en Atmel ATmega processor Copyright (C) 2013 Donald Weiman (weimandn programmet är fri programvara: du kan vidaredistribuera det och/eller modifiera det i enlighet med GNU General Public License som offentliggörs av Free Software Foundation, antingen version 3 av licensen, eller (vid ditt alternativ) någon senare version. Detta program är distribuerat med förhoppning att det kommer att vara användbart men helt utan garantier; utan att ens underförstådd garanti om SÄLJBARHET eller lämplighet för ett visst ändamål. Se GNU General Public License för mer detaljer. Du bör ha fått en kopia av GNU General Public License tillsammans med detta program. Om inte, se. * / / *** Fil: LCD-AVR-4d.c datum: den 16 September, 2013 Target: ATmega328 kompilator: avr-gcc (AVR Studio 6) författare: Donald Weiman Summary: 4-bitars data gränssnitt, upptagen flaggan inte genomförs. Alla LCD pin kan anslutas till en ledig I/O port. Innehåller en enkel skriva sträng rutin. * / / *** Programmet anteckningar *** detta program använder ett gränssnitt för 4-bitars men använder inte flaggan upptagen för att avgöra när LCD-controller är klar. LCD-RW linjen (pin 5) inte är ansluten till upp och det måste vara ansluten till jord för att programmet ska fungera. Alla tidsfördröjningar är längre än de som anges i de flesta datablad för att rymma långsammare än normal LCD-moduler. Detta krav är väl dokumenterade men nästan alltid ignoreras. Informationen anges i en fotnot längst ner i högra (körningstid) kolumnen Instruktion. De fyra data linjerna samt två kontroll linjer kan genomföras på alla tillgängliga I/O stift i någon hamn. Dessa är de anslutningar som används för det här programmet:------| ATmega328 || LCD | | | | | | PD7|---------------->| D7 || PD6|---------------->| D6 || PD5|---------------->| D5 || PD4|---------------->| D4 | | | | D3 | | | | D2 | | | | D1 | | | | D0 | | | | | | PB1|---------------->| E | | | GND---> |RW || PB0|---------------->| RS | ----------- ---------- **************************************************************************/
#define F_CPU 16000000UL
#include #include
LCD-gränssnitt (bör håller med diagrammet ovan) / / kontrollera att LCD-RW PIN-koden är kopplad till GND #define lcd_D7_port PORTD / / lcd D7 anslutning #define lcd_D7_bit PORTD7 #define lcd_D7_ddr DDRD
#define lcd_D6_port PORTD / / lcd D6 anslutning #define lcd_D6_bit PORTD6 #define lcd_D6_ddr DDRD
#define lcd_D5_port PORTD / / lcd D5 anslutning #define lcd_D5_bit PORTD5 #define lcd_D5_ddr DDRD
#define lcd_D4_port PORTD / / lcd D4 anslutning #define lcd_D4_bit PORTD4 #define lcd_D4_ddr DDRD
#define lcd_E_port PORTB / / lcd aktivera pin-#define lcd_E_bit PORTB1 #define lcd_E_ddr DDRB
#define lcd_RS_port PORTB / / lcd registrera dig väljer du pin #define lcd_RS_bit PORTB0 #define lcd_RS_ddr DDRB
LCD modul information #define lcd_LineOne 0x00 / / start av linje 1 #define lcd_LineTwo 0x40 / / start av linje 2 //#define lcd_LineThree 0x14 / / start av linje 3 (20 x 4) //#define lcd_lineFour 0x54 / / start av linje 4 (20 x 4) //#define lcd_LineThree 0x10 / / start av linje 3 (16 x 4) //#define lcd_lineFour 0x50 / / start av linje 4 (16 x 4)
LCD instruktioner #define lcd_Clear 0b00000001 / / byta ut alla tecken med ASCII "utrymme" #define lcd_Home 0b00000010 / / tillbaka markören till första position på första raden #define lcd_EntryMode 0b00000110 / / flytta markören från vänster till höger på läsa/skriva #define lcd_DisplayOff 0b00001000 / / slå skärm #define lcd_DisplayOn 0b00001100 / / visar på markören bort, inte blinka karaktär #define lcd_FunctionReset 0b00110000 / / reset LCD #define lcd_FunctionSet4bit 0b00101000 / / 4-bitars data , 2-raders display, 5 x 7 teckensnitt #define lcd_SetCursor 0b10000000 / / ställa in markörens position
Programmera ID uint8_t program_author [] = "Donald Weiman"; uint8_t program_version [] = "LCD-AVR - 4 d (gcc)"; uint8_t program_date [] = "Sep 16, 2013";
Funktionen prototyper void lcd_write_4(uint8_t); void lcd_write_instruction_4d(uint8_t); void lcd_write_character_4d(uint8_t); void lcd_write_string_4d(uint8_t *); void lcd_init_4d(void);
/ *** Main programkod *** / int main(void) {/ / configure mikroprocessor stiften för data linjer lcd_D7_ddr | = (1 <
Konfigurera mikroprocessor stiften för kontroll linjer lcd_E_ddr | = (1 <
initiera LCD controller som bestäms av den definierar (LCD instruktioner) lcd_init_4d(); initiera LCD-skärmen för en 4-bitars gränssnitt
Visa den första raden i information lcd_write_string_4d(program_author);
Ställ markören för att börja på andra raden lcd_write_instruction_4d(lcd_SetCursor | lcd_LineTwo); _delay_us(80); 40 uS fördröja (min)
Visa den andra raden med information lcd_write_string_4d(program_version);
oändlig loop while(1); Return 0; } / *** Slutet av programmets kod ***
* === 4-bitars LCD funktioner === * / / * namn: lcd_init_4d syfte: initiera LCD-modulen för ett gränssnitt för 4-bitars data träder: likställer (LCD instruktioner) inrättats för önskad åtgärd Exit: inga parametrar anteckningar: bruk tiden förseningar i stället för att kontrollera flaggan upptagen * / void lcd_init_4d(void) {/ / Power-up fördröjning _delay_ms(100); / / inledande 40 ms fördröjning
VIKTIGT - på denna punkt LCD-modulen är i 8-bitars läge och det förväntar sig att få / / 8 databitar, en bit på varje av dess 8 data linjer, varje gång den "E" linjen är pulsade. / / Eftersom LCD-modulen är kopplat för 4-bitars läge, endast de övre fyra data linjerna är anslutna till / / mikroprocessorn och lägre fyra data linjer lämnas normalt öppna. Därför, när / / "E" linjen är pulsade, LCD controller kommer att läsa oavsett data har satts upp på övre / / fyra data linjer och lägre fyra data linjer kommer att vara hög (på grund av interna pull-up kretsar). / / Lyckligtvis instruktionen "FunctionReset" inte bryr sig om vad som är på lägre fyra bitar så / / denna instruktion kan skickas på bara fyra tillgängliga data linjer och det kommer att tolkas / / ordentligt av LCD-controller. 'Lcd_write_4' subrutin kommer att åstadkomma detta om den / / kontrollera fodrar tidigare har konfigurerats korrekt.
Ställ in raderna RS och E för 'lcd_write_4' subrutin. lcd_RS_port & = ~(1<
Återställa LCD controller lcd_write_4(lcd_FunctionReset); första delen av reset sekvens _delay_ms(10); 4.1 mS fördröjning (min)
lcd_write_4(lcd_FunctionReset); andra delen av reset sekvens _delay_us(200); 100uS fördröjning (min)
lcd_write_4(lcd_FunctionReset); tredje delen av reset sekvens _delay_us(200); denna försening utelämnas i databladet
Preliminära funktionen in instruktion - används enbart för att ange 4-bitars läge. Antalet rader eller teckensnitt kan inte ställas in på denna tid eftersom registeransvarige är fortfarande i den / / 8-bitars läge, men det dataöverföring-läget kan ändras eftersom denna parameter avgörs av en / / övre fyra bitar av undervisningen. lcd_write_4(lcd_FunctionSet4bit); Ange 4-bitars läge _delay_us(80); 40uS fördröjning (min)
Funktionen Ange instruktion lcd_write_instruction_4d(lcd_FunctionSet4bit); Ange läge, linjer och teckensnitt _delay_us(80); 40uS fördröjning (min)
Nästa tre instruktionerna anges i databladet som en del av initieringsrutinen / / så är det en bra idé (men troligen inte nödvändigt) att göra dem bara som anges och sedan göra om dem / / senare om programmet kräver en annan konfiguration.
Visa på/av kontroll instruktion lcd_write_instruction_4d(lcd_DisplayOff); slå display OFF _delay_us(80); 40uS fördröjning (min)
Tydlig Display instruktion lcd_write_instruction_4d(lcd_Clear); tydlig display RAM _delay_ms(4); 1.64 mS fördröjning (min)
// ; Posten inställt instruktion lcd_write_instruction_4d(lcd_EntryMode); Ange önskat SKIFT egenskaper _delay_us(80); 40uS fördröjning (min)
Detta är slutet av LCD controller initiering som anges i databladet, men displayen / / har lämnats i skick som OFF. Detta är en bra tid att vända visningen tillbaka ON. Visa på/av kontroll instruktion lcd_write_instruction_4d(lcd_DisplayOn); slå display ON _delay_us(80); 40uS fördröjning (min)}
/*........................................................................... Namn: lcd_write_string_4d; Syfte: Visa en sträng med tecken på posten LCD: (theString) är strängen ska visas Exit: inga parametrar anteckningar: bruk tiden förseningar i stället för att kontrollera flaggan upptagen * / void lcd_write_string_4d (uint8_t theString[]) {flyktiga int i = 0; / / karaktär counter * / medan (theString [i]! = 0) {lcd_write_character_4d(theString[i]); i ++; _delay_us(80); / / 40 uS fördröjning (min)}}
/*........................................................................... Namn: lcd_write_character_4d syfte: skicka en byte av uppgifter till registret LCD data träder: (resultaten) är informationen som ska skickas till data registrera Exit: inga parametrar anteckningar: behandlar inte RW (upptagen flagga är inte implementerat) * /
void lcd_write_character_4d(uint8_t theData) {lcd_RS_port | = (1 <
/*........................................................................... Namn: lcd_write_instruction_4d syfte: skicka en byte av information till LCD instruktion registret post: (theInstruction) är informationen som ska skickas till den instruktion registret Exit: inga parametrar anteckningar: behandlar inte RW (upptagen flagga är inte implementerat) * / void lcd_write_instruction_4d(uint8_t theInstruction) {lcd_RS_port & = ~(1<
/*........................................................................... Namn: lcd_write_4 syfte: skicka en byte av information till LCD-modulen posten: (theByte) är informationen som ska skickas till önskad LCD registret RS är konfigurerad för önskad LCD registret E är låg RW är låg Exit: inga parametrar anteckningar: använda tidsfördröjningar eller upptagen flaggan * / void lcd_write_4(uint8_t theByte) {lcd_D7_port & = ~(1<
lcd_D6_port & = ~(1<
lcd_D5_port & = ~(1<
lcd_D4_port & = ~(1<
skriva data / / "Adress ställtid" (40 nS) lcd_E_port | = (1 <
Nästa sak du kan göra är valfritt, du kan ansluta din smartphone eller Samsung till arduino, detta är ganska svårt att göra, men du kan ladda ner en app och har här koden från IR-fjärrkontroll med app och anpassa den.