avatar_bilsisco

Saat ve ayarlama LCD sorunu

Başlatan bilsisco, 29 Ekim 2016, 15:44:30

bilsisco

Aşağıda bir önceki konuda paylaştığım kodlara ayarlama menüsü ekleme yaptığım projeyi paylaşıyorum
Sorun şu ki saat çalışıyor, eeproma yapılan ayarlar kaydediliyor ama ayar yaparken LCD kafayı yiyor.
Lütfen isiste çalıştırıp dener misiniz?
Derlerken hiçbir sorun olmuyor mikroc versiyon 6.6.2
Değer okuma işini kapattım ama ne yaptıysam düzelmedi
kodun uzunluğuna bakmayın isiste çalıştırdığınızda 1sn içinde ayara basılı tutup ayar menüsüne geçiliyor
// LCD module connectionssbit LCD_RS at RB4_bit;sbit LCD_EN at RB5_bit;sbit LCD_D4 at RB0_bit;sbit LCD_D5 at RB1_bit;sbit LCD_D6 at RB2_bit;sbit LCD_D7 at RB3_bit;sbit LCD_RS_Direction at TRISB4_bit;sbit LCD_EN_Direction at TRISB5_bit;sbit LCD_D4_Direction at TRISB0_bit;sbit LCD_D5_Direction at TRISB1_bit;sbit LCD_D6_Direction at TRISB2_bit;sbit LCD_D7_Direction at TRISB3_bit;// End LCD module connections#define DATA   PORTA.RA0#define CLK    PORTA.RA1#define DATA_X TRISA.RA0#define Ayar   PORTC.RC0#define Artir  PORTC.RC1#define Azalt  PORTC.RC2#define Nem_Cihazi  PORTC.RC3#define AA     PORTC.RC4#define BB     PORTC.RC5#define CC     PORTC.RC6#define DD     PORTC.RC7#define Fan    PORTB.RB6#define Lamba  PORTB.RB7#define _TEMP   0x03#define _HUMI   0x05#define _RESET  0x1E#include "sht11.h"const float d1C = -40.1;        //@ 14bitconst float d2C = 0.01;         //@ 14bitconst float C1  = -4.0;         //@ 12bitconst float C2  = 0.0405;       //@ 12bitconst float C3  = -0.0000028;   //@ 12bitconst float t1  = 0.01;         //@ 12bitconst float t2  = 0.00008;      //@ 12bitfloat tempt, humi;float RH_linear, RH_true;int alt_sck,ust_sck;int ham,tam,ond,alt1,alt2,ust1,ust2,nem1,nem2,motor_suresi;char txt[10],txt1[10];int gun, saat, dk, sn, say, guncelle, gnc, i;//unsigned short(int)=0 .. 255, int=-32768 .. 32767, (signed)short(int)=- 128 .. 127char snn[3];char dkk[3];char saatt[3];char gunn[8];char zaman[]="00:00:00";char yaz[10];int zmn[3];int ayardurum=0;//****************************************************void kurulum(){  ADCON1=7;                 // Tüm analog portlar dijitale ayarlandı  CMCON=7;                  // Tüm karşılaştırıcı modülleri kapatılıp portlar dijitale ayarlandı  //CCP1CON=0;                // PWM modülü sıfıra çekiliyor(kapatılıyor)  TRISA=0;  TRISB=0;  TRISC=0b00000111;         // ilk 3 pin giriş, diğerleri çıkış  PORTA=0;  PORTB=0;  PORTC=0;  say=0;  guncelle=1;  OPTION_REG=0b10000101;  INTCON=0b10100000;  TMR0=0;  gun=  EEPROM_Read(0x00);  alt1= EEPROM_Read(0x01);  alt2= EEPROM_Read(0x02);  ust1= EEPROM_Read(0x03);  ust2= EEPROM_Read(0x04);  nem1= EEPROM_Read(0x05);  nem2= EEPROM_Read(0x06);  motor_suresi= EEPROM_Read(0x07);  gun=0;  saat=23;  dk=59;  sn=58;//prescaler  101=64(her 64us de bir kesme oluyor)//bize 1sn gerek. 1sn için gerekli toplam kesme sayısı//1000000/64=15625 defa.//Her 256 kesmeden sonra kesme bayrağı (INTCON.T0IF) sıfırlanıyor//O zaman 15625/256=61~ defa bayrak kesme kontrolünden sonra 1sn geçmiş olacak.//Kesme oluştuğunda TMR0 içeriği 0 olur ve Timer0 Kesme bayrağı 1 olur(T0IF=1).}//****************************************************void Vakit(){  if (guncelle==1 && ayardurum==0){ // kesme ve ayarlama yoksa    zaman[0]=(saat/10)+48;    //tek haneli sayısalı stringe atama    zaman[1]=(saat%10)+48;    zaman[3]=(dk/10)+48;    zaman[4]=(dk%10)+48;    zaman[6]=(sn/10)+48;    zaman[7]=(sn%10)+48;    IntToStr(gun,gunn);   //sayısal değeri stringe dönüştürme    Ltrim(gunn);          //string ifadenin solundaki boşlukları silme    Lcd_Out(1,9,zaman);  //Lcd_Chr(1, 3, ':');    Lcd_Out(2,9,"GUN:");    Lcd_Out(2,13,gunn);    //Lcd_Out(1,4,dkk); //Lcd_Chr(1, 6, ':');    //Lcd_Out(2,7,saatt); Lcd_Chr(1, 3, ':');    //Lcd_Chr_Cp(223);             // Print degree character    //Lcd_Chr_Cp('C');             // Print 'C' for Centigrad    guncelle=0;  }}//****************************************************void interrupt(){i=1;  if(INTCON.T0IF){   //Kesme bayrağı. 256 kesmeden sonra 1 olur.    say=say+1;    if(say>=61){      sn=sn+1;      say=0;      if(sn>59) {        sn=0;        dk++;        if(dk>59){          dk=0;          saat++;          if(saat>23){            saat=0;            gun++;          }        }      }    }    guncelle=1;    INTCON.T0IF=0;    //TMR0=0;     //Kesme sayısı  }}//****************************************************void Deger_oku(){    if(!ayardurum){ // ayar yapılırken değer okumaması gerek      //read adc temperature value from SHT      tempt = SHT_Measure(_TEMP);  //_TEMP = 0x03      //calculate temperature in Celsius from value      //formul t = d1 + d2*SOt      tempt = d1C + (tempt * d2C); //d1C = -40.1 ve d2C = 0.01      floatToStr(tempt,txt1);  //convert to string      strncpy(txt,txt1,5);     //txt1'den ilk 5 karakteri txt'ye aktar      Lcd_Out(1,1,"T:");      //Ltrim(txt);            // sağdaki boşlukları sil      Lcd_Out(1,3,txt);      //----Alt Sıcaklık Kontrol-----------------------      ham=tempt*100;       //39.40999-->3940.999      ham=ceil(ham);       //3941 [double ceil(double x);] ceil(0.3); 1 eder.      alt_sck=alt1*100+alt2;     // 3640      if(alt_sck>ham) Lamba=1; else Lamba=0;      //----Üst Sıcaklık Kontrol-----------------------      ust_sck=ust1*100+ust2;     // 3770      if(ust_sck<ham) Fan=1; else Fan=0;            //read adc humidity value from SHT      humi = SHT_Measure(_HUMI);   //_HUMI = 0x05      //calculate humidity %RH from value      //formul RHlinear = C1 + C2*SOrh + C3*SOrh*SOrh  %RH      RH_linear = C1 + (C2*humi) + (C3*humi*humi);      //formula RHtrue = (Tc-25)*(t1+t2*SOrh)+RHlinear      RH_true = (tempt-25)*(t1+(t2*humi))+ RH_linear;      if(RH_true > 100.0) RH_true = 100.0;      if(RH_true < 0.1) RH_true = 0.1;      floatToStr(RH_true,txt1);  //convert to string      strncpy(txt,txt1,5);       //txt1'den ilk 5 karakteri txt'ye aktar      Lcd_Out(2,1,"N:");      //Ltrim(txt);   // sağdaki boşlukları sil      Lcd_Out(2,3,txt);      delay_ms(100);    }}//****************************************************void Ekran(int ayar_num){  switch (ayar_num) {    case 0: Lcd_Out(1,1,"ALT SCKLIK=");              inttostr(alt1,txt);            inttostr(alt2,txt1);            Ltrim(txt);         //Sol boşlukları siler            Ltrim(txt1);            Lcd_Out(1,12,txt);            Lcd_Out_Cp(".");            Lcd_Out_Cp(txt1);            break;    case 1: Lcd_Out(1,1,"UST SCKLIK=");            inttostr(ust1,txt);            inttostr(ust2,txt1);            Ltrim(txt);         //Sol boşlukları siler            Ltrim(txt1);            Lcd_Out(1,12,txt);            Lcd_Out_Cp(".");            Lcd_Out_Cp(txt1);            break;    case 2: Lcd_Out(1,1,"NEM SINIRI=");            inttostr(nem1,txt);            inttostr(nem2,txt1);            Ltrim(txt);         //Sol boşlukları siler            Ltrim(txt1);            Lcd_Out(1,12,txt);            Lcd_Out_Cp(".");            Lcd_Out_Cp(txt1);            break;    case 3: Lcd_Out(1,1,"DONUS SAAT=");  break;    default: Lcd_Out(1,1,"HATA");    }    gnc=0;}//****************************************************Ayarlama(){if(Ayar){ // Ayar(mode)--> PORTC.RC0    ayardurum=1;    do{       delay_ms(200);    }while(Ayar);    //-----------Alt Sıcaklık Ayarlama---------------    Lcd_Cmd(_LCD_CLEAR);    delay_ms(300);    Ekran(0); // Ekranı hazırla    do{      if(Artir) {alt2=alt2+10; gnc=1; }      if(Azalt) {alt2=alt2-10; gnc=1; }      if(alt2>99) {alt1++; alt2=0; }      if(alt2<0)  {alt1--; alt2=90;}      if(gnc==1) Ekran(0);      delay_ms(200);    }while(!Ayar);    EEPROM_Write(0x01,alt1);  // Alt sıcaklık tam kısım kayıt    EEPROM_Write(0x02,alt2);  // Alt sıcaklık ondalıklı kısım kayıt    Lcd_Out(2,1,"   KAYDEDILDI");    delay_ms(500);    //-----------Üst Sıcaklık Ayarlama---------------    Lcd_Cmd(_LCD_CLEAR);    delay_ms(300);    Ekran(1);    do{      if(Artir) {ust2=ust2+10; gnc=1; }      if(Azalt) {ust2=ust2-10; gnc=1; }      if(ust2>99) {ust1++; ust2=0; }      if(ust2<0)  {ust1--; ust2=90;}      if(gnc==1) Ekran(1);      delay_ms(200);    }while(!Ayar);    EEPROM_Write(0x03,ust1);  // Üst sıcaklık tam kısım kayıt    EEPROM_Write(0x04,ust2);  // Üst sıcaklık ondalıklı kısım kayıt    Lcd_Out(2,1,"   KAYDEDILDI");    delay_ms(500);    Lcd_Cmd(_LCD_CLEAR);    delay_ms(300);    //-----------Nem Oranı Ayarlama---------------    //Lcd_Out(1,1,"NEM SINIRI=");    Ekran(2);    do{      ayardurum=1;      inttostr(nem1,txt);      inttostr(nem2,txt1);      Ltrim(txt);      Ltrim(txt1);      Lcd_Out(1,12,txt);      Lcd_Out_Cp(".");      Lcd_Out_Cp(txt1);      if(Artir) nem2=nem2+10;      if(Azalt) nem2=nem2-10;      if(nem2>99) {nem1++; nem2=0; }      if(nem2<0)  {nem1--; nem2=90;}      delay_ms(200);    }while(!Ayar);    EEPROM_Write(0x05,nem1);  // Alt nem tam kısım kayıt    EEPROM_Write(0x06,nem2);  // Alt nem ondalıklı kısım kayıt    Lcd_Out(2,1,"   KAYDEDILDI");    delay_ms(500);    Lcd_Cmd(_LCD_CLEAR);    delay_ms(300);/*   //-----------Motor Dönüş Saati Ayarlama---------------    // Motorun kaç saatte dönmesi isteniyorsa ayarlanır    // Eğer sıfır ayarlanırsa motor dönmeyecektir    //Lcd_Out(1,1,"DONUS SURESI=");    Ekran(3);    do{      ayardurum=1;      inttostr(motor_suresi,txt);      Ltrim(txt);      Lcd_Out(1,14,txt);      Lcd_Out_Cp("sa");      if(Artir) motor_suresi=motor_suresi+1;      if(Azalt) motor_suresi=motor_suresi-1;      if(motor_suresi>9) motor_suresi=0;      if(motor_suresi<0) motor_suresi=9;      delay_ms(200);    }while(!Ayar);    EEPROM_Write(0x07,motor_suresi);  // Motor dönüş süresi kayıt    Lcd_Out(2,1,"   KAYDEDILDI");    delay_ms(500);   */    Lcd_Cmd(_LCD_CLEAR);    delay_ms(300);    ayardurum=0;}}//****************************************************void main(){  Fan=0;  Lamba=0;  Nem_Cihazi=0;  AA=0; BB=0; CC=0; DD=0;  gnc=0;  kurulum();  Lcd_Init();                        // Initialize LCD  Lcd_Out(1,1,"OTOMATIK KULUCKA");  Lcd_Out(2,1,"    MAKINESI    ");  delay_ms(1000);  Lcd_Cmd(_LCD_CLEAR);               // Clear display  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off    Ayarlama();  Lcd_Cmd(_LCD_CLEAR);     while(1){        //Deger_oku();        Vakit();             }}


bilsisco

en azından arkadaşlar mikcoc varsa derleyip isiste çalıştırabilir misiniz?
isiste çalıştırdığınızda ayar düğmesine basıp ayar yapılıyor, orda lcd de gösterme sorunu var bende. Sizde de oluyor mu merak ettim

Powered by EzPortal