源代碼及注釋
#define GLOBAL_CLK 1 #include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "memtest.h"
#include "Mylib.h" #define LED1 (1 << (5 * 2))
#define LED2 (1 << (6 * 2))
#define LED3 (1 << (7 * 2))
#define LED4 (1 << (8 * 2))
#define LEDS (LED1 | LED2 | LED3 | LED4) #define LED1_ON ~(1<<5)
#define LED2_ON ~(1<<6)
#define LED3_ON ~(1<<7)
#define LED4_ON ~(1<<8) #define LED1_OFF (1<<5)
#define LED2_OFF (1<<6)
#define LED3_OFF (1<<7)
#define LED4_OFF (1<<8) void init()
{
cal_cpu_bus_clk();//在MyLib.h中有定義
Uart_Init(0,115200);//PCLK、波特率為115200
Uart_Select(0);//選擇串口0
My_Logo();//在MyLib.h中有定義
} int ADC_Test()
{
int temp;
rADCCON = (1<<14)|(0x31<<6)|(0<<3);//預分頻器使能、預分頻值為49、通道0
rADCCON |=0x1;// A/D開始轉換,開始之后,此位被清除
while(rADCCON&0x1);//檢測有沒有開始
while(!(rADCCON&0x8000));//檢測轉換是否結束
temp = rADCDAT0&0x3ff;//返回轉換值,正常A/D轉換的數值只能通過ADCDAT0寄存器的[9:0]位讀取
return temp;
} void Main(void)
{
int temp,Value;
U8 key;
init();
MMU_Init();//內存初始化
rGPBCON = LEDS; //初始化LED相應引腳為輸出
rGPBDAT = rGPBDAT|(LED1_OFF)|(LED2_OFF)|(LED3_OFF)|(LED4_OFF); // LED 滅
rGPBDAT &= ~(0x1);
Uart_Printf("\n\n\nPress 'Enter' to refresh the Screen\n");//終端提示
while(1)
{
temp = ADC_Test();//調用A/D轉換函數
Value = ((3300/1024)*temp)*1000;//轉換成電壓值,單位mV,Value值比實際值放大了1000倍
key=Uart_Getch();//等待從鍵盤接收按鍵
Beep(2000,100);//蜂鳴器發聲函數
// 刷新A/D轉換,原因很簡單,我們往往在等待按鍵時調整電位器
temp = ADC_Test();
Value = ((3300/1024)*temp)*1000;
rGPBCON = LEDS; //還原GPB的配置,原因調用了蜂鳴器發聲函數,改變了GPB原先的配置
if(key==ENTER_KEY)//判斷是否按了Enter鍵
{
key=0;//按鍵清零
rGPBDAT = (~temp)&(~0x1);//輸出到LED顯示,務必把GPB0清零,否則你將會有麻煩 ^|^
Uart_Printf("\n\n\n%d %% 1000000 %(V%)\n",Value);//把電壓值輸出到終端顯示
}
else
{
key=0;
Uart_Printf("\n\n\nPress the 'Enter' key!\n");//按鍵非Enter鍵,提示按鍵
}
}
}
程序結果
聲明:本人將不會再發表其它相關ARM裸機源代碼,包括上傳共享資料,望見諒!
|