由于本人这次任务是示波器,所以ADC转换及画点少不了。
ADC先用查询,等差不多了再优化。
先ADC转换然后再把转换的值存到两个数组中,这样我可以显示完第一个马上显示第二个,这样做好像不太好。等以后调整。
void ADC_Test(void)
{
unsigned char i;
ADC_Init(AIN15);
over=0;
for(i=0;i<160;i++)
{
ADCCON |= 0X40; //¿ªÊ¼ADCת»»
while(!AdcFlag); //µÈ´ý ADCת»»Íê³É;
AdcFlag = 0;
ADCValue = (ADCVH<<4)+(ADCVL>>4);
displaymiddle[i]=ADCValue;
}
for(i=0;i<160;i++)
{
display[i] = (displaymiddle[i]*128)/4096;
}
for(i=0;i<160;i++)
{
ADCCON |= 0X40; //¿ªÊ¼ADCת»»
while(!AdcFlag); //µÈ´ý ADCת»»Íê³É;
AdcFlag = 0;
ADCValue = (ADCVH<<4)+(ADCVL>>4);
displaymiddle2[i]=ADCValue;
}
for(i=0;i<160;i++)
{
display2[i] = (displaymiddle2[i]*128)/4096;
}
over=1;
}
然后在主函数中把这些值转成能显示的范围内,我的屏是160*128,我先最大幅度显示:
void main(void)
{
unsigned char i;
GPIO_Init();
Lcd_Init();
LCD_Clear(BLUE); //ÇåÆÁ
while(1)
{
// for(i=0;i<2;i++)
// {
// //LEDS=(1<<i);
// P00=1;
// delay();
// P00=0;
// delay();
// }
//LCD_Clear(BLUE); //ÇåÆÁ
ADC_Test();
if(over)
{
for(i=0;i<160;i++)
LCD_DrawPoint(display[i]);
POINT_COLOR = BLUE;
for(i=0;i<160;i++)
LCD_DrawPoint(display[i],i);
POINT_COLOR = WHITE;
for(i=0;i<160;i++)
LCD_DrawPoint(display2[i],i);
POINT_COLOR = BLUE;
for(i=0;i<160;i++)
LCD_DrawPoint(display2[i],i);
POINT_COLOR = WHITE;
}
}
}
运行效果如下:
我直接把ADC输入插到3.3时在最上边显示一条线,下图为我什么也没插(不接地也不接VCC时的显示),可见还是有一点电压的。
|