You declared ADCvh as an unsigned char (8 bit value).
The last 3 lines of readADC() you shift that 8 bit value by 8:
ADCvh = ADCvh>>8;
ADCv = ADCvl + ADCvh;
return ADCv;
Shifting an 8 bit value right by 8 is an undefined operation.
A C compiler is allowed to do anything it wants with that.
The most likely implementations are that it either results in 0 or in no shift being performed at all.
Perhaps what you meant was:
ADCv = (((unsigned int)(ADCvh & 0x03)) << 8) + ADCvl;
return ADCv;