// // PIC24FJ256GB108 - uMOGI2 Configuration Bit Settings // CONFIG3 #pragma config WPFP = WPFP511 // Write Protection Flash Page Segment Boundary (Highest Page (same as page 170)) #pragma config WPDIS = WPDIS // Segment Write Protection Disable bit (Segmented code protection disabled) #pragma config WPCFG = WPCFGDIS // Configuration Word Code Page Protection Select bit (Last page(at the top of program memory) and Flash configuration words are not protected) #pragma config WPEND = WPENDMEM // Segment Write Protection End Page Select bit (Write Protect from WPFP to the last page of memory) // CONFIG2 #pragma config POSCMOD = HS // Primary Oscillator Select (HS oscillator mode selected) #pragma config DISUVREG = ON // Internal USB 3.3V Regulator Disable bit (Regulator is enabled) #pragma config IOL1WAY = ON // IOLOCK One-Way Set Enable bit (Write RP Registers Once) #pragma config OSCIOFNC = OFF // Primary Oscillator Output Function (OSCO functions as CLKO (FOSC/2)) #pragma config FCKSM = CSDCMD // Clock Switching and Monitor (Both Clock Switching and Fail-safe Clock Monitor are disabled) #pragma config FNOSC = PRIPLL // Oscillator Select (Primary oscillator (XT, HS, EC) with PLL module (XTPLL,HSPLL, ECPLL)) #pragma config PLL_96MHZ = ON // 96MHz PLL Disable (Enabled) #pragma config PLLDIV = DIV3 // USB 96 MHz PLL Prescaler Select bits (Oscillator input divided by 3 (12MHz input)) #pragma config IESO = OFF // Internal External Switch Over Mode (IESO mode (Two-speed start-up)disabled) // CONFIG1 #pragma config WDTPS = PS32768 // Watchdog Timer Postscaler (1:32,768) #pragma config FWPSA = PR32 // WDT Prescaler (Prescaler ratio of 1:32) #pragma config WINDIS = OFF // Watchdog Timer Window (Standard Watchdog Timer enabled,(Windowed-mode is disabled)) #pragma config FWDTEN = OFF // Watchdog Timer Enable (Watchdog Timer is disabled) #pragma config ICS = PGx2 // Comm Channel Select (Emulator functions are shared with PGEC2/PGED2) #pragma config GWRP = OFF // General Code Segment Write Protect (Writes to program memory are allowed) #pragma config GCP = OFF // General Code Segment Code Protect (Code protection is disabled) #pragma config JTAGEN = OFF // JTAG Port Enable (JTAG port is disabled) // #include // általános header a PIC24 családhoz #include // sprintf miatt #include // malloc #include // memset // Hardver tulajdonságok: // PLL utáni órajel #define SYS_FREQ 32000000L #define FCY SYS_FREQ/2 // Másodlagos órajel forrás - órakvarc #define F_SEC_OSC 32768 // Delay függvények #define DELAY_MS(ms) __delay_ms(ms); #define DELAY_US(us) __delay_us(us); #include // __delay_ms // LED-ek #define LED1 _LATG6 #define LED2 _LATG7 #define LED3 _LATG8 #define LED4 _LATG9 #define LEDR _LATD15 #define LEDG _LATF4 #define LEDB _LATF5 // Nyomógombok #define SW1 !_RC1 #define SW2 !_RC3 #define SW3 !_RE8 #define SW4 !_RE9 // // LCD lábak #define LCD_DATA LATE // bit 0..7 #define LCD_RS _LATG0 #define LCD_RW _LATG1 #define LCD_E _LATF1 #define LCD_BF _RE7 // LCD makrók #define lcdPutChar(c) lcdWrite(c, 1) // karakter küldése #define lcdPutCmd(d) lcdWrite(d, 0) // utasítás küldése #define lcdClear() lcdWrite(0x01,0) // LCD törlése #define lcdGoHome() lcdWrite(0x02,0) // LCD küldése az 1. sorba #define lcdGo2Row() lcdWrite(0xC0,0) // LCD küldése a 2. sorba // magyar ékezetes karakterek const unsigned char hu_char[] = { 0x02,0x04,0x0E,0x01,0x0F,0x11,0x0F,0x00, // á 0x02,0x04,0x0E,0x11,0x1F,0x10,0x0E,0x00, // é 0x02,0x04,0x0C,0x04,0x04,0x04,0x0E,0x00, // í 0x02,0x04,0x0E,0x11,0x11,0x11,0x0E,0x00, // ó 0x02,0x04,0x11,0x11,0x11,0x13,0x0D,0x00, // ú 0x0A,0x00,0x11,0x11,0x11,0x13,0x0D,0x00, // ü 0x05,0x0A,0x11,0x11,0x11,0x13,0x0D,0x00, // ű 0x05,0x0A,0x0E,0x11,0x11,0x11,0x0E,0x00, // ő }; void lcdInit(); void lcdWrite(uint8_t c, uint8_t rs); void lcdPutStr(char *s); void lcdLoadHuChars(void); // int main() { //Inicializálás - setup // Órajel forrás beállítása // PLL kimenete CLKDIVbits.CPDIV = 0; // 1:1 32MHz // megvárjuk amíg a PLL modul végez while(!OSCCONbits.LOCK) Nop(); // szoftveres WDT kikapcsolása RCONbits.SWDTEN = 0; // Órakvarc engedélyezése //__builtin_write_OSCCONL(OSCCON | 0x02); // Periféria - láb összerendelés PPS (pp.135) //__builtin_write_OSCCONL(OSCCON & 0xbf); //PPSUnLock; // //__builtin_write_OSCCONL(OSCCON | 0x40); //PPSLock; // Lábak iránya _TRISG6 = 0; // LED1 kimenet _TRISG7 = 0; // LED2 kimenet _TRISG8 = 0; // LED3 kimenet _TRISG9 = 0; // LED4 kimenet _TRISD15 = 0; // LEDR kimenet _TRISF4 = 0; // LEDG kimenet _TRISF5 = 0; // LEDB kimenet _TRISC1 = 1; // SW1 bemenet _TRISC3 = 1; // SW2 bemenet _TRISE8 = 1; // SW3 bemenet _TRISE9 = 1; // SW4 bemenet lcdInit(); // LCD modul inicializálása lcdLoadHuChars(); // magyar karakterek betöltése lcdPutStr("Helló uMOGI2 :)"); // szöveg kiíratása DELAY_MS(2000); // Végtelen ciklus - super loop while(1) { // ciklikus feladatok elvégzése LEDR = !LEDR; DELAY_MS(500); } return (0); } // ISR void __attribute__((interrupt(auto_psv))) _T1Interrupt(){ _T1IF = 0; // interrupt flag törlése } // /** * LCD inicializálása
* lábak beállítása
* indítás 8 bites üzemmódban
*/ void lcdInit(){ // az LCD vezérlő vonalainak beállítása TRISE &= 0xff00; // D0-D7 kimenet _TRISG0 = 0; // RS kimenet _TRISG1 = 0; // RW kimenet _TRISF1 = 0; // E kimenet LCD_RS = 0; // RS alacsony LCD_RW = 0; // RW alacsony LCD_E = 0; // E alacsony DELAY_MS(50); // vár az eszköz beállására lcdPutCmd(0x38); // 2 soros display, 5x8 karakter lcdPutCmd(0x08); // display off lcdPutCmd(0x01); // képernyő törlése, kurzor alaphelyzetbe állítás lcdPutCmd(0x06); // automatikus inkrementálás, nem lépteti a kijelzőt lcdPutCmd(0x0C); // a display bekapcsolása; kurzor és villogás kikapcsolva DELAY_MS(3); } /** * adat vagy utasítás küldése * @param c adat/karakter * @param rs 0 - utasítás, 1 - adat */ void lcdWrite(uint8_t c, uint8_t rs){ uint8_t BF; // BusyFlag (foglaltság) figyelése TRISE |= 0x00ff; // lábak bemenetek LCD_RW = 1; // beolvasás LCD_RS = 0; // utasítás LCD_DATA &= 0xff00; do { LCD_E = 1; // E magas Nop(); Nop(); Nop(); BF = LCD_BF; LCD_E = 0; // E alacsony } while (BF); TRISE &= 0xff00; // lábak kimenetek LCD_RW = 0; // írás LCD_RS = rs ? 1 : 0; // adat vagy parancs LCD_DATA = (LCD_DATA & 0xff00) | c; // 8 bit küldése LCD_E = 1; // E magas Nop(); Nop(); Nop(); LCD_E = 0; // E alacsony } /** * kiír egy karakterfüzért az LCD-re * @param s Karaktertömb */ void lcdPutStr(char *s){ while (*s) { char c = *s; switch(c) { // magyar karakterek cseréje a feltöltöttre case 'á': c = 0x00; break; case 'é': c = 0x01; break; case 'í': c = 0x02; break; case 'ó': c = 0x03; break; case 'ú': c = 0x04; break; case 'ü': c = 0x05; break; case 'ű': c = 0x06; break; case 'ő': c = 0x07; break; case 'ö': c = 0xEF; break; } if (c == '\n') lcdGo2Row(); // kurzor mozgatása a második sor elejére else lcdPutChar(c); // karakter kiíratása s++; } } // magyar ékezetes karakterek feltöltése a CGRAM-ba void lcdLoadHuChars(void) { int i; lcdPutCmd(0x40); // kurzor a CGRAM elejére (0. char) for(i=0; i<64; i++) { lcdPutChar(hu_char[i]); // definiálható karakterek feltöltése } // ékezetes karakterekkel lcdPutCmd(0x80); // kurzor vissza, a DDRAM elejére } //