ตัวอย่างการอ่านค่าความต้านทานปรับค่าได้  
     
  - เนื่องจาก PIC16F628 ไม่มี AtoD เหมือน PIC รุ่นใหญ่ แต่เราสามารถ ใช้หลักการ ในการ charge, discharge ของตัวเก็บประจุ (C) และวัดแรงดันที่ตกคร่อม C
เมื่อให้ C คายประจุจนหมด และ Charge C ผ่าน ความต้านทาน จนแรงดันที่ตกคร่อม C มีระดับแรงดัน มีค่าเป็น 1
 
     
     
  หลักการทำงาน  
 
 
  รูปที่ 1 หลักการทำงาน ของวิธีการอ่านค่าจาก ความต้านทานปรับค่าได้  
     
  การทดลองการอ่านค่า ความต้านทานปรับค่าได้ โดยแสดงผลออก  
  -R3 200 โอมห์ป้องกันไม่ให้พอร์ตไปต่อกับ แรงดันไฟเลี้ยงโดยตรง  
  -รูป A เมื่อให้พอร์ตเป็นเอาต์พุต โดยให้เป็นโลจิก 0 ลัดแรงดันที่ค่อม Cx ลงกราวน์ Cx
  -หน่วงเวลา 25 us เพื่อรอให้ Cx คายประจุจนหมด  
  -รูป B เปลียนสถานะพอร์ตเป็นอินพุต ทำให้พอร์ตมีค่าความต้านทานสูง  
  - ให้ตัวแปรเริ่มนับ  
  -รูป C กระแสจะชาร์จ ทำให้แรงดันตกคร่อม Cx ค่อยๆ สูงขึ้นจนเป็นโลจิก 1  
  - แสดงผลที่นับได้ ค่าที่นับได้ขึ้นอยู่กับ ค่าความต้านทานของ VR1  
     
   
  รูปที่ 2 การอ่านค่าความต้านทานปรับค่าได้ โดยให้แสดงเวลาผ่านทาง RS232 (soft ware TX=RA0,RX=RA1)
 
     
  - สำหรับทางโปรแกรม เพื่อความรวดเร็ว จะให้เอาต์พุตที่พอร์ตมีโลิก 0 โดยไม่ต้องกลับมาเป็นโลกจิก 1 เพราะเมื่อเปลี่ยนสถานะเป็นเอาต์พุต พอร์ตก็จะปรากฏ เป็นโลจิก 0 ทันที และเมื่อเปลี่ยนสถานะเป็นอินพุต พอร์ตก็จะเปลี่ยน เป็นสถานะ ความต้านทานสูง (High Impedance)  
     
   ตัวอย่างโปรแกรม  
 
//VR1.C
//#include <16F628.h>
#include <16F648A.h>
#use delay(clock=4000000)
#define  TxD         PIN_A0   
#define  RxD         PIN_A1   
#use rs232(baud=9600, xmit=TxD,rcv=RxD) 
#fuses XT,PUT,BROWNOUT,MCLR,NOWDT,NOPROTECT,NOLVP

#byte	TRISA   = 0x85 
#bit    PINVR1 = TRISA.3

void ReadVR(void)
{
long Cn=0;

 PINVR1=0;                          //Set Port to Output
 output_bit(PIN_A3,0);              //Output bit = 0
 delay_us(25);                      //Delay for charge C
 PINVR1=1;                          //Set Port to Input
 while(input(PIN_A3)==0)            //Read Port
  Cn++;                             //Count if still 0
 
 printf("%lu\r\n",Cn);
}
void main(void) 
{
long Cn;

   set_tris_a(0B11111110);
   set_tris_b(0B01111110);

   printf("*** Test VR1 ***\r\n");

//Read Key
   while(1)
   {
    if(input(PIN_A2)==0)            //Key press
    {
      delay_ms(100);                //Delay and read again
      if(input(PIN_A2)==0)          //if Key still press
      {
       while(input(PIN_A2)==0);     //wait for release
        ReadVR();
      }
    }

   }
}
 
     
     
     
  ผลการทดลองวงจรในรูปที่ 2 การทำงานเมื่อ VR1=10K Cx=0.1 uf
โดยกดปุ่ม SW1 และสังเกตุผลจาก Hyperterminal ผ่าน RS232
 
 
*** Test VR1 ***
1
11
14
20
24
28
 
     
  การทดลองเปลี่ยนค่า VR1 , Cx และจำนวน counter ที่นับได้ เมื่อใช้ Crytal 4MHz  
 
  VR1= 10K      
 
Cx
min
max
 
 
0.1
1
29
 
 
0.22
1
65
 
 
0.33
2
94
 
 
0.47
2
131
 
         
  VR1= 50K      
 
Cx
min
max
 
 
0.1
1
137
 
 
0.22
1
319
 
 
0.33
2
442
 
 
0.47
2
615
 
         
  VR1= 100K      
 
Cx
min
max
 
 
0.1
1
273
 
 
0.22
1
639
 
 
0.33
2
822
 
 
0.47
2
1236
 
         
         
 
     
     
  แนวทางพัฒนาใช้กับ Keypad หลายๆปุ่มโดยใช้เพียง 1 อินพุต  
 
 
 
รุปที่ 3 การทดลอง การอ่านค่าจากปุ่ม 8 ปุ่มโดยใช้เพียง 1 อินพุต