PIc16 Hitech och 44780
- Zajber
- Inlägg: 451
- Blev medlem: 19 oktober 2009, 22:07:16
- Skype: Andreas.fridh85
- Ort: Rödön
- Kontakt:
PIc16 Hitech och 44780
Håller på att avsluta en kurs i styrteknik och tänkte fördjupa mig lite extra i just pic som är ganska nytt för mig då jag mest kör Atmels dito innan.
Jag hittar inte samma samlade skara glada pic-folk på nätet som t.ex. avrfreaks där man hittar precis allt man letar efter.
Just nu så letar jag efter någon drivrutin för min HD44780 lcd som är skriven i C. Helst för en pic i 16f8x serien, jag har hittat lite när jag söker runt på google men oftast så får jag så sjukt många errors att det inte är lönt att försöka fixa det.
Så om någon har nått tips på vart man kan hitta matnyttig information om detta eller rent allmänt någon uppdaterad sida med schysst c-kod för typ 16f88 vore jag superglad.
Jag hittar inte samma samlade skara glada pic-folk på nätet som t.ex. avrfreaks där man hittar precis allt man letar efter.
Just nu så letar jag efter någon drivrutin för min HD44780 lcd som är skriven i C. Helst för en pic i 16f8x serien, jag har hittat lite när jag söker runt på google men oftast så får jag så sjukt många errors att det inte är lönt att försöka fixa det.
Så om någon har nått tips på vart man kan hitta matnyttig information om detta eller rent allmänt någon uppdaterad sida med schysst c-kod för typ 16f88 vore jag superglad.
-
- Inlägg: 8092
- Blev medlem: 18 januari 2009, 00:48:24
- Ort: Alvesta, Småland
Re: PIc16 Hitech och 44780
Har kört med denna som i alla fall fungerat för mig. Minns inte var jag fick tag i den.
lcd.c
lcd.h
lcd.c
Kod: Markera allt
/*
* LCD interface example
* Uses routines from delay.c
* This code will interface to a standard LCD controller
* like the Hitachi HD44780. It uses it in 4 bit mode, with
* the hardware connected as follows (the standard 14 pin
* LCD connector is used):
*
* PORTD bits 0-3 are connected to the LCD data bits 4-7 (high nibble)
* PORTA bit 3 is connected to the LCD RS input (register select)
* PORTA bit 1 is connected to the LCD EN bit (enable)
*
* To use these routines, set up the port I/O (TRISA, TRISD) then
* call lcd_init(), then other routines as required.
*
*/
#include "C:\Program\HI-TECH Software\PICC\LITE\9.60\include\pic.h"
#include "lcd.h"
#include "delay.h"
#define LCD_RS RA2
#define LCD_RW RA1
#define LCD_EN RA0
#define LCD_DATA PORTC
#define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0))
/* write a byte to the LCD in 4 bit mode */
void
lcd_write(unsigned char c)
{
DelayUs(40);
LCD_DATA = ((LCD_DATA & 0xF0) | (( c >> 4 ) & 0x0F));
LCD_STROBE();
LCD_DATA = ((LCD_DATA & 0xF0) | ( c & 0x0F ));
LCD_STROBE();
}
/*
* Clear and home the LCD
*/
void
lcd_clear(void)
{
LCD_RS = 0;
lcd_write(0x1);
DelayMs(2);
}
/* write a string of chars to the LCD */
void
lcd_puts(const char * s)
{
LCD_RS = 1; // write characters
while(*s)
lcd_write(*s++);
}
/* write one character to the LCD */
void
lcd_putch(char c)
{
LCD_RS = 1; // write characters
lcd_write( c );
}
/*
* Go to the specified position
*/
void
lcd_goto(unsigned char pos)
{
LCD_RS = 0;
lcd_write(0x80+pos);
}
/* initialise the LCD - put into 4 bit mode */
void
lcd_init()
{
char init_value;
init_value = 0x3;
LCD_RS = 0;
LCD_EN = 0;
LCD_RW = 0;
DelayMs(50); // wait 15mSec after power applied,
LCD_DATA = init_value;
LCD_STROBE();
DelayMs(5);
LCD_STROBE();
DelayUs(200);
LCD_STROBE();
DelayUs(200);
LCD_DATA = 2; // Four bit mode
LCD_STROBE();
lcd_write(0x28); // Set interface length
//lcd_write(0xF); // Display On, Cursor On, Cursor Blink
lcd_write(0b00001100);
lcd_clear(); // Clear screen
lcd_write(0x6); // Set entry Mode
}
Kod: Markera allt
/*
* LCD interface header file
* See lcd.c for more info
*/
/* write a byte to the LCD in 4 bit mode */
extern void lcd_write(unsigned char);
/* Clear and home the LCD */
extern void lcd_clear(void);
/* write a string of characters to the LCD */
extern void lcd_puts(const char * s);
/* Go to the specified position */
extern void lcd_goto(unsigned char pos);
/* intialize the LCD - call before anything else */
extern void lcd_init(void);
extern void lcd_putch(char);
/* Set the cursor position */
#define lcd_cursor(x) lcd_write(((x)&0x7F)|0x80)
- Zajber
- Inlägg: 451
- Blev medlem: 19 oktober 2009, 22:07:16
- Skype: Andreas.fridh85
- Ort: Rödön
- Kontakt:
Re: PIc16 Hitech och 44780
Nu börjar det likna något. Tack för den kodsnutten sneaky, ett lite problem bara. Vart hittar jag delay.h?
Re: PIc16 Hitech och 44780
Kod: Markera allt
...
DelayMs(50); // wait 15mSec after power applied
...

