#include <string.h>
#include "lcd.h"
#include "adc.h"
volatile unsigned char int_flag = 0;
unsigned short reverse_num(unsigned short num){
unsigned short res = 0;
while(num){
res = (res * 10) + (num % 10);
num = num / 10;
}
return res;
}
void my_strrev(unsigned char* str){
//reverse string
int start = 0, end = strlen(str) - 1;
unsigned char temp;
while(start < end)
{
temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
end--;
}
}
void my_itoa(unsigned short res, unsigned char* str){
if (res == 0)
{
str[0] = '0';
str[1] ='\0';
return;
}
int i = 0;
//reverse num
//unsigned short rev_num = reverse_num(res);
//Serial.println(rev_num);
while(res){
str[i++] = (res % 10) + '0';
res /= 10;
}
str[i] = '\0';
my_strrev(str);
}
unsigned short fetch_fractional_digits(float fractional_part){
unsigned short res = 0, digit, nonZeroDigit = 0;
for(int i = 0; i < 3; i++)
{
fractional_part *= 10;
digit = (unsigned short)fractional_part;
res = (res * 10) + digit;
fractional_part = fractional_part - digit;
}
//Serial.println(res);
return res;
}
void init_port() {
// portk and f as output port
volatile unsigned char *ddr_portf = 0x30, *ddr_portk = 0x107;
*ddr_portf = 0xFF;
*ddr_portk |= 0x03;
}
void setup() {
init_port();
init_lcd();
adc_init();
start_adc_conversion();
Serial.begin(9600);
}
void loop() {
if(int_flag){
volatile unsigned short *ADC_DATA_REG = 0x78;
volatile unsigned short res = *ADC_DATA_REG;
float result = res * (5.0/1023), fraction_part = 0;
unsigned char str_res[5] = {0};
int nonZerodigitIndex = -1;
//print integer part
my_itoa((unsigned short)result, str_res);
set_cursor(LINE1(0));
write_string(str_res);
fraction_part = result - (unsigned short)result;
Serial.println(result, 4);
res = fetch_fractional_digits(fraction_part);
//the below is done to accomodate leading 0s in fractional part
sprintf(str_res, "%03hu", res);
write_string(".");
write_string(str_res);
delay(180);
outdata(CLEAR_DISPLAY, INST_MODE);
delayMicroseconds(100);
int_flag = 0;
//start conversion again
start_adc_conversion();
}
}
ISR(ADC_vect){
int_flag = 1;
}