Hlavní stránka‎ > ‎

RTC PCF8583 (Delphi, I2C)

Zde můžete stáhnou program (Windows) pro PCF 8583 - Obvod reálného času, kalendáře, alarmu a s integrovanu paměťí. Opět se jedná o obvod adresovatelný přes linku I2C.
K zapojení obvodu: adresovací vstup A0 uzemníme na vývod VSS, vývody oscilátoru připojíme na krystal 32,768 KHz, jehož blokovací kondenzátor 22 pF (OSCI)  je připojen na napájecí napětí VDD.
 
 
 
unit Unit1;
 
Náhled do výpisu programu:
 
interface
uses portinc, I2Ccom1,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, Mask;
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Timer2: TTimer;
    Panel1: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Panel2: TPanel;
    LabeledEdit1: TLabeledEdit;
    LabeledEdit2: TLabeledEdit;
    LabeledEdit3: TLabeledEdit;
    LabeledEdit4: TLabeledEdit;
    LabeledEdit5: TLabeledEdit;
    LabeledEdit6: TLabeledEdit;
    Button1: TButton;
    Panel3: TPanel;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    CheckBox6: TCheckBox;
    CheckBox7: TCheckBox;
    CheckBox8: TCheckBox;
    Panel4: TPanel;
    CheckBox9: TCheckBox;
    CheckBox10: TCheckBox;
    CheckBox11: TCheckBox;
    CheckBox12: TCheckBox;
    CheckBox13: TCheckBox;
    CheckBox14: TCheckBox;
    CheckBox15: TCheckBox;
    CheckBox16: TCheckBox;
    Label8: TLabel;
    Label7: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    StatusBar1: TStatusBar;
    Panel5: TPanel;
    Panel6: TPanel;
    LabeledEdit7: TLabeledEdit;
    LabeledEdit8: TLabeledEdit;
    LabeledEdit9: TLabeledEdit;
    LabeledEdit10: TLabeledEdit;
    Button2: TButton;
    LabeledEdit11: TLabeledEdit;
    Label11: TLabel;
    LabeledEdit12: TLabeledEdit;
    Label12: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure CheckBox2Click(Sender: TObject);
    procedure CheckBox3Click(Sender: TObject);
    procedure CheckBox4Click(Sender: TObject);
    procedure CheckBox5Click(Sender: TObject);
    procedure CheckBox6Click(Sender: TObject);
    procedure CheckBox7Click(Sender: TObject);
    procedure CheckBox8Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  registr : Word;
  CSreg: integer;
implementation
uses TypInfo;
{$R *.dfm}
procedure RTCzapis (Word_adresa, data: Byte);
begin
  Start;
  vystup (80*2);      { adresa 162, zápis  }
  vystup (Word_adresa);
  vystup (data);
  Stop;
end;

function RTCcteni  :Word;
begin
  Start;
  vystup (80*2);      { adresa 162, zápis  }
  vystup (registr);
  Stop;
  Start;
  vystup (80*2+1);  { adresa 163, čtení }
  RealTime(true);
  RTCcteni := nacteni ;
  RealTime(false);
  NoAcknowledge;
  Stop;
end;

function msec: Word;
begin
registr := 1;
if RTCcteni   <10 then msec := RTCcteni;
if RTCcteni > 9 then msec := (RTCcteni - 6);
if RTCcteni > 25 then msec := (RTCcteni - 12);
if RTCcteni > 41 then msec := (RTCcteni - 18);
if RTCcteni > 57 then msec := (RTCcteni - 24);
if RTCcteni > 73 then msec := (RTCcteni - 30);
if RTCcteni > 89 then msec := (RTCcteni - 36);
if RTCcteni > 105 then msec := (RTCcteni - 42);
if RTCcteni > 121 then msec := (RTCcteni - 48);
if RTCcteni > 137 then msec := (RTCcteni - 53);
if RTCcteni > 152 then msec := (RTCcteni );
end;
 

function sec: Word;
begin
registr := 2;
if RTCcteni < 10 then sec := (RTCcteni);
if RTCcteni > 9 then sec := (RTCcteni - 6);
if RTCcteni > 25 then sec := (RTCcteni - 12);
if RTCcteni > 41 then sec := (RTCcteni - 18);
if RTCcteni > 57 then sec := (RTCcteni - 24);
if RTCcteni > 73 then sec := (RTCcteni - 30);
if RTCcteni > 89 then sec := (RTCcteni );
end;
 
function min: Word;
begin
registr := 3;
if RTCcteni < 10 then min := (RTCcteni);
if RTCcteni > 9 then min := (RTCcteni - 6);
if RTCcteni > 25 then min := (RTCcteni - 12);
if RTCcteni > 41 then min := (RTCcteni - 18);
if RTCcteni > 57 then min := (RTCcteni - 24);
if RTCcteni > 73 then min := (RTCcteni - 30);
if RTCcteni > 89 then min := (RTCcteni );
end;
 
