Kod: Markera allt
#include "SSD1306driver_lite.h" // include SSD1306 OLED display driver source code
#define BTN LATC.F5
#define OUT LATC.F4
#define EN4 LATC.F7
#define EN3 LATB.F4
#define EN2 LATC.F1
#define EN1 LATA.F2
#define SSD1306_SOFT_I2C
#define SSD1306_128_64
char PrintOut[5];
float Temp, TempOut, Vbat, Adc1, Adc2, Adc3, Adc4;
// Software I2C connections
sbit Soft_I2C_Scl at RB7_bit;
sbit Soft_I2C_Sda at RB5_bit;
sbit Soft_I2C_Scl_Direction at TRISB7_bit;
sbit Soft_I2C_Sda_Direction at TRISB5_bit;
// End Software I2C connections
void NTC_Lookup(){
if(Temp<365)
TempOut=10;
if((365<=Temp)&&(Temp<414))
TempOut=15;
if((414<=Temp)&&(Temp<465))
TempOut=20;
if((465<=Temp)&&(Temp<511))
TempOut=25;
if((511<=Temp)&&(Temp<559))
TempOut=30;
if((559<=Temp)&&(Temp<604))
TempOut=35;
if((604<=Temp)&&(Temp<646))
TempOut=40;
if((646<=Temp)&&(Temp<686))
TempOut=45;
if((686<=Temp)&&(Temp<722))
TempOut=50;
if((722<=Temp)&&(Temp<755))
TempOut=55;
if((755<=Temp)&&(Temp<785))
TempOut=60;
if((785<=Temp)&&(Temp<812))
TempOut=65;
if((812<=Temp)&&(Temp<836))
TempOut=70;
if((836<=Temp)&&(Temp<858))
TempOut=75;
if((858<=Temp)&&(Temp<875))
TempOut=80;
if((875<=Temp)&&(Temp<893))
TempOut=85;
if((893<=Temp)&&(Temp<908))
TempOut=90;
if((908<=Temp)&&(Temp<922))
TempOut=95;
if((922<=Temp)&&(Temp<934))
TempOut=100;
if((934<=Temp)&&(Temp<944))
TempOut=105;
if((944<=Temp)&&(Temp<953))
TempOut=110;
if((953<=Temp)&&(Temp<961))
TempOut=115;
if((961<=Temp)&&(Temp<968))
TempOut=120;
if((968<=Temp)&&(Temp<974))
TempOut=125;
}
void Adc_Read_All(){
Temp=ADC_Read(4); //ANA4
Delay_ms(10);
NTC_Lookup();
Vbat=ADC_Read(5); //ANA5
Delay_ms(10);
Vbat=(Vbat*88)/10000;
Adc1=ADC_Read(16); //CH1
if(Adc1<20) //filter
Adc1=0;
Delay_ms(10);
Adc1=(Adc1*60)/10000;
Adc2=ADC_Read(18); //CH2
if(Adc2<20)
Adc2=0;
Delay_ms(10);
Adc2=(Adc2*49)/10000;
Adc3=ADC_Read(14); //CH3
if(Adc3<20)
Adc3=0;
Delay_ms(10);
Adc3=(Adc3*39)/10000;
Adc4=ADC_Read(22); //CH4
if(Adc4<20)
Adc4=0;
Delay_ms(10);
Adc4=(Adc4*56)/10000;
}
void Display_Out(){
SSD1306_Color = 1;
SSD1306_TextSize(1);
sprintf(PrintOut, "%.2f", Vbat);
SSD1306_GotoXY(1, 8);
SSD1306_Print(PrintOut);
sprintf(PrintOut, "%.0f", TempOut);
SSD1306_GotoXY(1, 16);
SSD1306_Print(PrintOut);
sprintf(&PrintOut, "%.3f", Adc1);
SSD1306_GotoXY(1, 24);
PrintOut[4]=0;
SSD1306_Print(PrintOut);
sprintf(PrintOut, "%.3f", Adc2);
SSD1306_GotoXY(1, 32);
PrintOut[4]=0;
SSD1306_Print(PrintOut);
sprintf(PrintOut, "%.3f", Adc3);
SSD1306_GotoXY(1, 40);
PrintOut[4]=0;
SSD1306_Print(PrintOut);
sprintf(PrintOut, "%.3f", Adc4);
SSD1306_GotoXY(1, 48);
PrintOut[4]=0;
SSD1306_Print(PrintOut);
SSD1306_Display();
delay_ms(2000);
SSD1306_ClearDisplay(); // clear the buffer
}
Init_main(){
OSCCON1=0B00000001;
OSCFRQ=0b00000110; // set internal oscillator to 16MHz
OSCTUNE=0b00000000;
ANSELA=0b00110000; // configure all PORTS
ANSELB=0b01000000;
ANSELC=0b01000101;
TRISA=0b00110000;
TRISB=0b01000000;
TRISC=0b01100101;
delay_ms(1000); // wait a second
Soft_I2C_Init(); // initialize I2C communication
SSD1306_Begin(SSD1306_SWITCHCAPVCC, SSD1306_I2C_ADDRESS);
SSD1306_Display();
delay_ms(2000);
SSD1306_ClearDisplay(); // clear the buffer
ADC_Init();
EN1=1;
EN2=1;
EN3=1;
EN4=1;
}
// main function
void main(){
Init_main();
while(1){
ADC_Read_All();
Delay_ms(10);
Display_Out();
}
}