/* PicKbdDisplay.c Hämtar tecken från ett tangentbord och visar tecknet på en display, och skickar tecknet med 1200-19200 baud till PC. Fungerar för CC5X Version 3.3A (gratisversion). Fungerar för CC5X Version 3.1F. Fungerar med och utan optimering. Fungerar med och utan commandline option -u (-u = utan optimering) OBS, Version och baudrate hårdkodas i rutinen baudChar(). Använder kod från www.elektronikutveckling.com, radera inte denna info om du modifierar eller kopierar delar från denna fil. Använd på egen risk, rätta felaktigheter. Anpassad för (och testad med) "PICkit2 UART Tool" som terminal. Klicka bort "Echo On". ___________ ___________ | \/ | +5V---|Vdd 16F690 Vss|---GND |RA5 RA0/AN0/(PGD)|---bbTx ->- PK2Rx |RA4 RA1/(PGC)|---bbRx -<- PK2Tx Pk2 VPP---|RA3/!MCLR/(Vpp) RA2/INT| |RC5/CCP RC0|--+LED--gnd Disp C/D--|RC4 RC1|--Disp Data KBD Rx--|RC3 RC2|--Disp Clock KBD Ck--|RC6 RB4| |RC7 RB5/Rx| |RB7/Tx RB6| |________________________| Display anslutningar: pin 1-20 inte anslutna pin: 21 inte ansluten 22 inte ansluten 23 gnd 24 5V 25 5V 26 5V 27 gnd 28 in PIC PORTC.1 Seriell Data 29 in PIC PORTC.2 Klocka 30 5V 31 5V 32 5V 33 5V 34 5V 35 5V 36 5V (E) 37 5V (R/W) 38 gnd (CS) 39 in PIC PORTC.4 Controll=1, Data=0 40 5V (RESET) */ #include "16F690.h" #include "MATH16.H" #pragma config |= 0x00D4 // info för PICkit2 programmer #include "getKey.c" #include "keyToTkn.c" #include "displayTkn.c" #include "displayInstr.c" #include "delayx10ms.c" #include "baudChar.c" // init void mainSetDisplay(void); void mainInitDisplayText(void); char text(char); // globala variabler: char contrast; // displayens contrast char displayPos; // cursur position på displayen /* ============================MAIN============================ */ void main( void) { char key, tkn; PEIE = 0; // nästa enable interupt enable (lätt att misssa denna!) GIE = 0; // global interupt enable ANSEL = 0b00000000; // ej analoga = digitala in ANSELH = 0b00000000; // ANS11 ej analog utan RX, digital in // (Denna inställning borde vara default.) TRISC.0=0; // LED TRISC.1=0; // display data TRISC.2=0; // display clock TRISC.3=1; // KeyPad Rx in TRISC.4=0; // display Command/Data selection TRISC.6=1; // KeyPad Clk in //init baudChar(); PORTA.0 = 1; TRISA.0 = 0; // seriell data till PICkit2 ( + RS232-krets till hyperterminal) contrast=9; // öka om displayen har för svaga tecken (eller kallt) displayPos=17; PORTC.0=1; // LED on (Indikerar start upp.) delayx10ms(6); // ca 6ms delay från spänningspåslag. // OBS: gör en manuell /off/on efter programmering med PICkit2 // annars blir displayen blank. mainSetDisplay(); // Displayen har CS lödd till gnd och RESET lödd till +5V. // Minst 2ms delay behövs innan displaysetup. // Ev.t. kan fördröjd reset behövas för vissa displayer. mainInitDisplayText(); delayx10ms(100); // 1s delay för att vänta ut keypad startup. // Och slippa läsa id data som sänds vid startup. // En ströbit räcker för att slå ut tolkningen av tecken. PORTC.0=0; // LED off (Nu ska display och KBD ha vaknat upp fint.) // KeyPad lysdioden ska slockna innan LED gör det. /* äntligen.. nu kör vi applikationen: */ while(1) { key=getKey(); // hämtar tecken (eller 0x7 om inget tecken) if(key!=0x7) // isåfall visa tecken på displayen // och skicka tecknet till PC'n { tkn=keyToTkn(key); // [enter]-knappens kod byts ut till '=' // Alt. vid behov byt tecken i keyToTkn() displayTkn(tkn); // visar tecknet på displayen if(tkn!='=') baudChar(tkn); // skickar tecknet till PC'n if(tkn=='=') { baudChar('\r'); // return (0x13) skickas till PC'n baudChar('\n'); // ny rad (0x10) skickas till PC'n } } delayx10ms(2); // Ledig plats för en applikation // Om applikation saknas behövs en delay här // för att KeyPad'en ska få en chans att // plocka upp tecken innan nästa varv } } /* =============================END MAIN ======================= */ void mainSetDisplay(void) { char ti; /* ställer in displayen */ // Display CS aktiv 0. Pin 38 på displayen lödd till gnd. displayInstr( 0b00111001); // Funktion set (tabell 1) displayInstr( 0b00011101); // Bias set displayInstr( 0b01010000); // Power Control displayInstr( 0b01101100); // Follower control displayInstr( 0x70 + contrast); // Contrast set displayInstr( 0b00111000); // Funktion set (tabell 0) xxxx01xx= 2 rader, 10=3 rader displayInstr( 0b00001110); // Display on/off (på) displayInstr( 0b00000001); // Clear display (tar 1ms) // clear display tar 1ms, men kanske onödigt att invänta. ti = 200; do ; while( --ti > 0); nop(); // wait ti*5 + 14 us ti = 200; do ; while( --ti > 0); nop(); // wait ti*5 + 14 us displayInstr( 0b00000110); // Entry mode set return; } void mainInitDisplayText(void) { char i; displayInstr(0x80+0x0); // Flytta cursor till rad 1 (tecken nr +_) for(i = 0; displayTkn(text(i)) ; i++); // Skriver t.ex. "Sätt mättid:" på displayen displayInstr(0x80 + displayPos); // Flytta cursor return; } char text(char x) { skip(x); #pragma return[] = "Displayen funkar" '\0' }