Stap 4: Het doen van de codering en verbinding maken met de slimme afstandsbediening
De volgende stap is technisch het moeilijkst, de codering. Niet alle code hier lezen, deze code is in de taal van de code C, krijgen een milieu te programmeren van een bord met de ontvanger die de golven ontvangt met de slimme afstandsbediening, ik heb een slimme externe vorm en Osepp kit en het is compatibel met arduino. Kopieer deze code naar uw omgeving en het programma moet de arduino of de kamer die is aangesloten op het LCD-scherm/TV.
/****************************************************************************
LCD-AVR-4d.c - gebruik een HD44780U gebaseerde LCD met een Atmel ATmega-processor Copyright (C) 2013 Donald Weiman (weimandn dit programma is vrije software: je kunt het herdistribueren en/of aanpassen onder de voorwaarden van de GNU General Public License zoals gepubliceerd door de Free Software Foundation, versie 3 van de licentie, of (naar uw keuze) een latere versie. Dit programma is gedistribueerd in de hoop dat het nuttig zal zijn, maar zonder enige garantie; zelfs zonder de impliciete garantie van verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de GNU General Public License voor meer details. U moet ontvangen een kopie van de GNU General Public License along with this program. Als dat niet het geval is, zie. * / / *** Bestand: LCD-AVR-4d.c, datum: 16 September 2013 richten: ATmega328 Compiler: avr-gcc (AVR Studio 6) Auteur: Donald Weiman Summary: 4-bits gegevens interface, drukke vlag niet ten uitvoer gelegd. Elke LCD-pin kan worden aangesloten op een willekeurige beschikbare poort I/O. Omvat een eenvoudige schrijven tekenreeks routine. * / / *** Programma notities *** dit programma maakt gebruik van een 4-bits Gegevensinterface maar doet niet de drukke vlag gebruiken om te bepalen wanneer de LCD controller is klaar. De regel van de LCD RW (pin 5) niet is verbonden met de uP en het moet worden verbonden met GND voor het programma te laten functioneren. Alle vertragingen zijn langer dan die welke in de meeste gegevensbladen om langzamer dan normale LCD-modules tegemoet te komen. Deze eis is goed gedocumenteerd, maar bijna altijd genegeerd. De informatie in een notitie aan de onderkant van de kolom van de rechterhand (Execution Time) van de instructie ligt. De vier data lijnen, evenals de controle van de twee lijnen kunnen worden uitgevoerd op elke beschikbare I/O pin van een willekeurige poort. Dit zijn de verbindingen die worden gebruikt voor dit programma:------| 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-interface (moet eens met de bovenstaande diagram) / / ervoor te zorgen dat de LCD RW pin is verbonden met GND #define lcd_D7_port PORTD / / lcd D7 verbinding #define lcd_D7_bit PORTD7 #define lcd_D7_ddr DDRD
#define lcd_D6_port PORTD / / lcd D6 verbinding #define lcd_D6_bit PORTD6 #define lcd_D6_ddr DDRD
#define lcd_D5_port PORTD / / lcd D5 verbinding #define lcd_D5_bit PORTD5 #define lcd_D5_ddr DDRD
#define lcd_D4_port PORTD / / lcd D4 verbinding #define lcd_D4_bit PORTD4 #define lcd_D4_ddr DDRD
#define lcd_E_port PORTB / / lcd Enable pin #define lcd_E_bit PORTB1 #define lcd_E_ddr DDRB
#define lcd_RS_port PORTB / / lcd Registreer Selecteer pin #define lcd_RS_bit PORTB0 #define lcd_RS_ddr DDRB
LCD module informatie #define lcd_LineOne 0x00 / / start van lijn 1 #define lcd_LineTwo 0x40 / / begin van de lijn 2 //#define lcd_LineThree 0x14 / / start van lijn 3 (20 x 4) //#define lcd_lineFour 0x54 / / start van lijn 4 (20 x 4) //#define lcd_LineThree 0x10 / / start van lijn 3 (16 x 4) //#define lcd_lineFour 0x50 / / start van lijn 4 (16 x 4)
LCD instructies #define lcd_Clear 0b00000001 / / alle tekens vervangen door ASCII 'ruimte' #define lcd_Home 0b00000010 / / terug cursor naar de eerste positie op de eerste lijn #define lcd_EntryMode 0b00000110 / / cursor verplaatsen van links naar rechts op lezen/schrijven #define lcd_DisplayOff 0b00001000 / / draai scherm uit #define lcd_DisplayOn 0b00001100 / / weergeven op, cursor uitschakelen, don't blink niet teken #define lcd_FunctionReset 0b00110000 / / reset de LCD #define lcd_FunctionSet4bit 0b00101000 / / 4-bit gegevens , 2-regelig display, 5 x 7 lettertype #define lcd_SetCursor 0b10000000 / / cursorpositie instellen
Program ID uint8_t program_author [] = "Donald Weiman"; uint8_t program_version [] = "LCD-AVR - 4 d (gcc)"; uint8_t program_date [] = "Sep 16, 2013";
Functie Prototypes nietig lcd_write_4(uint8_t); nietig lcd_write_instruction_4d(uint8_t); nietig lcd_write_character_4d(uint8_t); nietig lcd_write_string_4d(uint8_t *); nietig lcd_init_4d(void);
/ *** Main programmacode *** / int main(void) {/ / configure de microprocessor pinnen voor de data lijnen lcd_D7_ddr | = (1 <
configureren van de microprocessor pinnen voor het besturingselement lijnen lcd_E_ddr | = (1 <
initialiseren van de LCD controller zoals bepaald door de definieert (LCD instructies) lcd_init_4d(); initialiseren van de LCD-display voor een 4-bits interface
weergeven van de eerste regel van de informatie-lcd_write_string_4d(program_author);
cursor naar het begin van de tweede regel instellen lcd_write_instruction_4d(lcd_SetCursor | lcd_LineTwo); _delay_us(80); 40 VS vertragen (min)
weergeven van de tweede regel van informatie de lcd_write_string_4d(program_version);
eindeloze lus while(1); keren 0; } / *** Einde hoofdprogramma code ***
* === 4-bits LCD functies === * / / * naam: lcd_init_4d doel: initialiseren van de LCD-module voor een 4-bits Gegevensinterface Entry: neerkomt (LCD instructies) ingesteld voor de gewenste bewerking Exit: geen parameters notities: gebruik tijd vertragingen in plaats van controle van de drukke vlag * / void lcd_init_4d(void) {/ / Power-up vertragen _delay_ms(100); / 40 mSec vertraging van de oorspronkelijke
BELANGRIJK - op dit punt de LCD-module is in de 8-bit-modus en het verwacht te ontvangen / / 8 gegevensbits, een beetje op elk van de 8 data lijnen, telkens wanneer de 'E'-regel is gepulseerde. / / Omdat de LCD-module is bedraad voor de 4-bits modus, alleen de bovenste vier data lijnen bent verbonden met / / de microprocessor en de lagere vier data lijnen meestal open zijn gelaten. Daarom, wanneer / / de regel van de 'E' is gepulseerde, de LCD controller zal lezen welke gegevens opgezet op de bovenste / / vier data lijnen en de lagere vier data lijnen zullen hoog zijn (als gevolg van interne pull-up circuits). / / Gelukkig de instructie 'FunctionReset' niet de zorg over wat er op de lagere vier bits dus / / deze instructie op alleen de vier zijden van de beschikbare gegevens kan worden verzonden en het zal worden geïnterpreteerd / / goed door de LCD controller. De 'lcd_write_4' subroutine zal het bereiken van deze instelling als de / / controle lijnen eerder correct zijn geconfigureerd.
Instellen van de RS en E lijnen voor de 'lcd_write_4' subroutine. lcd_RS_port & ~(1< =
Reset de LCD controller lcd_write_4(lcd_FunctionReset); eerste deel van reset reeks _delay_ms(10); 4.1 mS vertraging (min)
lcd_write_4(lcd_FunctionReset); tweede deel van reset reeks _delay_us(200); 100uS vertraging (min)
lcd_write_4(lcd_FunctionReset); derde deel van reset reeks _delay_us(200); deze vertraging wordt weggelaten in de data sheet
Voorlopige functie ingesteld instructie - alleen gebruikt voor het instellen van de 4-bits modus. Het aantal lijnen of het lettertype kan niet worden ingesteld op dit moment, aangezien de controller is nog steeds in de / / 8-bit mode, maar de data transfer-mode kan worden gewijzigd omdat deze parameter wordt bepaald door een / / van de bovenste vier stukjes van de instructie. lcd_write_4(lcd_FunctionSet4bit); 4-bits modus _delay_us(80); instellen 40uS vertraging (min)
Functie Set instructie lcd_write_instruction_4d(lcd_FunctionSet4bit); modus, regels en lettertype _delay_us(80); instellen 40uS vertraging (min)
De volgende drie instructies zijn opgegeven in de data sheet als onderdeel van de initialisatie routine, / / dus het is een goed idee (maar waarschijnlijk niet nodig) doen ze net als opgegeven en vervolgens opnieuw hen / / later als de toepassing een andere configuratie vereist.
Display on/off controle instructie lcd_write_instruction_4d(lcd_DisplayOff); Schakel weergave uit _delay_us(80); 40uS vertraging (min)
Duidelijk Display instructie lcd_write_instruction_4d(lcd_Clear); duidelijk display RAM _delay_ms(4); 1.64 mS vertraging (min)
// ; Vermelding modus ingesteld instructie lcd_write_instruction_4d(lcd_EntryMode); instellen van de gewenste verschuiving kenmerken _delay_us(80); 40uS vertraging (min)
Dit is het einde van de LCD controller initialisatie zoalsgespecificeerd in de data sheet, maar het display / / in de OFF-voorwaarde heeft gelaten. Dit is een goed moment om te schakelen de weergave ON terug. Display on/off controle instructie lcd_write_instruction_4d(lcd_DisplayOn); Draai de weergave ON _delay_us(80); 40uS vertraging (min)}
/*........................................................................... Naam: lcd_write_string_4d; Doel: een reeks tekens weergegeven op de LCD-post: (theString) is de tekenreeks die moet worden weergegeven Exit: geen parameters notities: gebruik tijd vertragingen in plaats van controle van de drukke vlag * / void lcd_write_string_4d (uint8_t theString[]) {vluchtige int i = 0; / / karakter teller * / terwijl (theString [i]! = 0) {lcd_write_character_4d(theString[i]) i ++; _delay_us(80); / / 40 VS vertragen (min)}}
/*........................................................................... Naam: lcd_write_character_4d doel: Stuur een byte van informatie naar de LCD gegevensregister Entry: (theData) is de informatie moet worden toegezonden aan de gegevens registreren Exit: geen parameters notities: behandelt niet RW (drukke vlag is niet geïmplementeerd) * /
ongeldig lcd_write_character_4d(uint8_t theData) {lcd_RS_port | = (1 <
/*........................................................................... Naam: lcd_write_instruction_4d doel: Stuur een byte van informatie naar het LCD instructie register binnenkomst: (theInstruction) is de informatie die wordt verzonden naar het register van de instructie Exit: geen parameters notities: behandelt niet RW (drukke vlag is niet geïmplementeerd) * / void lcd_write_instruction_4d(uint8_t theInstruction) {lcd_RS_port & = ~(1<
/*........................................................................... Naam: lcd_write_4 doel: een byte van informatie verzenden met ingang van de LCD-module: (theByte) is de informatie moet worden gezonden naar het gewenste LCD-register RS is geconfigureerd voor het gewenste LCD register E lage RW is lage Exit: geen parameters notities: vertragingen of de drukke vlag gebruiken * / void lcd_write_4(uint8_t theByte) {lcd_D7_port & = ~(1<
lcd_D6_port & ~(1< =
lcd_D5_port & ~(1< =
lcd_D4_port & ~(1< =
Schrijf de gegevens / / 'Adres opzettijd' (40 nS) lcd_E_port | = (1 <
De zeer volgende ding die je kan doen is optioneel, u konden verbinden met uw smartphone of Samsung de arduino, dit is vrij moeilijk om te doen, maar u kon een app downloaden en deze code van de IR-afstandsbediening met de app en aanpassen.