Jag har smått börjat med C programmering för Microchips microkontrollers. Jag har kopplat in en Winstar WH2004A till min PIC16f877a enligt följande. Displayen är en 4x20 display men egentligen har den bara två rader.
Datablad för WH2004Ahttp://www.winstar.com.tw/products_deta ... p?ProID=36 Direktlänk för PDF-dokument http://www.winstar.com.tw/download.php?ProID=36
RS = RA0
EN= RA1
Edit: R/W är kopplad till GND
DB4 = RB0 , DB5 = RB1 , DB6 = RB2 , DB7 = RB3
WH2004A använder sig av KS0066 eller 'liknande' (KS 0066 or Equivalent). Jag har inte hittat något datablad för just KS0066 men jag har ett för KS0066U http://www.datsi.fi.upm.es/docencia/Mic ... s0066u.pdf
Jag använder mig av 4-bit mode och initialiseringsprocessen finns på sidan 27(enligt Adobe reader) i databladet.
Det egentliga problemet jag har är att jag inte får initialiseringen av LCDn att fungera. Bara Line1 lyser upp (visas som Rad 1 & 3 på displayen). Jag började först med att följa ett datablad med HD44780 men fick det inte fungera och upptäckte sen att KS0066 har lite olika 'timings' när det kommer till initialiseringen. I alla fall.. här är koden.
Kod: Markera allt
#include <htc.h>
#include <pic16f877a.h>
#include <pic.h>
__CONFIG(FOSC_XT & WDTE_OFF & BOREN_OFF & LVP_OFF & CPD_OFF &
DEBUG_OFF & CP_OFF);
#define _XTAL_FREQ 4000000 //4MHz
#define RS RA0
#define EN RA1
void startupint() {
PORTD = 0x00;
PORTB = 0x00;
ADCON1 = 0x06; //Analog comparators off
CMCON = 0x07;
PORTA = 0x00;
PORTE = 0x00;
PORTC = 0x00;
TRISA = 0x00; //PORTA all output
TRISB = 0x00; //PORTB all output
TRISC = 0x00; //PORTC all output
TRISD = 0x00; //PORTD all output
TRISE = 0x00; //PORTE all output
}
void strobe_EN() {
EN = 1;
EN = 0;
}
void lcdinit() {
__delay_ms(1000); // Wait for LCD to settle
RS=0;
EN=0;
PORTB = 0x02; // START FUNCTION SET
strobe_EN();
//__delay_us(10);
strobe_EN();
PORTB = 0x0C; // 2-Line mode, Display on
strobe_EN(); // END FUNCTION SET
__delay_us(80); // WAIT FOR MORE THAN 39uS
PORTB = 0x00; // START ON/OFF Control
strobe_EN();
PORTB = 0x0c; // Display on
strobe_EN();
__delay_us(80); // END ON/OFF Control
PORTB = 0x00; // START DISPLAY CLEAR
strobe_EN();
PORTB = 0x01;
strobe_EN();
__delay_ms(4); // END DISPLAY CLEAR
PORTB = 0x00; // START ENTRY MODE SET
strobe_EN();
PORTB = 0x06; // Increment mode, entire shift off
strobe_EN();
__delay_us(80); // END ENTRY MODE SET
}
void main() {
startupint();
lcdinit();
//lcdclear();
//writelcd(0x30);
while(1) {
NOP();
}
}
Duty cycle på WH2004A är 1/16 men jag hittar ingen information om dom använder en annan fosc än 270kHz som står i databladet för KS0066u