/johan
- Zajber
- Inlägg: 451
- Blev medlem: 19 oktober 2009, 22:07:16
- Skype: Andreas.fridh85
- Ort: Rödön
- Kontakt:
Re: PIc16 Hitech och 44780
Kod: Markera allt
DelayUs(40);
Jag är rätt så ny när det gäller pic.h så jag har ingen aning.
Re: PIc16 Hitech och 44780
Hoppsan, den missade jag att skicka med
Men du kan istället köra med de inbyggda som du nämnde: __delay_us(); och __delay_ms();
Hittade orginalet. Det finns (på min burk) här:
C:\Program Files (x86)\HI-TECH Software\PICC\9.70\samples
Där finns även lite annat matnyttigt som kan vara värt att kika på.
johano: Hehe, där är jag nog tyvärr skyldig till viss del. Kommentaren var korrekt från start men jag höll på och ändrade lite saker och glömde att även ändra kommentaren DOH!

Hittade orginalet. Det finns (på min burk) här:
C:\Program Files (x86)\HI-TECH Software\PICC\9.70\samples
Där finns även lite annat matnyttigt som kan vara värt att kika på.
johano: Hehe, där är jag nog tyvärr skyldig till viss del. Kommentaren var korrekt från start men jag höll på och ändrade lite saker och glömde att även ändra kommentaren DOH!
- Zajber
- Inlägg: 451
- Blev medlem: 19 oktober 2009, 22:07:16
- Skype: Andreas.fridh85
- Ort: Rödön
- Kontakt:
Re: PIc16 Hitech och 44780
Efter en stund nu så hittade jag ett demo-projekt för LCD i Hi-Tech mappen som jag nästan får att funka.
Jag får en "cursor" (svenska namnet?) som blinkar efter att koden
Där lcd_write ser ut så här:
Men jag kan inte skriva någon text till den.
Demo-filen var skriven för en större pic då PORTD var satt som data, så jag ändrade den till PORTB och TRISB till 0x00.
Dessutom så hoppar den blinkade saken (cursor) till fel sida av displayen efter en stund..
Vad mer är bra att veta?
Jag får en "cursor" (svenska namnet?) som blinkar efter att koden
Kod: Markera allt
lcd_write(0x28); // Set interface length
lcd_write(0xF); // Display On, Cursor On, Cursor Blink
lcd_clear(); // Clear screen
lcd_write(0x6); // Set entry Mode
Kod: Markera allt
void
lcd_write(unsigned char c)
{
__delay_us(40);
LCD_DATA = ( ( c >> 4 ) & 0x0F );
LCD_STROBE();
LCD_DATA = ( c & 0x0F );
LCD_STROBE();
}
Men jag kan inte skriva någon text till den.
Demo-filen var skriven för en större pic då PORTD var satt som data, så jag ändrade den till PORTB och TRISB till 0x00.
Dessutom så hoppar den blinkade saken (cursor) till fel sida av displayen efter en stund..
Vad mer är bra att veta?
- Zajber
- Inlägg: 451
- Blev medlem: 19 oktober 2009, 22:07:16
- Skype: Andreas.fridh85
- Ort: Rödön
- Kontakt:
Re: PIc16 Hitech och 44780
För övrigt så har jag inget oscilloskop hemma och försöker jag mäta med en hyfsad multimeter så är alla pinnarna helt stilla.
Hur känsliga är pic:arna? Jag vet att vi har fått många märkliga fel på skolan efter ett par programmeringar, pinnar som slutar funka och liknande.
Hur känsliga är pic:arna? Jag vet att vi har fått många märkliga fel på skolan efter ett par programmeringar, pinnar som slutar funka och liknande.
Re: PIc16 Hitech och 44780
De brukar inte vara så känsliga.
Dock ska man se upp med två saker: Öppna ingångar och externa oscillatorer.
Det är t.ex. rätt vanligt att nybörjare lämnar MCLR öppen och utan pullup.
Allt sånt påverkar vid drift, men jag skulle tro att det är relativt svårt att permanent förstöra en pic. Jag har i alla fall aldrig sabbat någon än och jag har varit allt annat än försiktig.
Jag tror inte på att försöka se kommunikationen m.h.a multimeter eftersom alltihopa går mycket snabbt.
Har du prövat att köra ett program som bara blinkar alla pinnar på porten i synlig takt?
Dock ska man se upp med två saker: Öppna ingångar och externa oscillatorer.
Det är t.ex. rätt vanligt att nybörjare lämnar MCLR öppen och utan pullup.
Allt sånt påverkar vid drift, men jag skulle tro att det är relativt svårt att permanent förstöra en pic. Jag har i alla fall aldrig sabbat någon än och jag har varit allt annat än försiktig.
Jag tror inte på att försöka se kommunikationen m.h.a multimeter eftersom alltihopa går mycket snabbt.
Har du prövat att köra ett program som bara blinkar alla pinnar på porten i synlig takt?
- Zajber
- Inlägg: 451
- Blev medlem: 19 oktober 2009, 22:07:16
- Skype: Andreas.fridh85
- Ort: Rödön
- Kontakt:
Re: PIc16 Hitech och 44780
Jag har avaktiverat MCLR och testat portarna och det ska funka.
Hmm, det låter oroväckande att våra pic:ar har gått sönder så mycket då, eller åtminstone slutat funka på några pinnar.
Men jag utgår ifrån att denna funkar iaf.
Hmm, det låter oroväckande att våra pic:ar har gått sönder så mycket då, eller åtminstone slutat funka på några pinnar.
Men jag utgår ifrån att denna funkar iaf.
- PHermansson
- EF Sponsor
- Inlägg: 4340
- Blev medlem: 22 december 2004, 00:46:38
- Ort: Särestad Grästorp
- Kontakt:
Re: PIc16 Hitech och 44780
Oförstörbara är dom ju inte... har lyckats förstöra både hela kretsar och enskilda pinnar. Men då genom rena hjärnsläpp (nu har jag nog äntligen lärt mig att plus och jord på en F675 är motsatt mot vad man är van vid från många andra kretsar. Har också testat hur en Pic reagerar på att matas direkt från en bilbatteri, inge bra...).
- Zajber
- Inlägg: 451
- Blev medlem: 19 oktober 2009, 22:07:16
- Skype: Andreas.fridh85
- Ort: Rödön
- Kontakt:
Re: PIc16 Hitech och 44780
Nu får jag skräpet att rita ut streck fortare än allt.
Så fort jag använda lcd_puts(); så börjar den att skriva ut massor med streck. Tar jag bort den så står markören kvar och blinkar.
Så fort jag använda lcd_puts(); så börjar den att skriva ut massor med streck. Tar jag bort den så står markören kvar och blinkar.
Re: PIc16 Hitech och 44780
har haft problem med uppstart av display
kunde få cursorn att blinka men det gick inte att skriva text
felet var at r/s signalen var kortsluten mot jord
kan vara värt att kolla innan för många hårtestar ryckes bort
//Ola
kunde få cursorn att blinka men det gick inte att skriva text
felet var at r/s signalen var kortsluten mot jord
kan vara värt att kolla innan för många hårtestar ryckes bort
//Ola
Re: PIc16 Hitech och 44780
Har precis pillat på just den implementation av lcd-rutinerna som visats här. Tänk på att jorda RW eftersom den inte används. Ansluter du den inte till något så dras den hög internt och då funkar ingenting.
För att få igång Hi-Techs implementation så fick jag öka upp den första fördröjningen i lcd_write till 80 us. Funkar kanske med mindre men jag hårdoptimerade inte.
Jag vet inte oscillatorfrekvens du kör PIC:en på men eventuellt måste du lägga in en fördröjning i STROBE macrot. För säkerhets skull kör jag med 2 us, så här:
Dessutom fick jag lägga till en fördröjning i init_lcd för att det skulle lira. Efter
har jag 20 ms fördröjning. Funkade inte utan detta. Vet ej varför. Efter denna fördröjning har jag lagt in:
Eftersom det är så jag kör displayen hela tiden.
För att få igång Hi-Techs implementation så fick jag öka upp den första fördröjningen i lcd_write till 80 us. Funkar kanske med mindre men jag hårdoptimerade inte.
Jag vet inte oscillatorfrekvens du kör PIC:en på men eventuellt måste du lägga in en fördröjning i STROBE macrot. För säkerhets skull kör jag med 2 us, så här:
Kod: Markera allt
#define LCD_STROBE() ((LCD_EN = 1),(__delay_us(2)),(LCD_EN=0))
Kod: Markera allt
lcd_write(0x6); // Set entry Mode
Kod: Markera allt
lcd_write(0x0C); //Display On, Cursor Off, No Cursor Blink