/Designs/Measuring_instruments/CT01B/SW/1_00/16F88.H
0,0 → 1,277
//////// Header file for the PIC16F88
#device PIC16F88
#nolist
//////// Program memory: 4096x14 Data RAM: 368 Stack: 8
//////// I/O: 16 Analog Pins: 7
//////// Data EEPROM: 256
//////// C Scratch area: 77 ID Location: 2000
// Fuses:
// Oscilator: LP - oscilator LP
// XT - oscilator XT
// HS - oscilator HS
// EC_IO - externi vstup, RA6/CLKO je IO port
// INTRC - RC oscilator, RA6/CLKO je CLKO, RA7/CLKI je IO port port,
// INTRC_IO - RC oscilator, RA6 i RA7 je IO port
// RC - ext RC, RA6/CLKO je CLKO
// RC_IO - ext RC, RA6 je IO port
// Watch: NOWDT - neni watchog
// WDT - je watchdog
// PUT: NOPUT - neni power up timer
// PUT - je power up timer
// MCLR: MCLR - RA5/MCLR je MCLR
// NOMCLR - RA5/MCLR je IO port
// BOR: BROWNOUT - BOR povolen
// NOBROWNOUT - BOR zakazan
// LVP: LVP - RB3/PGM je PGM
// NOLVP - RB3/PGM je IO port
// CPD: CPD - je ochrana EEPROM
// NOCPD - neni ochrana EEPROM
// WRT WRT - zakaz zapisu do pameti programu
// NOWRT - povolen zapis do pameti programu
// DEBUG: DEBUG - RB6 a RB7 jsou ICD port
// NODEBUG - RB6 a RB7 jsou IO port
// CCPMX: CCPB0 - CCP/PWM na RB0
// CCPB3 - CCP/PWM na RB3
// CP: PROTECT - pamet programu je chranena
// NOPROTECT - pamet programu neni chranena
//
 
////////////////////////////////////////////////////////////////// I/O
// Discrete I/O Functions: SET_TRIS_x(), OUTPUT_x(), INPUT_x(),
// PORT_B_PULLUPS(), INPUT(),
// OUTPUT_LOW(), OUTPUT_HIGH(),
// OUTPUT_FLOAT(), OUTPUT_BIT()
// Constants used to identify pins in the above are:
 
 
 
#define PIN_A0 40
#define PIN_A1 41
#define PIN_A2 42
#define PIN_A3 43
#define PIN_A4 44
#define PIN_A5 45
#define PIN_A6 46
#define PIN_A7 47
 
#define PIN_B0 48
#define PIN_B1 49
#define PIN_B2 50
#define PIN_B3 51
#define PIN_B4 52
#define PIN_B5 53
#define PIN_B6 54
#define PIN_B7 55
 
////////////////////////////////////////////////////////////////// Useful defines
#define FALSE 0
#define TRUE 1
 
#define BYTE int
#define BOOLEAN short int
 
#define getc getch
#define fgetc getch
#define getchar getch
#define putc putchar
#define fputc putchar
#define fgets gets
#define fputs puts
 
////////////////////////////////////////////////////////////////// Control
// Control Functions: RESET_CPU(), SLEEP(), RESTART_CAUSE()
// Constants returned from RESTART_CAUSE() are:
#define WDT_FROM_SLEEP 0
#define WDT_TIMEOUT 8
#define MCLR_FROM_SLEEP 16
#define NORMAL_POWER_UP 24
 
 
////////////////////////////////////////////////////////////////// Timer 0
// Timer 0 (AKA RTCC)Functions: SETUP_COUNTERS() or SETUP_TIMER0(),
// SET_TIMER0() or SET_RTCC(),
// GET_TIMER0() or GET_RTCC()
// Constants used for SETUP_TIMER0() are:
#define RTCC_INTERNAL 0
#define RTCC_EXT_L_TO_H 32
#define RTCC_EXT_H_TO_L 48
 
#define RTCC_DIV_1 8
#define RTCC_DIV_2 0
#define RTCC_DIV_4 1
#define RTCC_DIV_8 2
#define RTCC_DIV_16 3
#define RTCC_DIV_32 4
#define RTCC_DIV_64 5
#define RTCC_DIV_128 6
#define RTCC_DIV_256 7
 
 
#define RTCC_8_BIT 0
 
// Constants used for SETUP_COUNTERS() are the above
// constants for the 1st param and the following for
// the 2nd param:
 
////////////////////////////////////////////////////////////////// WDT
// Watch Dog Timer Functions: SETUP_WDT() or SETUP_COUNTERS() (see above)
// RESTART_WDT()
//
#define WDT_18MS 8
#define WDT_36MS 9
#define WDT_72MS 10
#define WDT_144MS 11
#define WDT_288MS 12
#define WDT_576MS 13
#define WDT_1152MS 14
#define WDT_2304MS 15
 
////////////////////////////////////////////////////////////////// Timer 1
// Timer 1 Functions: SETUP_TIMER_1, GET_TIMER1, SET_TIMER1
// Constants used for SETUP_TIMER_1() are:
// (or (via |) together constants from each group)
#define T1_DISABLED 0
#define T1_INTERNAL 0x85
#define T1_EXTERNAL 0x87
#define T1_EXTERNAL_SYNC 0x83
 
#define T1_CLK_OUT 8
 
#define T1_DIV_BY_1 0
#define T1_DIV_BY_2 0x10
#define T1_DIV_BY_4 0x20
#define T1_DIV_BY_8 0x30
 
////////////////////////////////////////////////////////////////// Timer 2
// Timer 2 Functions: SETUP_TIMER_2, GET_TIMER2, SET_TIMER2
// Constants used for SETUP_TIMER_2() are:
#define T2_DISABLED 0
#define T2_DIV_BY_1 4
#define T2_DIV_BY_4 5
#define T2_DIV_BY_16 6
 
////////////////////////////////////////////////////////////////// CCP
// CCP Functions: SETUP_CCPx, SET_PWMx_DUTY
// CCP Variables: CCP_x, CCP_x_LOW, CCP_x_HIGH
// Constants used for SETUP_CCPx() are:
#define CCP_OFF 0
#define CCP_CAPTURE_FE 4
#define CCP_CAPTURE_RE 5
#define CCP_CAPTURE_DIV_4 6
#define CCP_CAPTURE_DIV_16 7
#define CCP_COMPARE_SET_ON_MATCH 8
#define CCP_COMPARE_CLR_ON_MATCH 9
#define CCP_COMPARE_INT 0xA
#define CCP_COMPARE_RESET_TIMER 0xB
#define CCP_PWM 0xC
#define CCP_PWM_PLUS_1 0x1c
#define CCP_PWM_PLUS_2 0x2c
#define CCP_PWM_PLUS_3 0x3c
long CCP_1;
#byte CCP_1 = 0x15
#byte CCP_1_LOW= 0x15
#byte CCP_1_HIGH= 0x16
////////////////////////////////////////////////////////////////// COMP
// Comparator Variables: C1OUT, C2OUT
// Constants used in setup_comparators() are:
#define A0_A3_A1_A2 4
#define A0_A2_A1_A2 3
#define NC_NC_A1_A2 5
#define NC_NC_NC_NC 7
#define A0_VR_A1_VR 2
#define A3_VR_A2_VR 10
#define A0_A2_A1_A2_OUT_ON_A3_A4 6
#define A3_A2_A1_A2 9
 
#bit C1OUT = 0x1f.6
#bit C2OUT = 0x1f.7
 
////////////////////////////////////////////////////////////////// VREF
// Constants used in setup_vref() are:
#define VREF_LOW 0xa0
#define VREF_HIGH 0x80
#define VREF_A2 0x40
 
