David Buck
/
voltmeter
main.cpp
- Committer:
- Kaikestu
- Date:
- 2009-12-16
- Revision:
- 0:d322a5241da8
File content as of revision 0:d322a5241da8:
//main.cpp /**************************************************************** * Include files ****************************************************************/ #include "header.h" /**************************************************************** * data values ****************************************************************/ #define cal -200 // calibration value int A2D_in; /* input variable */ int V_in; /* input voltage */ int V_unit; /* voltage units value */ int V_unit_old; // previous unit value int V_in_dec; /* input voltage decimal value */ int V_dec; /* voltage decimal value */ int V_dec_old; // previous decimal value float x; /**************************************************************** * Main part of the program ****************************************************************/ int main() { ADC_init(); LCD_init(); LCD_displayV(); while(1){ /* infinite loop */ A2D_in=ADC_read(); V_in=A2D_in*33; /* calculate voltage from 8-bit ADC input 0xFF = 3.3V */ // all voltage values multiplied by 10 to allow integer manipulation //****************** calculate voltage unit = 0-5V ****************************** if(V_in >= 50*255) // if greater than 5V then unit to display = 5 { V_unit = 0x05; V_in_dec = 0; // if unit = 5 then decimal must be 0 (5.0V=max) } else if(V_in > 40*255) // else if greater than 4V then unit to display = 4 { V_unit = 0x04; V_in_dec = V_in-40*256; // calculate remainder for decimal processing } else if(V_in > 30*255) // else if greater than 3V then unit to display = 3 { V_unit = 0x03; V_in_dec = V_in-30*256; } else if(V_in > 20*255) // else if greater than 2V then unit to display = 2 { V_unit = 0x02; V_in_dec = V_in-20*256; } else if(V_in > 10*255) // else if greater than 1V then unit to display = 1 { V_unit = 0x01; V_in_dec = V_in-10*256; } else // else unit to display = 0 { V_unit = 0x00; V_in_dec = V_in; } // if unit has changed, then display the new unit on the screen if (V_unit!= V_unit_old){ // start of line 2 FIO2CLR0=0x02; /* set RS to 'instruction' */ FIO0PIN2=0xC6; /* set address to line 2 units position*/ toggle_enable(); FIO2SET0=0x02; /* set RS to 'data' */ FIO0PIN2=(0x30+V_unit); // display unit value on screen toggle_enable(); V_unit_old=V_unit; } //****************** calculate decimal value = .0 - .9 ****************************** if(V_in_dec <=260+cal) V_dec = 0x00; if(V_in_dec > 260+cal) // decimal value must be between 0 and 2550 (ie 255*10) V_dec = 0x01; if(V_in_dec > 510+cal) // calibration value allows an amount of simple tuning V_dec = 0x02; // any error should be linear, but maybe with an offset if(V_in_dec > 770+cal) // a complete look-up table would be better though! V_dec = 0x03; if(V_in_dec > 1120+cal) V_dec = 0x04; if(V_in_dec > 1280+cal) V_dec = 0x05; if(V_in_dec > 1530+cal) V_dec = 0x06; if(V_in_dec > 1780+cal) V_dec = 0x07; if(V_in_dec > 2040+cal) V_dec = 0x08; if(V_in_dec > 2300+cal) V_dec = 0x09; // if decimal value has changed then update display if (V_dec!= V_dec_old){ // start of line 2 */ FIO2CLR0=0x02; /* set RS to 'instruction' */ FIO0PIN2=0xC8; /* set address to line 2 */ toggle_enable(); FIO2SET0=0x02; /* set RS to 'data' */ FIO0PIN2=(0x30+V_dec); toggle_enable(); V_dec_old=V_dec; } } } /* end main() */