function hod: Word;
begin
registr := 4;
if RTCcteni < 10 then hod := (RTCcteni);
if RTCcteni > 9 then hod := (RTCcteni - 6);
if RTCcteni > 25 then hod := (RTCcteni - 12);
if RTCcteni > 36 then hod := (RTCcteni );
end;

function dny: Word;
begin
registr := 5;
if RTCcteni < 10 then dny := (RTCcteni);
if RTCcteni > 9 then dny := (RTCcteni - 6);
if RTCcteni > 25 then dny := (RTCcteni - 12);
if RTCcteni > 41 then dny := (RTCcteni - 18);
if RTCcteni > 57 then dny := (RTCcteni - 24);
if RTCcteni > 49 then dny := (RTCcteni );
end;

function dny_tydne: string;
begin
registr := 6;
if RTCcteni = 0  then dny_tydne := 'pondělí';
if RTCcteni > 0  then dny_tydne := 'pondělí';
if RTCcteni > 31 then dny_tydne := 'úterý';
if RTCcteni > 63 then dny_tydne := 'středa';
if RTCcteni > 95 then dny_tydne := 'čtvrtek';
if RTCcteni > 127 then dny_tydne := 'pátek';
if RTCcteni > 159 then dny_tydne := 'sobota';
if RTCcteni > 191 then dny_tydne := 'neděle';
end;

function rok: Word;
begin
registr := 5;
if RTCcteni > 0 then rok := 0;
if RTCcteni > 64 then rok := 1;
if RTCcteni > 128 then rok := 2;
if RTCcteni > 192 then rok := 3;
end;

function mesic: string;
begin
registr := 6;
if RTCcteni = 33 and 32 then mesic := 'Leden';
if RTCcteni = 193 and 192 then mesic := 'Leden';
if RTCcteni = 129 and 128 then mesic := 'Leden';
if RTCcteni = 65 and 64 then mesic := 'Leden';
if RTCcteni = 1 and 0 then mesic := 'Leden';
if RTCcteni = 161 and 160 then mesic := 'Leden';
if RTCcteni = 97 and 96 then mesic := 'Leden';
if RTCcteni = 66  then mesic := 'Únor';
if RTCcteni = 2 then mesic := 'Únor';
if RTCcteni = 162  then mesic := 'Únor';
if RTCcteni = 98  then mesic := 'Únor';
if RTCcteni = 34 then mesic := 'Únor';
if RTCcteni = 194  then mesic := 'Únor';
if RTCcteni = 130  then mesic := 'Únor';
if RTCcteni = 99 then mesic := 'Březen';
if RTCcteni = 35 then mesic := 'Březen';
if RTCcteni = 195 then mesic := 'Březen';
if RTCcteni = 131 then mesic := 'Březen';
if RTCcteni = 67 then mesic := 'Březen';
if RTCcteni = 3 then mesic := 'Březen';
if RTCcteni = 163 then mesic := 'Březen';
if RTCcteni = 132 then mesic := 'Duben';
if RTCcteni = 68 then mesic := 'Duben';
if RTCcteni = 4 then mesic := 'Duben';
if RTCcteni = 164 then mesic := 'Duben';
if RTCcteni = 100 then mesic := 'Duben';
if RTCcteni = 36 then mesic := 'Duben';
if RTCcteni = 196 then mesic := 'Duben';
if RTCcteni = 165 then mesic := 'Květen';
if RTCcteni = 101 then mesic := 'Květen';
if RTCcteni = 37 then mesic := 'Květen';
if RTCcteni = 197 then mesic := 'Květen';
if RTCcteni = 133 then mesic := 'Květen';
if RTCcteni = 69 then mesic := 'Květen';
if RTCcteni = 5 then mesic := 'Květen';
if RTCcteni = 198 then mesic := 'Čeven';
if RTCcteni = 134 then mesic := 'Čeven';
if RTCcteni = 70 then mesic := 'Čeven';
if RTCcteni = 6 then mesic := 'Čeven';
if RTCcteni = 166 then mesic := 'Čeven';
if RTCcteni = 102 then mesic := 'Čeven';
if RTCcteni = 38 then mesic := 'Čeven';
if RTCcteni = 7 then mesic := 'Červenec';
if RTCcteni = 167 then mesic := 'Červenec';
if RTCcteni = 103 then mesic := 'Červenec';
if RTCcteni = 39 then mesic := 'Červenec';
if RTCcteni = 199 then mesic := 'Červenec';
if RTCcteni = 135 then mesic := 'Červenec';
if RTCcteni = 71 then mesic := 'Červenec';
if RTCcteni = 40 then mesic := 'Srpen';
if RTCcteni = 200 then mesic := 'Srpen';
if RTCcteni = 136 then mesic := 'Srpen';
if RTCcteni = 72 then mesic := 'Srpen';
if RTCcteni = 8 then mesic := 'Srpen';
if RTCcteni = 168 then mesic := 'Srpen';
if RTCcteni = 104 then mesic := 'Srpen';
if RTCcteni = 73 then mesic := 'Září';
if RTCcteni = 9 then mesic := 'Září';
if RTCcteni = 169 then mesic := 'Září';
if RTCcteni = 105 then mesic := 'Září';
if RTCcteni = 41 then mesic := 'Září';
if RTCcteni = 201 then mesic := 'Září';
if RTCcteni = 137 then mesic := 'Září';
if RTCcteni = 112 then mesic := 'Říjen';
if RTCcteni = 48 then mesic := 'Říjen';
if RTCcteni = 208 then mesic := 'Říjen';
if RTCcteni = 144 then mesic := 'Říjen';
if RTCcteni = 80 then mesic := 'Říjen';
if RTCcteni = 16 then mesic := 'Říjen';
if RTCcteni = 176 then mesic := 'Říjen';
if RTCcteni = 145 then mesic := 'Listopad';
if RTCcteni = 81 then mesic := 'Listopad';
if RTCcteni = 17 then mesic := 'Listopad';
if RTCcteni = 177 then mesic := 'Listopad';
if RTCcteni = 113 then mesic := 'Listopad';
if RTCcteni = 49 then mesic := 'Listopad';
if RTCcteni = 209 then mesic := 'Listopad';
if RTCcteni = 178 then mesic := 'Prosinec';
if RTCcteni = 114 then mesic := 'Prosinec';
if RTCcteni = 50 then mesic := 'Prosinec';
if RTCcteni = 210 then mesic := 'Prosinec';
if RTCcteni = 146 then mesic := 'Prosinec';
if RTCcteni = 82 then mesic := 'Prosinec';
if RTCcteni = 18 then mesic := 'Prosinec';
 
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 I2C_Init;
  Timer1.Interval := 1;
  Timer1.Enabled := true;
  CSreg := 0;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