////////////////////////////////////////////////////////////////// INT
// Interrupt Functions: ENABLE_INTERRUPTS(), DISABLE_INTERRUPTS(),
// EXT_INT_EDGE()
//
// Constants used in EXT_INT_EDGE() are:
#define L_TO_H 0x40
#define H_TO_L 0
// Constants used in ENABLE/DISABLE_INTERRUPTS() are:
#define GLOBAL 0x0BC0
#define INT_RTCC 0x0B20
#define INT_RB 0x0B08
#define INT_EXT 0x0B10
#define INT_TBE 0x8C10
#define INT_RDA 0x8C20
#define INT_TIMER1 0x8C01
#define INT_TIMER2 0x8C02
#define INT_CCP1 0x8C04
#define INT_SSP 0x8C08
#define INT_COMP 0x8D40
#define INT_EEPROM 0x8D10
#define INT_TIMER0 0x0B20
 
// Definice reistru pro pristup k EEPROM
#define EEDATA 0x010C
#define EEADR 0x010D
#define EEDATAH 0x010E
#define EEADRH 0x010F
#define EECON1 0x018C
#define EECON1_RD 0
#define EECON1_WR 1
#define EECON1_WREN 2
#define EECON1_WRERR 3
#define EECON1_FREE 4
#define EECON1_EEPGD 7
#define EECON2 0x018D
#define PIR2 0x000D
#define PIR2_EEIF 4
#define PIE2 0x008D
#define PIR2_EEIE 4
 
// Definice pro AD prevodnik
#define ADCON0 0x1F
#define ADCON1 0x9F
#define ADRESH 0x1E
#define ADRESL 0x9E
#define ANSEL 0x9B
 
// Definice pro casovac a PWM
#define PR2 0x92
#define T2CON 0x12
#define CCP1CON 0x17
#define CCPR1L 0x15
 
// Definice pro komparator
#define CMCON 0x9C
 
// Definice pro preruseni
#define INTCON 0x0B
#bit GIE = INTCON.7
#bit PEIE = INTCON.6
#bit TMR0IE = INTCON.5
#bit INTE = INTCON.4
#bit RBIE = INTCON.3
#bit TMR0IF = INTCON.2
#bit INTF = INTCON.1
#bit RBIF = INTCON.0
 
#define PIE1 0x8C
#bit ADIE = PIE1.6
#bit RCIE = PIE1.5
#bit TXIE = PIE1.4
#bit SSPIE = PIE1.3
#bit CCP1IE = PIE1.2
#bit TMR2IE = PIE1.1
#bit TMR1IE = PIE1.0
 
// Porty
#define PORTA 0x05
#define PORTB 0x06
#define TRISA 0x85
#define TRISB 0x86
 
#list
/Designs/Measuring_instruments/CT01B/SW/1_00/A.BAT
0,0 → 1,4
call picpgr stop
call picpgr erase pic16f88
call picpgr program CT01A100.hex hex pic16f88
call picpgr run
/Designs/Measuring_instruments/CT01B/SW/1_00/CT01A100.C
0,0 → 1,368
// Firmware pro pripravek pro testovani slunecnich clanku CT01A
// (c) miho 2005
//
// 1.00 Zakladni verze
 
#include <16F88.h>
#fuses INTRC_IO, NOWDT, NOPUT, NOPROTECT, NOBROWNOUT, MCLR, NOLVP, NOCPD, NODEBUG, CCPB3
 
#use delay(clock=8000000) // interni RC oscilator
 
#use RS232 (baud=9600, xmit=PIN_B5, rcv=PIN_B2)
 
#include <eeprom.c> // Podpora zapisu promennych do EEPROM
 
#define LCD_E PIN_A2
#define LCD_RS PIN_A7
#define LCD_D0 PIN_A3
#define LCD_D1 PIN_A4
#define LCD_D2 PIN_B7
#define LCD_D3 PIN_B6
 
