由于本人这次任务是示波器,所以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时的显示),可见还是有一点电压的。
|