StatusBar1.Panels[0].Text := 'PC DateTime = '+ DateTimeToStr(now) ;
Label8.Caption := FloatToStr(CSreg);
registr := StrToInt(LabeledEdit9.Text);
LabeledEdit10.Text := FloatToStr(RTCcteni);

Label1.Caption := FloatToStr(msec *10 )+ ' msec';
Label2.Caption := FloatToStr(sec) + ' sec';
Label3.Caption := FloatToStr(min) + ' min';
Label4.Caption := FloatToStr(hod) + ' hod';
Label5.Caption := FloatToStr(dny) + ' dny';
Label6.Caption := dny_tydne ;
Label11.Caption := FloatToStr(rok) + ' přestup. rok';
Label12.Caption := mesic ;
registr := 0;
Label7.Caption := FloatToStr(RTCcteni);
 
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
RTCzapis(0,StrToInt(Label8.Caption));
RTCzapis(1,StrToInt(LabeledEdit1.Text));
RTCzapis(2,StrToInt(LabeledEdit2.Text));
RTCzapis(3,StrToInt(LabeledEdit3.Text));
RTCzapis(4,StrToInt(LabeledEdit4.Text));
RTCzapis(5,StrToInt(LabeledEdit5.Text));
RTCzapis(6,StrToInt(LabeledEdit6.Text));
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked = true then
   CSreg := CSreg + 1 else
   CSreg := CSreg - 1;
end;
procedure TForm1.CheckBox2Click(Sender: TObject);
begin
if CheckBox2.Checked = true then
   CSreg := CSreg + 2 else
   CSreg := CSreg - 2;
end;
procedure TForm1.CheckBox3Click(Sender: TObject);
begin
if CheckBox3.Checked = true then
   CSreg := CSreg + 4 else
   CSreg := CSreg - 4;
end;
procedure TForm1.CheckBox4Click(Sender: TObject);
begin
if CheckBox4.Checked = true then
   CSreg := CSreg + 8 else
   CSreg := CSreg - 8;
end;
procedure TForm1.CheckBox5Click(Sender: TObject);
begin
if CheckBox5.Checked = true then
   CSreg := CSreg + 16 else
   CSreg := CSreg - 16;
end;
procedure TForm1.CheckBox6Click(Sender: TObject);
begin
if CheckBox6.Checked = true then
   CSreg := CSreg + 32 else
   CSreg := CSreg - 32;
end;
procedure TForm1.CheckBox7Click(Sender: TObject);
begin
if CheckBox7.Checked = true then
   CSreg := CSreg + 64 else
   CSreg := CSreg - 64;
end;
procedure TForm1.CheckBox8Click(Sender: TObject);
begin
if CheckBox8.Checked = true then
   CSreg := CSreg + 128 else
   CSreg := CSreg - 128;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
RTCzapis(StrToInt(LabeledEdit7.Text),StrToInt(LabeledEdit8.Text));
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
RTCzapis(2,89);
RTCzapis(3,89);
RTCzapis(4,35);
end;
end.