//軟體思路:選擇RAO做為類比輸入通道; // 連續轉換4次再求平均值做為轉換結果 // 最後結構只取低8位 // 結果送數位管的低3位顯示 #include<pic.h> //包含內部資源預定義 __CONFIG(0x1832); //晶片配置字,看門狗關,上電延時開,掉電檢測關,低壓編程關,加密,4M晶體HS振蕩 const char TABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0X82,0XF8,0X80,0X90}; //定義常數0-9的資料表格 void DELAY(); //delay函數申明 void init(); //I/O口初始化函數申明 void display(int x); //顯示函數申明 //------------------------------------------------ //主程式開始 void main() { int result=0x00; //定義轉換結果寄存器 while(1) //死迴圈 { int i; //定義迴圈次數控制寄存器 result=0x00; //轉換結果清0 for(i=5;i>0;i--) //求5次轉換結果的平均值 { init(); //調用初始化函數 ADGO=0X1; //開啟轉換過程 while(ADGO); //等待轉換完成 result=result+ADRESL; //累計轉換結果 } result=result/5; //求5次結果的平均值 display(result); //調用顯示函數 } } //----------------------------------------------- //初始化函數 void init() { PORTA=0XFF; PORTD=0XFF; //熄滅所有顯示 TRISA=0X1; //設定RA0為輸入,其他為輸出 TRISD=0X00; //設定D口全為輸出 ADCON1=0X8E; //轉換結果靠左對齊,RA0做類比輸入口,其它做普通I/O ADCON0=0X41; //系統時鐘Fosc/8,選擇RA0通道,允許ADC工作 DELAY(); //保證採樣延時 } //----------------------------------------------- //顯示函數 void display(int x) { int bai,shi,ge,temp; //定義4個臨時變數 temp=x; //暫存AD轉換的結果 bai=temp/0x64; //求顯示的百位 shi=(temp%0x64)/0xa; //求顯示的十位 ge=(temp%0x64)%0xa; //求顯示的個位 PORTD=TABLE[bai]; //查表得百位顯示的代碼 PORTA=0x37; //RA3輸出低電平,點亮百位顯示 DELAY(); //延時一定時間,保證顯示亮度 PORTD=TABLE[shi]; //查表得十位顯示的代碼 PORTA=0x2F; //RA4輸出低電平,點亮十位顯示 DELAY(); //延時一定時間,保證亮度 PORTD=TABLE[ge]; //求個位顯示的代碼 PORTA=0x1F; //RA5輸出低電平,點亮個位顯示 DELAY(); //延時一定時間,保證亮度 } //---------------------------------------------- //延時程式 void DELAY() //延時程式 { int i; //定義整形變數 for(i=0x100;i--;); //延時 }