#include <LCD.C> // podpora LCD displeje
 
 
// Globalni nastaveni a globalni promenne
//
#define Ofset 5 // ofset PWM pro nulovy proud
float Vref; // konstanta voltmetru (napeti 1 LSB prevodniku)
int1 Xrs; // 1 znamena vystup na RS232
int1 Xlcd; // 1 znamena vystup na LCD displej
 
 
signed int16 Convert(int8 Chanel)
// Prevod AD prevodnikem ze zadaneho kanalu
// Vysledek je na 10 bitu, doba prevodu 1.8ms
{
unsigned int16 Data;
int i;
 
// AD prevod s prumerovanim 32x
Data=0;
*ADCON0 = 0x41 | Chanel << 3; // frekvence f/16, zapnout, cislo kanalu
*ADCON1 = 0xC0; // right justify, Vdd a Vss jako reference
delay_us(100); // ustaleni vstupu
for(i=32;i!=0;i--)
{
*ADCON0 |= 4; // start prevodu
delay_us(50); // prevod
Data += (int16)*ADRESH<<8|*ADRESL; // vysledek se nascita
}
Data=Data>>5; // odcin prumerovani
 
// Vysledek
return Data; // vysledek 0 az 1023
}
 
 
float GetVoltage()
// Provede nacteni dat z AD prevodniku a prevod na float napeti
{
float Data;
Data=(Convert(0)-Convert(1))*Vref;
return Data;
}
 
 
void SetPWM(int8 Data)
// Nastaveni dat do PWM vystupu
// Celych 8 bitu, doba behu 10ms
{
*CCPR1L = Data>>2; // hornich 6 bitu
*CCP1CON = *CCP1CON & 0x0F | (Data & 3)<<4; // spodni 2 bity
delay_ms(50); // doba na ustaleni
}
 
 
void GetString(char *s, int max)
// Nacte ze seriovky retezec,
// dela echo a hlida delku retezce
{
int len; // aktualni delka
char c; // nacteny znak
 
max--;
len=0;
do {
c=getc();
if(c==8) { // Backspace
if(len>0) {
len--;
putc(c);
putc(' ');
putc(c);
}
} else if ((c>=' ')&&(c<='~'))
if(len<max) {
s[len++]=c;
putc(c);
}
} while(c!=13);
s[len]=0;
}
 
 
float atof(char *s)
// Prevod retezce na float
{
float pow10 = 1.0;
float result = 0.0;
int sign = 0;
char c;
int ptr = 0;
 
c = s[ptr++];
 
if ((c>='0' && c<='9') || c=='+' || c=='-' || c=='.') {
if(c == '-') {
sign = 1;
c = s[ptr++];
}
if(c == '+')
c = s[ptr++];
 
while((c >= '0' && c <= '9')) {
result = 10*result + c - '0';
c = s[ptr++];
}
 
if (c == '.') {
c = s[ptr++];
while((c >= '0' && c <= '9')) {
pow10 = pow10*10;
result += (c - '0')/pow10;
c = s[ptr++];
}
}
 
}
 
if (sign == 1)
result = -result;
return(result);
}
 
 
signed int atoi(char *s)
// Preved retezec na int (jen dekadicka cisla)
{
signed int result;
int sign, index;
char c;
 
index = 0;
sign = 0;
result = 0;
 
// Omit all preceeding alpha characters
if(s)
c = s[index++];
 
// increase index if either positive or negative sign is detected
if (c == '-')
{
sign = 1; // Set the sign to negative
c = s[index++];
}
else if (c == '+')
{
c = s[index++];
}
 
while (c >= '0' && c <= '9')
{
result = 10*result + (c - '0');
c = s[index++];
}
 
if (sign == 1)
result = -result;
 
return(result);
}
 
 
void Xputc(char c)
// Spolecna procedura pro vystup znaku na LCD a RS232
// dle stavu promennych Xrs a Xlcd
{
if (Xrs)
if(c!='\n') putc(c); // vystup na RS232 (neposilej LF)
if (Xlcd) lcd_putc(c); // vystup na LCD displej
}
 
 
void Calibrate()
// Procedura pro kalibraci
{
#define LINE_LEN 40 // delka retezce
char Line[LINE_LEN]; // retezec
int8 Data; // nacteny proud 0 az 250
float FData; // nactene rozdilove napeti
 
lcd_clr();
printf(Xputc,"\n\rCalibration\r\n");
for(;1;)
{
Xrs=1;
Xlcd=1;
GetString(Line,LINE_LEN);
if (*Line=='q')
{
// Ukonceni procesu kalibrace
SetPWM(0); // vypni proud
printf("\n\r"); // odradkuj na terminalu
EE_WR(0,Vref); // uloz kalibraci do EEPROM
return; // navrat
}
else if (*Line=='v')
{
// Zadani nove hodnoty Vref
Vref=atof(Line+1)/1023; // referencni napeti na 1 LSB
printf("\r\n");
}
else if(*Line)
{
// Zadan novy proud
Data=atoi(Line); // preved retezec na cislo
printf(Xputc," Set %3umA\r\n",Data);
SetPWM(Data+Ofset); // nastav proud
delay_ms(100); // cas na ustaleni
}
// Jeden cyklus mereni
FData=GetVoltage();
printf(Xputc,"%1.2fV \r\n",FData);
}
lcd_clr(); // smaz displej
}
 
 
void AutoRun()
// AutoRun - automaticke mereni cele zatezovaci krivky
{
float FData; // zmerene napeti
int8 i; // promenna cyklu - proud v mA
 
Xrs=0; // vystup neni na RS232
Xlcd=1; // vystup je na LCD
printf(Xputc,"\fAutoRun"); // napis na LCD
Xrs=1; // hlavika jen na RS232
Xlcd=0;
printf(Xputc,"\r\nI[mA] U[V] P[mW]");
Xlcd=1;
 
SetPWM(0); // vypni proud
delay_ms(100); // klidova podminka
for(i=0;i<=250;i++) // cyklus pres proud 0 az 250mA
{
SetPWM(i+Ofset); // nastav proud
FData=GetVoltage(); // zmer napeti
if (FData>0) printf(Xputc,"\r\n%03u %1.2f %3.1f",i,FData,FData*i);
else i=250; // predcasne ukonceni
}
printf(Xputc,"\r\n"); // na konci odradkuj
SetPWM(0); // vypni proud
lcd_clr(); // smaz displej
}
 
 
void main()
{
// Hodiny
*0x8F = 0x72; // 8 MHz interni RC oscilator
 
// Digitalni vystupy
output_low(PIN_B0); // nepouzity
output_low(PIN_B1); // nepouzity
output_low(PIN_B3); // PWM vystup
output_high(PIN_B5); // TX data
port_b_pullups(TRUE); // vstupy s pull up odporem
 
// Analogove vstupy
*ANSEL = 0x03; // AN0 a AN1
 
// Inicializace LCD
lcd_init();
Xrs=1;
Xlcd=1;
printf(Xputc,"\fSolar Cell\r\nTester 1.00\r");
 
// Inicializace PWM 8 bitu
*PR2 = 0x3F; // perioda PWM casovace
*T2CON = 0x04; // povoleni casovace T2 bez preddelicu a postdelicu
*CCP1CON = 0x0C; // PWM mode, lsb bity nulove
*CCPR1L = 0; // na zacatku nulova data
output_low (PIN_B3); // PWM vystup
 
// Kalibrace pri drzenem tlacitku
EE_RD(0,Vref); // vytahni kalibracni konstantu z EEPROM
if (input(PIN_B4)==0) // otestuj tlacitko
{
delay_ms(200);
Calibrate(); // pokud je stalceno spust kalibraci
}
else
{
delay_ms(1000); // jinak jen 1s spozdeni
}
lcd_clr(); // smaz displej
 
// Hlavni smycka
{
int8 il,ih,im; // spodni a horni mez a maximum proudu
int8 i; // promenna cyklu
float Voltage,Power; // zmerene rozdilova napeti a vypocteny vykon
float MaxVoltage,MaxPower; // maximalni hodnoty
 
// Cihej na stisk tlacitka
0==PORTB; // jen precti port B
RBIF=0; // nuluj priznak preruseni od zmeny
 
// Pocatecni meze
il=0;
ih=10;
 
// Trvale prohledavani
for(;1;)
{
 
if (RBIF) // kdyz je tlacitko
{
AutoRun();
while (~input(PIN_B4)); // cti port B a cekej na uvolneni
RBIF=0;
}
 
Xrs=0;
Xlcd=1;
printf(Xputc,"\rOpt. [mA V mW]"); // napis na LCD
 
MaxVoltage=0; // inicializace maxim
MaxPower=0;
im=0;
 
for(i=il;i<=ih;i++) // dilci cyklus hledani
{
SetPWM(i+Ofset); // nastav proud
Voltage=GetVoltage(); // precti rozdilove napeti
Power=Voltage*i; // vypocti vykon
if (Power>MaxPower) // zkontroluj maximu
{
MaxVoltage=Voltage; // zapamatuj si maximum
MaxPower=Power;
im=i;
}
}
 
// Zobrazeni vysledku
Xrs=0;
Xlcd=1;
printf(Xputc,"\r\n%3u %1.2f %3.1f ", im, MaxVoltage, MaxPower);
 
// Natav nove meze
if (im>5) il=im-5; else il=0;
if (il>240) il=240;
ih=il+10;
}
}
}
/Designs/Measuring_instruments/CT01B/SW/1_00/CT01A100.HEX
0,0 → 1,412
:1000000008308A00BC2B00000A108A100A118207EF
:1000100028340C34013406340A108A100A1182077D
:100020000A340D34433461346C34693462347234CC
:100030006134743469346F346E340D340A340034EE
:100040000A108A100A11820753346534743420343C
:100050002534333475346D3441340D340A3400346E
:100060000A108A100A118207253431342E343234B2
:100070006634563420340D340A3400340A108A10A1
:100080000A1182070C344134753474346F3452349D
:1000900075346E3400340A108A100A1182070D3448
:1000A0000A3449345B346D3441345D342034553482
:1000B0005B3456345D34203450345B346D34573403
:1000C0005D3400340A108A100A1182070C3453344C
:1000D0006F346C34613472342034433465346C349E
:1000E0006C340D340A3454346534733474346534E8
:1000F0007234203431342E34303430340D34003402
:100100000A108A100A1182070D344F347034743487
:100110002E3420345B346D34413420345634203452
:100120006D3457345D340034A33084000008031963
:10013000A6280230F800F701F70B9C28F80B9B2843
:100140009730F700F70BA228800B9928003483160C
:100150002918AE2883128511B028831683128515BD
:1001600083168511A918B82883120512BA28831698
:1001700083120516831605122919C22883128613C5
:10018000C42883168312861783168613A919CC28D0
:1001900083120613CE2883168312061783160613BE
:1001A0008312051583160511000000008312051146
:1001B00083160511831200348316A708031DE42853
:1001C00083128513E62883168312851783168513F9
:1001D000A80E2808A9008312A7208316A80E2808B5
:1001E000A9008312A7201A30F700F70BF5280000AA
:1001F000003414308316A3008312942085138316D1
:10020000851383120511831605118312B90139086C
:10021000023C031C172902308316A300831294208A
:1002200003308316A9008312A720B90A07291A30C0
:10023000F700F70B1929000002308316A90083127A
:10024000A7201A30F700F70B23290000B90139085D
:10025000023C031C3D2939080420BA008316A7017B
:1002600083123A088316A8008312DC20023083161A
:10027000A30083129420B90A27298A15E22B83163A
:100280008612831286120830F80000000000000079
:10029000F8175B29F8138316A20C8312031886162D
:1002A000031C861278175B297813F80B4B29000082
:1002B0000000000086163F308400840B5D29F81B87
:1002C0004A29781B54290034013083162302A500E3
:1002D0002408023C031D6E294030A50725088038FC
:1002E000A600A7012608A8008312DC20003483168C
:1002F0002208F7000C307702831203198C290A3088
:100300007702031998290D3077020319A0290830C4
:1003100077020319A729AE298316A7010130A80087
:100320008312DC2002308316A30083129420BC29A0
:1003300001308316A3000230A40083126421BC297B
:1003400001308316A300A40083126421BC29831604
:10035000A7011030A8008312DC20BC2983162208D4
:100360001F3C031CB5290730A2050130A700220855
:10037000A8008312DC20BC290034241CCA2983165F
:1003800021080A3C0319C9292108A20083123F2130
:1003900083168312A41CD12983162108A20083127C
:1003A000772100343A08BA0A84003908B90ABD0036
:1003B00003178D008F0183168C130C1483120C0805
:1003C00080000313BB0BD2298A15092C0C3083162D
:1003D000A2008312772100340830F7008316061537
:1003E00083120619F129EA01F717042AF713042AE0
:1003F000031006190314EA0C7717042A7713F70B76
:10040000F8296A08F8000F2A3F30F71B1130F8006E
:10041000F80B082AF71BF629771BFE29F8298A15FD
:100420001D28670C9500950C3F30950517080F396E
:10043000E80067080339F700F70EF030F705770892
:100440006804970032308316A3008312942000348E
:100450008316200803199A2AA800240803199A2A47
:10046000A807031C342A3B2A7F30A802031C9A2ABF
:1004700003199A2A3F2A8130A80703189A2A2808C4
:10048000F700F801F901FA012108AC00AC172208C5
:10049000AB002308AA001830A800A9012A1C682A6A
:1004A0002708FA07031C5A2AF90A031D5A2AF80AD0
:1004B0000319A9172608F907031C612AF80A03196A
:1004C000A9172508A200A2172208F8070318A917E0
:1004D000A90DF80CF90CFA0CAC0CAB0CAA0C03101F
:1004E000A80B4D2A0130F70703189A2AF81B7F2A18
:1004F000AC0DFA0DF90DF80DF70303199A2AAC1F8C
:10050000902AFA0A031D902AF90A031D902AF80A74
:10051000031D902AF80CF90CFA0CF70A03199A2A11
:100520002108A9002508A906A91F982AF8179E2ABC
:10053000F8139E2AF701F801F901FA01000083126D
:1005400000348E30F70083162508F8002408F900DF
:10055000FA01F808031DB62A7908F800F9010830F5
:10056000F702F808031DB62AF701BE2A0310F81B8C
:10057000BD2AF90DF80DF703B62AF813000083120F
:1005800000348030031CC72A8316AD0683128316FD
:10059000B2012908B1002D08B10628080319B22BB1
:1005A000B000F7002C080319BB2BB0020319582B1D
:1005B0000318DB2A172B2D08B600B6172E08B50036
:1005C0002F08B400B3010310B60CB50CB40CB30C77
:1005D000B00BE22AB11FEF2A3214CF2B32103010A9
:1005E0003216AB308400E52B3212B11B012B301CCC
:1005F0000C2BB60CB50CB40CB30CF70A0319CA2BB0
:100600000C2BB61B0F2B0310B30DB40DB50DB60D8F
:10061000F7030319CA2B012B3217772B3213290842
:10062000B100A91F152BB617C32BB613C32B2C086B
:10063000B000F7002808B0022908B600B6172A084B
:10064000B5002B08B400B3010310B60CB50CB40C04
:10065000B30CB00B232BB11F302BB214CF2BB21025
:100660003010B216AF308400E52BB212B11B422B12
:10067000301C4D2BB60CB50CB40CB30CF70A031997
:10068000CA2B4D2BB61B502B0310B30DB40DB50D5B
:10069000B60DF7030319CA2B422BB217772BB213EF
:1006A0002D08B100AD1F562BB617C32BB613C32BA5
:1006B0002D08B600B6172E08B5002F08B400B11FDC
:1006C000652BB6133215CF2B3211B3013010AB307E
:1006D0008400E52BB11B8D2B2908B100301C772B32
:1006E000B60CB50CB40CB30CF70A0319CA2BB31F24
:1006F000882BB40A031D882BB50A031D882BB60A64
:10070000031D882BB60CB50CB40CF70A0319CA2BC1
:10071000321B0E2BB21B4F2BAC2B8030B606B61FF4
:10072000952BCF2B2D08B100A22B2908B100B608BC
:10073000031DA22BB508031DA22BB408031DA22B79
:10074000F701C32BB61BAC2B0310B30DB40DB50DC5
:10075000B60DF70BA22BCA2BB11FB02BB617C32BAC
:10076000B613C32B2C08F7002D08B6002E08B500D1
:100770002F08B400C32B2808F7002908B6002A0860
:10078000B5002B08B4003608F8003508F900340825
:10079000FA00042CF701F801F901FA01042CB30165
:1007A000B409B509B609B309B30A031DDE2BB40AAF
:1007B000031DDE2BB50A031DDE2BB60A3218EE2A06
:1007C000B2182F2B3219642B922B0008B407031C8C
:1007D000EF2BB50A031DEF2BB60A0319301484035F
:1007E0000008B507031CF72BB60A0319301484035D
:1007F0000008801BFC2B803AB60703183014321A0D
:10080000F42AB21A352B6A2B0000831200348316A7
:1008100021080319CE2CAD0025080319CE2CAD02FA
:100820000318132C182C7F30AD070318CE2C1E2C68
:100830008130AD02031CCE2C0319CE2C2D08F700FD
:10084000F801F901FA01AC012208AB00AB1723084B
:10085000AA002408A9001930AD002808A90203182D
:10086000412C0130AA020318412CAB020318412C81
:10087000AC020318412CAC0AAB0AAA0A2808A90743
:10088000732C2708AA0203185C2C0130AB02031852
:100890005C2CAC0203185C2CAC0AAB0A2708AA0734
:1008A0002808A907031C732CAA0A031D732CAB0A82
:1008B000031D732CAC0A732C26088038AB02031876
:1008C000722C0130AC020318722CAC0A2608803856
:1008D000AB072708AA07031C502CAB0A031D502C9A
:1008E000AC0A502C7A14AD0B762C812C0310A90D78
:1008F000AA0DAB0DAC0D0310FA0DF90DF80DAE0DF0
:100900002D2C2E1C892C0310F80CF90CFA0CAE0CB3
:100910008C2CF7030319CE2CAE1BB52C0310A90D9C
:10092000AA0DAB0DAC0D2808A9020318A12C0130AB
:10093000AA020318A12CAB020318A12CAC02031CC1
:10094000C42C2708AA020318AC2C0130AB020318F0
:10095000AC2CAC02031CC42C26088038AB02031854
:10096000B52C0130AC02031CC42CFA0A031DC42CA4
:10097000F90A031DC42CF80A031DC42CF70A031935
:10098000CE2CF80CF90CFA0C2208AD002608AD06A6
:10099000AD1FCC2CF817D22CF813D22CF701F8018C
:1009A000F901FA010000831200346B086C068039EB
:1009B000ED00EB1FDD2CEB09EB0AEC1FE12CEC0941
:1009C000EC0AF701F8016B0803106C18F707F70C35
:1009D000F80CEC18F707F70CF80C6C19F707F70C84
:1009E000F80CEC19F707F70CF80C6C1AF707F70C72
:1009F000F80CEC1AF707F70CF80C6C1BF707F70C60
:100A0000F80CEC1BF707F70CF80CED1F092DF80993
:100A1000F80A8A155B2A6B08F8016A020318132D7D
:100A20006A08F7001F2DF7010830EC00EA0DF70DFA
:100A30006B0877020318F700F80DEC0B162D003445
:100A400078086808EA006430EB000B257708E800B6
:100A500078083030031D332D6918E915E9193B2D4D
:100A6000691A2030352DE9116912F80778088316C4
:100A7000A1008312BD216808EA000A30EB000B25B3
:100A80007708E80078083030031D4A2DE919502D09
:100A9000691A2030F80778088316A1008312BD2157
:100AA0003030E80768088316A1008312BD210034A6
:100AB000EE01ED016C0DF700F70DF70DF830F705BD
:100AC000770841389F00C03083169F004230F700FE
:100AD000F70B682D000020308312EF00EF08031998
:100AE000872D1F152130F700F70B742DF1011E081B
:100AF000F300F201720883161E04F70077088312D0
:100B0000ED070318EE0A7308EE07EF036E2DEE0CE7
:100B1000ED0CEE0CED0CEE0CED0CEE0CED0CEE0C09
:100B2000ED0C0730EE056D08F8006E08F900003492
:100B30008E30F7006F08F8006E08F900FA01EF1F19
:100B4000A72DF809F909F90A031DA72DF80AF808D5
:100B5000031DB42D7908F800F9010830F702F808F0
:100B6000031DB42DF701BE2D0310F81BBB2DF90D8D
:100B7000F80DF703B42DEF1BBE2DF81300008A11FA
:100B8000D82DEC0158257908EB007808EA000130EF
:100B9000EC00582578086A02EC006B08ED00790833
:100BA000031C790FED026D08EF006C08EE00982D24
:100BB0007A088316A3007908A2007808A1007708B4
:100BC000A000831223088316A7008312220883162D
:100BD000A600831221088316A5008312200883161D
:100BE000A400831228227A08E9007908E80078082E
:100BF000E7007708E6006608F7006708F80068086D
:100C0000F9006908FA0000340408EF00F001E71F5A
:100C10000E2E2D308316A1008312BD21E717660822
:100C20000319B22E7F306602031C6D2EE600F5011B
:100C30000430F6000310E90DE80DE70DF00DF60B9A
:100C40001A2E0430660203182D2E03306602031D8F
:100C5000A72E0A307002031CA72E0330E602F50A05
:100C600054270310E90DE80DE70DF00D3D27023084
:100C7000F6000310F00CE70CE80CE90CF60B392E2B
:100C800054270430F6000310F10CF20CF30CF40CB2
:100C9000F60B432E3D2754277308F4007208F30027
:100CA0007108F200F1013D2754277208F400710821
:100CB000F300F101F2013D27F019212EE608031D92
:100CC000662EE90AE80AE70AF00AA72E0310E90DE2
:100CD000E80DE70DF00DE603212EE609E60A7F3068
:100CE000E607F5010430F6000310E90DE80DE70D05
:100CF000F00DF60B742E0430E60705306602031C77
:100D0000B42E54270310E90DE80DE70DF00D031084
:100D1000E90DE80DE70DF00D3D270310E90DE80D95
:100D2000E70DF00DF50A0330F6000310F00CE70CA8
:100D3000E80CE90CF60B952E0330E602701E7D2EB2
:100D40000310F00CE70CE80CE90CE6037D2EE60935
:100D5000E60A0330E6077508EB007508ED006F0A38
:100D6000ED07E12E6F0AF50030308316A1008312E3
:100D7000BD21EF0803193B2F2E308316A1008312EB
:100D8000BD217508EE00EE036F086E02031CCA2E2B
:100D90006F08EE00EE080319D42E30308316A10040
:100DA0008312BD21EE0BCD2E7508F6006F0AF602F8
:100DB00003185D2FE6036F0AED007508ED026D085C
:100DC000EB007008EA0066080319EB2EEC00031034
:100DD000EA0CEC0BE72E6D0803193B2F30306A0745
:100DE0008316A1008312BD216B08031DFF2EEF089F
:100DF00003193B2F2E308316A1008312BD21EB0374
:100E0000ED0303193B2F660803190B2FEC000310A9
:100E1000EA0DEC0B072F6A08F0027008F100670872
:100E2000F2006808F3006908F4000310E90DE80D0A
:100E3000E70DF00D0310E90DE80DE70DF00D740856
:100E4000E907031C282FE80F282FE70F282FF00AA7
:100E50007308E807031C2F2FE70F2F2FF00A7208E3
:100E6000E7070318F00A7108F0070310E90DE80D11
:100E7000E70DF00DE12E00005D2F7408E907031C5B
:100E8000462FE80F462FE70F462FF00A7308E807B2
:100E9000031C4D2FE70F4D2FF00A7208E7070318C8
:100EA000F00A7108F00700347008F1006708F200DA
:100EB0006808F3006908F4000034000000343F08BB
:100EC000C6004308C606C61F6A2F03110310BF1BC6
:100ED00003149D2F3F08C6004208C7003E08C70202
:100EE0000319782FC61F9D2F0308013A83009D2FF9
:100EF0004308C7003F08C7020319842FC61F9D2F50
:100F00000308013A83009D2F4408C7004008C70228
:100F10000319902FC61F9D2F0308013A83009D2FB0
:100F20004508C7004108C70203199C2FC61F9D2F03
:0C0F30000308013A83009D2F03100034D9
:101000008A11E6218A15E60166088A110C208A15E4
:10101000E60A8316A1008A118312BD218A150F30BA
:101020006602031D04282414A4143930E600283075
:10103000E700E703E8018A11EC298A157808E9003E
:10104000083C031D3D28E80803193C28E80369080B
:101050008316A2008A1183123F218A15203083163D
:10106000A2008A1183123F218A1569088316A20003
:101070008A1183123F218A15562869081F3C0318DC
:10108000562869087E3C031C562867086802031826
:1010900056286808E80A660784006908800069081D
:1010A0008316A2008A1183123F218A1569080D3C1C
:1010B000031D1B28660868078400800139308400FE
:1010C0000008713C031DA528E7018A1111228A1529
:1010D0000A308316A2008A1183123F218A150D302F
:1010E0008316A2008A1183123F218A15E60120305F
:1010F000E7000430E8006608E60AE9006708E70A46
:1011000084000008EA00690803178D008F010313AB
:101110006A0803178C0083168C130C1583120313B3
:101120000B08F7008B138316031755308D00AA3078
:101130008D008C148C189A280C11770883120313D5
:101140008B04E80B7B28DD2AB02A393084000008A4
:10115000763C031D232A3A30E6007F30E700E801A1
:10116000E901EA01EB01EC01ED01EE01EF01F10112
:101170007108F10A660784000008F0002F3C03188C
:10118000C5287008393C0318D12870082B3C031976
:10119000D12870082D3C0319D12870082E3C031D5E
:1011A000DF2970082D3C031DDD280130EF00710898
:1011B000F10A660784000008F00070082B3C031D4C
:1011C000E7287108F10A660784000008F00070083B
:1011D0002F3C03185B297008393C031C5B298316DC
:1011E000A301A2012030A1008230A00083126E086A
:1011F0008316A70083126D088316A60083126C085D
:101200008316A50083126B088316A4008A1183122B
:1012100028228A1577088316A0007808A10079088B
:10122000A2007A08A300A5017008A4008A11831205
:10123000A1228A15031083162308AB002208AA00F6
:101240002108A9002008A8007A08AF007908AE009C
:101250007808AD007708AC008A118312C1228A1584
:1012600077088316A4007808A5007908A6007A08F4
:10127000A70003142708AB002608AA002508A90028
:101280002408A800AF01AE014030AD008430AC00AE
:101290008A118312C1228A157A08EE007908ED00BE
:1012A0007808EC007708EB007108F10A6607840003
:1012B0000008F000E72870082E3C031DDF297108A4
:1012C000F10A660784000008F00070082F3C03183C
:1012D000DF297008393C031CDF296A088316A30044
:1012E000831269088316A200831268088316A1007E
:1012F000831267088316A000A701A6012030A5006D
:101300008230A4008A11831228228A157A08EA0002
:101310007908E9007808E8007708E70030307002C3
:101320008316A501A4008A118312A1228A157A08C6
:101330008316A4007908A3007808A2007708A1000A
:1013400083126A088316A800831269088316A7000F
:10135000831268088316A600831267088316A50007
:101360008A11831207248A1503106E088316AB00B6
:1013700083126D088316AA0083126C088316A900D5
:1013800083126B088316A8007A08AF007908AE00B4
:101390007808AD007708AC008A118312C1228A1543
:1013A0007A08EE007908ED007808EC007708EB0089
:1013B0007108F10A660784000008F00065296F0BC8
:1013C000E3298030EC066B08F7006C08F8006D0824
:1013D000F9006E08FA007708E6007808E700790857
:1013E000E8007A08E9008316A400831268088316CF
:1013F000A300831267088316A2008312660883166F
:10140000A100A801C030A7007F30A6008830A50049
:101410008A11831207248A157A08A3007908A2008A
:101420007808A1007708A0000D308316A2008A1169
:1014300083123F218A150A308316A2008A11831273
:101440003F218A15B02A3930840080080319B02A58
:101450003930E600E901E801E701E6080319362A18
:101460006908E90A660784000008EA006A082D3C5A
:10147000031D432A0130E8006908E90A6607840071
:101480000008EA004D2A6A082B3C031D4D2A690812
:10149000E90A660784000008EA006A082F3C03187E
:1014A000672A6A08393C031C672A0A30EB00670880
:1014B000EC008A11D52C8A1530306A027807E700D3
:1014C0006908E90A660784000008EA004D2A680BEB
:1014D0006B2AE709E70A6708F8007808E100073097
:1014E000E60020308316A1008A118312BD218A15DF
:1014F000E60B712AE70167088A1120208A15E70A9E
:101500008316A1008A118312BD218A150430670257
:10151000031D7B2A6108E8001030E9008A112025AC
:101520008A150730E80068088A1120208A15E80A21
:101530008316A1008A118312BD218A150B3068021F
:10154000031D932A05306107E600E7008A11112286
:101550008A1564308316A3008A11831294208A1599
:101560008A11C1258A157A08E5007908E40078080F
:10157000E3007708E200023084006508E9006408AF
:10158000E8006308E7006208E6008A1104268A156D
:101590000530E60066088A1130208A15E60A8316AF
:1015A000A1008A118312BD218A1509306602031D2C
:1015B000CA2A13288A11E6218A158A151B2C2410A1
:1015C000A414BE013E088A113E208A15BE0A831665
:1015D000A1008A118312BD218A1508303E02031D25
:1015E000E22A2414A410BE013E088A114B208A1559
:1015F000BE0A8316A1008A118312BD218A151230FA
:101600003E02031DF42AA414E7018A1111228A154F
:1016100064308316A3008A11831294208A15BD01B9
:101620003D08FA3C031CA52B05303D07BE00E70032
:101630008A1111228A158A11C1258A157A08BC00DF
:101640007908BB007808BA007708B900C101C00169
:10165000BF01BE013C08C5003B08C4003A08C300F6
:101660003908C2008A115F278A15031CA12B831633
:10167000A50183123D088316A4008A118312A122BA
:101680008A153C088316A30083123B088316A20028
:1016900083123A088316A100831239088316A0002A
:1016A0007A08A7007908A6007808A5007708A400A2
:1016B0008A11831228228A157708BE007808BF0095
:1016C0007908C0007A08C1000D308316A1008A1184
:1016D0008312BD218A150A308316A1008A11831254
:1016E000BD218A153D08E800E9018A1120258A15E7
:1016F00020308316A1008A118312BD218A15023081
:1017000084003C08E9003B08E8003A08E700390893
:10171000E6008A1104268A1520308316A1008A115A
:101720008312BD218A15013084004108E900400878
:10173000E8003F08E7003E08E6008A1104268A1503
:10174000A32BFA30BD00BD0A102B0D308316A1006B
:101750008A118312BD218A150A308316A1008A11CD
:101760008312BD218A15E7018A1111228A158A1177
:10177000E6218A158A15312C84011F3083058316D2
:101780009F019D01073083129F00831686128312EA
:101790008616723083168F00061083120610831689
:1017A0008610831286108316861183128611831683
:1017B0008612831286168316811303309B008A11CA
:1017C0008312F9288A152414A414B90139088A113E
:1017D00062208A15B90A8316A1008A118312BD21DD
:1017E0008A1519303902031DE62B3F30831692000B
:1017F0000430831292000C309700950183168611F5
:1018000083128611B9012030BA000430BB008A115E
:10181000D2298A158316061600308312061A013063
:10182000003A031D1C2CC8308316A3008A118312B2
:1018300094208A150028272C0430B900FA3083162A
:10184000A3008A11831294208A15B90B1E2C8A11C9
:10185000E6218A150B10A5010A30A6000B1C372CB7
:10186000DF2A831606168312061E312C0B10241055
:10187000A414B90139088A1180208A15B90A83167F
:10188000A1008A118312BD218A150F303902031D70
:101890003A2CB401B301B201B101B801B701B601EC
:1018A000B501A7012508A80028082602031CC02CA2
:1018B00005302807B900E7008A1111228A158A111C
:1018C000C1258A157A08AC007908AB007808AA000F
:1018D0007708A9008316A501831228088316A4009F
:1018E0008A118312A1228A152C088316A300831261
:1018F0002B088316A20083122A088316A1008312E4
:1019000029088316A0007A08A7007908A60078089D
:10191000A5007708A4008A11831228228A157A0864
:10192000B0007908AF007808AE007708AD0038083D
:10193000C1003708C0003608BF003508BE003008B7
:10194000C5002F08C4002E08C3002D08C2008A114C
:101950005F278A15031CBE2C2C08B4002B08B3008B
:101960002A08B2002908B1003008B8002F08B700D3
:101970002E08B6002D08B5002808A700A80A542C88
:101980002410A4140D308316A1008A118312BD21E6
:101990008A150A308316A1008A118312BD218A1587
:1019A0002708E8001030E9008A1120258A15203028
:1019B0008316A1008A118312BD218A15023084008A
:1019C0003408E9003308E8003208E7003108E6008F
:1019D0008A1104268A1520308316A1008A118312E9
:1019E000BD218A15013084003808E9003708E80075
:1019F0003608E7003508E6008A1104268A152030EB
:101A00008316A1008A118312BD218A152030831606
:101A1000A1008A118312BD218A152708053C0318ED
:101A2000152D05302702A500162DA5012508F03C2F
:101A300003181C2DF030A5000A302507A6002E2C17
:021A4000630041
:02400E00382F49
:00000001FF
;PIC16F88
/Designs/Measuring_instruments/CT01B/SW/1_00/EEPROM.C
0,0 → 1,43
// EEPROM.C - knihovna pro pohodlny zapis a cteni promennych do a z pameti
// EEPROM a to pro ruzne typy promennych.
//
// (c)miho 2002
//
// Historie:
//
// 0.00 Uvodni verze
// 0.01 Formalni zmena
 
 
// Priklad:
//
// int32 MyInt; // deklarace typu (libovolne delky)
// EE_WR(10, MyInt); // zapis promenne MyInt do EEPROM od adresy 10
// EE_RD(10, MyInt); // zpetne nacteni promenne MyInt z EEPROM
//
 
 
// Makro pro jednotne ukladani a vybirani dat (promennych) do a z pameti EEPROM
//
#define EE_WR(EEAddress, Data) EE_Write(EEAddress, &Data, sizeof(Data))
#define EE_RD(EEAddress, Data) EE_Read (EEAddress, &Data, sizeof(Data))
 
 
// Ulozeni promenne do pameti EEPROM
//
void EE_Write(int EEAddress, DataPtr, Len)
{
do
write_eeprom(EEAddress++, *DataPtr++);
while (--Len);
}
 
 
// Nacteni promenne z pameti EEPROM
//
void EE_Read(int EEAddress, DataPtr, Len)
{
do
*DataPtr++ = read_eeprom(EEAddress++);
while (--Len);
}
/Designs/Measuring_instruments/CT01B/SW/1_00/LCD.C
0,0 → 1,311
// LCD modul pro ovladani dvouradkoveho LCD modulu se standardnim Hitachi radicem
// (c)miho 2002,2005
//
// Historie:
//
// 0.00 Uvodni verze se snadnou definici portu LCD displeje
// 0.01 Oprava portu (zapomenute stare identifikatory)
// 0.02 Doplnena moznost pripojeni datoveho portu LCD na libovolne porty
// 0.03 Doplnena procedura lcd_clr pro smazani displeje
//
//
// Funkce:
//
// lcd_init() inicializuje LCD displej a porty, nutno volat jako prvni
//
// lcd_putc(c) zapis snaku do lcd displeje, zpracovava nasledujici ridici znaky
// \f = \x0C - nova stranka - smazani displeje
// \n = \x0A - odradkovani (prechod na druhou radku)
// \b = \x08 - backspace - posunuti kurzoru o 1 pozici zpet
// \r = \x0D - goto home to position 1,1
// \0 .. \7 - definovatelne znaky v pozicich 0 az 7 v CGRAM
// \20 .. \27 - alternativne zapsane znaky (oktalove) v pozicich 0 az 7 CGRAM
// Pozor na to, ze funkce printf konci tisk pokud narazi na \0 (konec retezce)
//
// lcd_gotoxy(x,y) presune kurzor na uvedenou adresu
// nekontroluje parametry
//
// lcd_cursor_on zapne kurzor
// lcd_cursor_off vypne kurzor
//
// lcd_clr smaze displej
//
// lcd_define_char(Index, Def) Makro, ktere definuje znaky od pozice Index obsahem definicniho
// retezce Def. Kazdych 8 znaku retezce Def definuje dalsi znak v CGRAM.
// Kapacita CGRAM je celkem 8 znaku s indexem 0 az 7.
// Na konci se provede lcd_gotoxy(1,1).
// Na konci teto knihovny je priklad pouziti definovanych znaku
//
//
// Definice portu: // Datovy port displeje pripojeny na 4 bity za sebou na jeden port
//
// #define LCD_RS PIN_B2 // rizeni registru LCD displeje
// #define LCD_E PIN_B1 // enable LCD displeje
// #define LCD_DATA_LSB PIN_C2 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
//
//
// Alternativni definice: // Datovy port displeje pripojeny na libovolne 4 bitove porty (vede na kod delsi asi o 25 slov)
//
// #define LCD_RS PIN_B2 // rizeni registru LCD displeje
// #define LCD_E PIN_B1 // enable LCD displeje
// #define LCD_D0 PIN_C2 // D0 - datove bity pripojene na libovolne porty
// #define LCD_D1 PIN_C3 // D1
// #define LCD_D2 PIN_C4 // D2
// #define LCD_D3 PIN_C5 // D3
 
 
 
 
// Privatni sekce, cist jen v pripade, ze neco nefunguje
 
 
 
 
#ifdef LCD_DATA_LSB
// Generovane defince portu pro ucely teto knihovny aby kod generoval spravne IO operace a soucasne
// bylo mozne jednoduse deklarovat pripojene piny LCD displeje pri pouziti teto knihovny. Problem spociva
// v tom, ze se musi spravne ridit smery portu a soucasne datovy port zabira jen 4 bity ze zadaneho portu
//
#define LCD_SHIFT (LCD_DATA_LSB&7) // pocet bitu posuvu datoveho kanalu v datovem portu
#define LCD_PORT (LCD_DATA_LSB>>3) // adresa LCD datoveho portu
#define LCD_TRIS (LCD_PORT+0x80) // adresa prislusneho TRIS registru
#define LCD_MASK (0xF<<LCD_SHIFT) // maska platnych bitu
//
#if LCD_SHIFT>4 // kontrola mezi
#error LCD data port LSB bit not in range 0..4
#endif
#endif
 
 
// Definice konstant pro LCD display
//
#define LCD_CURSOR_ON_ 0x0E // kurzor jako blikajici radka pod znakem
#define LCD_CURSOR_OFF_ 0x0C // zadny kurzor
#define LCD_LINE_2 0x40 // adresa 1. znaku 2. radky
 
 
// Definice rezimu LCD displeje
//
BYTE const LCD_INIT_STRING[4] =
{
0x28, // intrfejs 4 bity, 2 radky, font 5x7
LCD_CURSOR_OFF_, // display on, kurzor off,
0x01, // clear displeje
0x06 // inkrement pozice kurzoru (posun kurzoru doprava)
};
 
 
// Odesle nibble do displeje (posle data a klikne signalem e)
//
void lcd_send_nibble( BYTE n )
{
#ifdef LCD_DATA_LSB
// data jsou za sebou na 4 bitech jednoho portu
*LCD_PORT = (*LCD_PORT & ~LCD_MASK) | ((n << LCD_SHIFT) & LCD_MASK); // nastav datove bity portu a ostatni zachovej
#else
// data jsou na libovolnych 4 bitech libovolnych portu
output_bit(LCD_D0,bit_test(n,0));
output_bit(LCD_D1,bit_test(n,1));
output_bit(LCD_D2,bit_test(n,2));
output_bit(LCD_D3,bit_test(n,3));
#endif
output_bit(LCD_E,1); // vzestupna hrana
delay_us(1); // pockej alespon 450ns od e nebo alespon 195ns od dat
output_bit(LCD_E,0); // sestupna hrana (minimalni perioda e je 1us)
}
 
 
// Odesle bajt do registru LCD
//
// Pokud je Adr=0 .. instrukcni registr
// Pokud je Adr=1 .. datovy registr
//
void lcd_send_byte( BOOLEAN Adr, BYTE n )
{
output_bit(LCD_RS,Adr); // vyber registr
swap(n);
lcd_send_nibble(n); // posli horni pulku bajtu
swap(n);
lcd_send_nibble(n); // posli spodni pulku bajtu
delay_us(40); // minimalni doba na provedeni prikazu
}
 
 
// Provede inicializaci LCD displeje, smaze obsah a nastavi mod displeje
//
// Tato procedura se musi volat pred pouzitim ostatnich lcd_ procedur
//
void lcd_init()
{
 
int i; // pocitadlo cyklu
 
delay_ms(20); // spozdeni pro provedeni startu displeje po zapnuti napajeni
 
#ifdef LCD_DATA_LSB
// data jsou na 4 bitech za sebou, nastav smer pro vsechny dalsi prenosy
*LCD_TRIS = *LCD_TRIS & ~LCD_MASK; // nuluj odpovidajici bity tris registru datoveho portu LCD
#endif
 
output_bit(LCD_RS,0); // nastav jako vystup a nastav klidovy stav
output_bit(LCD_E, 0); // nastav jako vystup a nastav klidovy stav
 
for (i=0; i<3; i++) // nastav lcd do rezimu 8 bitu sbernice
{
delay_ms(2); // muze byt rozdelany prenos dat (2x 4 bity) nebo pomaly povel
lcd_send_nibble(3); // rezim 8 bitu
}
 
delay_us(40); // cas na zpracovani
lcd_send_nibble(2); // nastav rezim 4 bitu (plati od nasledujiciho prenosu)
delay_us(40); // cas na zpracovani
 
for (i=0;i<3;i++) // proved inicializaci (nastaveni modu, smazani apod)
{
lcd_send_byte(0,LCD_INIT_STRING[i]);
delay_ms(2);
}
}
 
 
// Proved presun kurzoru
//
// Pozice 1.1 je domu
//
void lcd_gotoxy( BYTE x, BYTE y)
{
 
BYTE Adr;
 
Adr=x-1;
if(y==2)
Adr+=LCD_LINE_2;
 
lcd_send_byte(0,0x80|Adr);
}
 
 
// Zapis znaku na displej, zpracovani ridicich znaku
//
void lcd_putc( char c)
{
 
switch (c)
{
case '\f' : lcd_send_byte(0,1); // smaz displej
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2); break; // presun se na 1. znak 2. radky
case '\r' : lcd_gotoxy(1,1); break; // presun home
case '\b' : lcd_send_byte(0,0x10); break; // posun kurzor o 1 zpet
default : if (c<0x20) c&=0x7; // preklopeni definovatelnych znaku na rozsah 0 az 0x1F
lcd_send_byte(1,c); break; // zapis znak
}
}
 
 
// Zapni kurzor
//
void lcd_cursor_on()
{
lcd_send_byte(0,LCD_CURSOR_ON_);
}
 
 
// Vypni kurzor
//
void lcd_cursor_off()
{
lcd_send_byte(0,LCD_CURSOR_OFF_);
}
 
 
// Smaz displej
//
void lcd_clr()
{
lcd_putc('\f');
}
 
 
// Definice vlastnich fontu
//
// Vlastnich definic muze byt jen 8 do pozic 0 az 7 pameti CGRAM radice lcd displeje
// Pro snadne definovani jsou pripraveny nasledujici definice a na konci souboru je uveden
// priklad pouziti definovanych znaku.
 
 
// Pomocna procedura pro posilani ridicich dat do radice displeje
//
void lcd_putc2(int Data)
{
lcd_send_byte(1,Data);
}
 
 
// Pomocne definice pro programovani obsahu CGRAM
//
#define lcd_define_start(Code) lcd_send_byte(0,0x40+(Code<<3)); delay_ms(2)
#define lcd_define_def(String) printf(lcd_putc2,String);
#define lcd_define_end() lcd_send_byte(0,3); delay_ms(2)
 
 
// Vlastni vykonne makro pro definovani fontu do pozice Index CGRAM s definicnim retezcem Def
//
#define lcd_define_char(Index, Def) lcd_define_start(Index); lcd_define_def(Def); lcd_define_end();
 
 
// Pripravene definice fontu vybranych znaku
// V tabulce nesmi byt 00 (konec retezce v printf()), misto toho davame 80
//
#define LCD_CHAR_BAT100 "\x0E\x1F\x1F\x1F\x1F\x1F\x1F\x1F" /* symbol plne baterie */
#define LCD_CHAR_BAT50 "\x0E\x1F\x11\x11\x13\x17\x1F\x1F" /* symbol polovicni baterie */
#define LCD_CHAR_BAT0 "\x0E\x1F\x11\x11\x11\x11\x11\x1F" /* symbol vybite baterie */
#define LCD_CHAR_UP "\x80\x04\x0E\x15\x04\x04\x04\x80" /* symbol sipka nahoru */
#define LCD_CHAR_DOWN "\x80\x04\x04\x04\x15\x0E\x04\x80" /* symbol Sipka dolu */
#define LCD_CHAR_LUA "\x04\x0E\x11\x11\x1F\x11\x11\x80" /* A s carkou */
#define LCD_CHAR_LLA "\x01\x02\x0E\x01\x1F\x11\x0F\x80" /* a s carkou */
#define LCD_CHAR_HUC "\x0A\x0E\x11\x10\x10\x11\x0E\x80" /* C s hackem */
#define LCD_CHAR_HLC "\x0A\x04\x0E\x10\x10\x11\x0E\x80" /* c s hackem */
#define LCD_CHAR_HUD "\x0A\x1C\x12\x11\x11\x12\x1C\x80" /* D s hackem */
#define LCD_CHAR_HLD "\x05\x03\x0D\x13\x11\x11\x0F\x80" /* d s hackem */
#define LCD_CHAR_LUE "\x04\x1F\x10\x10\x1E\x10\x1F\x80" /* E s carkou */
#define LCD_CHAR_LLE "\x01\x02\x0E\x11\x1F\x10\x0E\x80" /* e s carkou */
#define LCD_CHAR_HUE "\x0A\x1F\x10\x1E\x10\x10\x1F\x80" /* E s hackem */
#define LCD_CHAR_HLE "\x0A\x04\x0E\x11\x1F\x10\x0E\x80" /* e s hackem */
#define LCD_CHAR_LUI "\x04\x0E\x04\x04\x04\x04\x0E\x80" /* I s carkou */
#define LCD_CHAR_LLI "\x02\x04\x80\x0C\x04\x04\x0E\x80" /* i s carkou */
#define LCD_CHAR_HUN "\x0A\x15\x11\x19\x15\x13\x11\x80" /* N s hackem */
#define LCD_CHAR_HLN "\x0A\x04\x16\x19\x11\x11\x11\x80" /* n s hackem */
#define LCD_CHAR_LUO "\x04\x0E\x11\x11\x11\x11\x0E\x80" /* O s carkou */
#define LCD_CHAR_LLO "\x02\x04\x0E\x11\x11\x11\x0E\x80" /* o s carkou */
#define LCD_CHAR_HUR "\x0A\x1E\x11\x1E\x14\x12\x11\x80" /* R s hackem */
#define LCD_CHAR_HLR "\x0A\x04\x16\x19\x10\x10\x10\x80" /* r s hackem */
#define LCD_CHAR_HUS "\x0A\x0F\x10\x0E\x01\x01\x1E\x80" /* S s hackem */
#define LCD_CHAR_HLS "\x0A\x04\x0E\x10\x0E\x01\x1E\x80" /* s s hackem */
#define LCD_CHAR_HUT "\x0A\x1F\x04\x04\x04\x04\x04\x80" /* T s hackem */
#define LCD_CHAR_HLT "\x0A\x0C\x1C\x08\x08\x09\x06\x80" /* t s hackem */
#define LCD_CHAR_LUU "\x02\x15\x11\x11\x11\x11\x0E\x80" /* U s carkou */
#define LCD_CHAR_LLU "\x02\x04\x11\x11\x11\x13\x0D\x80" /* u s carkou */
#define LCD_CHAR_CUU "\x06\x17\x11\x11\x11\x11\x0E\x80" /* U s krouzkem */
#define LCD_CHAR_CLU "\x06\x06\x11\x11\x11\x11\x0E\x80" /* u s krouzkem */
#define LCD_CHAR_LUY "\x02\x15\x11\x0A\x04\x04\x04\x80" /* Y s carkou */
#define LCD_CHAR_LLY "\x02\x04\x11\x11\x0F\x01\x0E\x80" /* y s carkou */
#define LCD_CHAR_HUZ "\x0A\x1F\x01\x02\x04\x08\x1F\x80" /* Z s hackem */
#define LCD_CHAR_HLZ "\x0A\x04\x1F\x02\x04\x08\x1F\x80" /* z s hackem */
 
 
// Priklad pouziti definovanych znaku
//
//
//void lcd_sample()
//{
// lcd_define_char(0,LCD_CHAR_BAT50); // Priklad definice znaku baterie do pozice 0
// lcd_define_char(2,LCD_CHAR_HLE LCD_CHAR_LUI); // Priklad definice znaku e s hackem a I s carkou od pozice 2
// // vsimnete si, ze neni carka mezi retezci s definici (oba retezce definuji
// // jediny definicni retezec)
// printf(lcd_putc,"\fZnaky:\20\22\23"); // priklad vypisu znaku z pozice 0, 2 a 3
// delay_ms(1000);
// lcd_define_char(0,LCD_CHAR_BAT0); // Predefinovani tvaru znaku v pozici 0
// delay_ms(1000);
//}