///////////////////////////////////////////////////////////////////////////////////////// // // Priklad pro Freescale DEMO9S08LC60 // // Tento programek postupne na LCD displej kitu vypise text "HW SERVER A FREESCALE Vas vita na // vytave AMPER 2007. Samozrejme, ze tento text lze nahradit jinym libovolnym textem z ASCi znaku // // // // -------------------------------------------------------------------------------------- // // Vytvoreno na CodeWarrior V5.1 pro HCS08LC60 // // -------------------------------------------------------------------------------------- // // Ovladani LCD displeje: // Copyright (c) 2006 SofTec Microsystems // http://www.softecmicro.com/ // ///////////////////////////////////////////////////////////////////////////////////////// #include /* macro pro povoleni preruseni */ #include "derivative.h" /* deklarace periferii */ #include "lcd.h" /* prevodni tabulku ASCII znaku pro radic LCD a prikazy pro LCD*/ unsigned char delay_unit=0x00; ///////////////////////////////////////// // Inicializace periferii a registru // /////////////////////////////////////// void PeriphInit(void) { // Vypina COP a upoznuje RESET a BKGD pin SOPT1 = 0x13; #if !CLOCK // Navoleni FEE modu pro frekvenci sbernice fBUS = 8 MHz // Vyuziva krystalovaho oscilatoru s PLL predelickou 64 ICGC1 = 0x38; // Nastavuje MFD nasobici faktor (N) na hodnotu 4 and RFD delitel (R) na 1 ICGC2 = 0x20; // Ceka az PLL frekvence je stabilizovana while (!(ICGS1 & 0x08)); #else // Volba FEI modu // Nastavuje trimming pro fBUS = 8 MHz ICGTRM = NVICGTRM; // Pouziti vnitrni referencnich hodin. PLL preddelici konstanta (P) = 64 ICGC1 = 0x28; // Nastavuje MFD nasobici faktor na 14 a RFD delitel na 2 ICGC2 = 0x51; // Ceka na uzavreni smycky PPL while (!(ICGS1 & 0x08)); #endif // Nastavuje piny PTA[7..5] jako vystupy na LEDky PTAD = 0x00; PTADD = 0xE0; // Nastavuje piny PTB[7..3] jako vystupy na LEDky PTBD = 0x00; PTBDD = 0xF8; // Nastavuje ADC prevodnik (ADC hodiny = 1MHz) // Hodiny sbernice jako zdroj hodin, 8bitovy prevod a delitel 8 ADCCFG = 0x60; // Volba ADC kanalu 0 (PTA0) a nastaveni nestaleho prevodu) ADCSC1 = 0x20; // Preteceni citace kazdou 0.5 ms TPM1MOD = 0x4000; // Zastaveni casovace a nastaveni preddelici hodnoty na 1 TPM1SC = 0x00; // Inicializace periferii LCD radice LCDInit(); } //////////////////////////////////////////////////////////////// // Regulace rychlosti posuvu textu - nastaveni delky zpozdeni // /////////////////////////////////////////////////////////////// unsigned char SpeedControl (void) { unsigned char adc=0x00, del_ADC=0x00; while(!(ADCSC1 & 0x80)); { adc = ADCRL; del_ADC=adc; // Zapis 8bit. hodnoty z AD prevodniku na vystupy A[7..5] a B[7..3]; napojene na LEDky PTAD = adc & 0xE0; PTBD = (adc << 3) & 0xF8; } return del_ADC; } ////////////////////////////////////////////////////////////////////////////////// // Generovani zpozdeni v poctu nasobku hodnoty 0.5 ms - hodnota v reg. TPM1MOD // ///////////////////////////////////////////////////////////////////////////////// void Delay(unsigned char del, unsigned char number) { unsigned char dellocal; // Zvoleni hodin pro casovac 1 = fBUS a start casovace TPM1SC = 0x08; dellocal=del; while(number) /* nasobek zakl. jednotky zpozdeni */ { number--; dellocal=del; delay_unit=SpeedControl(); while(dellocal) /* generovani zakl. jednotky zpozdeni */ if(TPM1SC&0x80) { dellocal--; // Vymazani priznaku preteceni casovace (TOF) TPM1SC &= ~0x80; } } // Zastaveni casovace a nastaveni preddelici hodnoty na 1 TPM1SC = 0x00; } ////////////////////////////////// // Vypise zadany retezec na LCD // ///////////////////////////////// void PrintString(unsigned char *str) { unsigned char i; for(i = 0; str[i] != 0; i++) LCDPutChar(str[i], i+1); } //////////////////////////////////////// // Nabeh retezce na LCD zleva doprava // /////////////////////////////////////// void SlideStringRight(unsigned char *str) { unsigned char i, j, start; for(i = 0; str[i] != 0; i++) { Delay(delay_unit,1); start = i; for(j = start; j <= i; j++) LCDPutChar(str[j], j+1); } } ///////////////////////////////////////// // Posun retezce na LCD zprava do leva // //////////////////////////////////////// void SlideStringLeft(unsigned char *str) { unsigned char i, j, start; for(i = 0; str[i] != 0; i++) { Delay(delay_unit,1); if(i < NUM_DIGITS) start = 0; else start = i-NUM_DIGITS+1; for(j = start; j <= i; j++) LCDPutChar(str[j], NUM_DIGITS-i+j); } } ///////////////////////////// // Hlavni smycka programu // /////////////////////////// void main(void) { // Inicializace periferii PeriphInit(); LCDOnOffState(); EnableInterrupts; // Kompletni vymazani obsahu displeje LCDClear(); // Zobrazeni loga Freescale na LCD LCDWriteSegment(FREESCALE,0); // Pocatecni zjisteni hodnoty jednotky zpozdeni nastavene potencimetrem delay_unit=SpeedControl(); for(;;) { LCDWriteSegment(FREESCALE,0); /* zobrazebi loga Freescale */ Delay(delay_unit,1); SlideStringRight("HW SERVER"); /* nabeh textu zleva doprava*/ Delay(delay_unit,2); /* zpozdeni o 2 nastavene jednotky */ LCDClear(); LCDWriteSegment(FREESCALE,0); Delay(delay_unit,2); SlideStringRight("A"); Delay(delay_unit,3); LCDClear(); LCDWriteSegment(FREESCALE,0); Delay(delay_unit,3); SlideStringRight("FREESCALE"); /* nabeh textu zleva doprava*/ Delay(delay_unit,2); LCDClear(); LCDWriteSegment(FREESCALE,0); SlideStringLeft("Vas vita na vystave AMPER 2007"); /*nabeh textu zprava doleva*/ Delay(delay_unit,1); LCDClear(); /* vymazani disleje */ } }