//
// 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 _ISR _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
}
//