LPC2124 AD转换
时间:2009-06-09 来源:creatory
//LPC2124启动文件Startup.s:
; 启动文件,初始化C程序的运行环境,然后进入C程序代码。
IMPORT |Image$$RO$$Limit|
IMPORT |Image$$RW$$Base|
IMPORT |Image$$ZI$$Base|
IMPORT |Image$$ZI$$Limit|
IMPORT main ; 声明C程序中的Main()函数 CODE32 ; 声明32位ARM指令
AREA init,CODE,READONLY ; 声明代码段Start
ENTRY ; 标识程序入口 Reset
LDR SP,=0x40003F00 ; 设置堆栈指针
; 初始化C程序的运行环境
LDR R0,=|Image$$RO$$Limit|
LDR R1,=|Image$$RW$$Base|
LDR R3,=|Image$$ZI$$Base|
CMP R0,R1
BEQ LOOP1
LOOP0
CMP R1,R3;如果RW区不为空,将加载域的RW数据COPY到运行域
LDRCC R2,[R0],#4
STRCC R2,[R1],#4
BCC LOOP0
LOOP1
LDR R1,=|Image$$ZI$$Limit|
MOV R2,#0
LOOP2
CMP R3,R1;如果ZI区不为空,将ZI区域初始化为0
STRCC R2,[R3],#4
BCC LOOP2
B main ;跳转到c语言入口 Jump to the entry point of C program
END //特殊寄存器定义文件lpc2124.h: #define ADCR (*((volatile unsigned long *) 0xE0034000)) #define ADDR (*((volatile unsigned long *) 0xE0034004)) //LM016L液晶显示模块文件lcd.h void ChkBusy()
{
IO0DIR=0x700;
while(1)
{
IO0CLR=rs;
IO0SET=rw;
IO0SET=en;
if(!(IO0PIN & busy))break;
IO0CLR=en;
}
IO0DIR=0x7ff;
}
void WC_Lcd(unsigned char dat)
{
ChkBusy();
IO0CLR=rs; //全部清零
IO0CLR=rw;
IO0CLR=0xff; //先清零
IO0SET=dat; //再送数
IO0SET=en;
IO0CLR=en;
} void WD_Lcd(char dat)
{
ChkBusy();
IO0SET=rs;
IO0CLR=rw;
IO0CLR=0xff; //先清零
IO0SET=dat; //再送数
IO0SET=en;
IO0CLR=en;
} void lcd_init(void)
{
WC_Lcd(0x01); //显示模式设置,开始要求每次检测忙信号
WC_Lcd(0x38); //关闭显示
WC_Lcd(0x0f); //显示清屏
WC_Lcd(0x06); // 显示光标移动设置
WC_Lcd(0x0C); // 显示开及光标设置
} void DispChar(unsigned char X, unsigned char Y, char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; //算出指令码
WC_Lcd(X); //这里不检测忙信号,发送地址码
WD_Lcd(DData);
} void DispString(unsigned char X, unsigned char Y, char *DData)
{
unsigned char StrLen; StrLen = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while(DData[StrLen]!='\0') //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DispChar(X, Y, DData[StrLen]); //显示单个字符
StrLen++;
X++;
}
}
} int strlen(char s[])
{
int i=0;
while(s[i]!='\0')
i++;
return i;
} //主程序文件main.c: void DelayNS(uint32 dly)
{
uint32 i;
for(; dly>0; dly--)
{
for(i=0; i<5000; i++);
}
} int main(void)
{
uint32 ADC_Data;
char str[16];
lcd_init();
IO0DIR=0x7ff; //设置为输出
IO0CLR=0x7ff;
PINSEL1 = 0x01400000; // 设置P0.27、P0.28连接到AIN0、AIN1
/* 进行ADC模块设置,其中x<<n表示第n位设置为x(若x超过一位,则向高位顺延) */
ADCR =1 | // SEL = 1 ,选择通道0
((Fpclk / 1000000 ) << 8) | // CLKDIV = Fpclk / 1000000 ,即转换时钟为1MHz
(0 << 16) | // BURST = 0 ,软件控制转换操作
(0 << 17) | // CLKS = 0 ,使用11clock转换
(1 << 21) | // PDN = 1 , 正常工作模式(非掉电转换模式)
(0 << 22) | // TEST1:0 = 00 ,正常工作模式(非测试模式)
(1 << 24) ; // EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换)
DelayNS(10);
ADC_Data = ADDR; // 读取ADC结果,并清除DONE标志位
while(1)
{
ADCR = (ADCR&0x00FFFF00)|0x01|(1 << 24); // 设置通道1,并进行第一次转换
while( (ADDR&0x80000000)==0 ); // 等待转换结束
ADCR = ADCR | (1 << 24); // 再次启运转换
while( (ADDR&0x80000000)==0 ); // 等待转换结束
ADC_Data = ADDR; // 读取ADC结果
ADC_Data = (ADC_Data>>6) & 0x3FF; // 提取AD转换值
ADC_Data = (ADC_Data * 3300)/1024; // 数值转换
sprintf(str, "VIN1=%4dmV", ADC_Data);
DispString(0,0,str);
DelayNS(1);
ADCR = (ADCR&0x00FFFF00)|0x02|(1 << 24); // 设置通道2,并进行第一次转换
while( (ADDR&0x80000000)==0 ); // 等待转换结束
ADCR = ADCR | (1 << 24); // 再次启运转换
while( (ADDR&0x80000000)==0 ); // 等待转换结束
ADC_Data = ADDR; // 读取ADC结果
ADC_Data = (ADC_Data>>6) & 0x3FF; // 提取AD转换值
ADC_Data = ADC_Data * 3300/1024; // 数值转换
sprintf(str, "VIN2=%4dmV", ADC_Data);
DispString(0,1,str);
DelayNS(1);
} }
IMPORT |Image$$RO$$Limit|
IMPORT |Image$$RW$$Base|
IMPORT |Image$$ZI$$Base|
IMPORT |Image$$ZI$$Limit|
IMPORT main ; 声明C程序中的Main()函数 CODE32 ; 声明32位ARM指令
AREA init,CODE,READONLY ; 声明代码段Start
ENTRY ; 标识程序入口 Reset
LDR SP,=0x40003F00 ; 设置堆栈指针
; 初始化C程序的运行环境
LDR R0,=|Image$$RO$$Limit|
LDR R1,=|Image$$RW$$Base|
LDR R3,=|Image$$ZI$$Base|
CMP R0,R1
BEQ LOOP1
LOOP0
CMP R1,R3;如果RW区不为空,将加载域的RW数据COPY到运行域
LDRCC R2,[R0],#4
STRCC R2,[R1],#4
BCC LOOP0
LOOP1
LDR R1,=|Image$$ZI$$Limit|
MOV R2,#0
LOOP2
CMP R3,R1;如果ZI区不为空,将ZI区域初始化为0
STRCC R2,[R3],#4
BCC LOOP2
B main ;跳转到c语言入口 Jump to the entry point of C program
END //特殊寄存器定义文件lpc2124.h: #define ADCR (*((volatile unsigned long *) 0xE0034000)) #define ADDR (*((volatile unsigned long *) 0xE0034004)) //LM016L液晶显示模块文件lcd.h void ChkBusy()
{
IO0DIR=0x700;
while(1)
{
IO0CLR=rs;
IO0SET=rw;
IO0SET=en;
if(!(IO0PIN & busy))break;
IO0CLR=en;
}
IO0DIR=0x7ff;
}
void WC_Lcd(unsigned char dat)
{
ChkBusy();
IO0CLR=rs; //全部清零
IO0CLR=rw;
IO0CLR=0xff; //先清零
IO0SET=dat; //再送数
IO0SET=en;
IO0CLR=en;
} void WD_Lcd(char dat)
{
ChkBusy();
IO0SET=rs;
IO0CLR=rw;
IO0CLR=0xff; //先清零
IO0SET=dat; //再送数
IO0SET=en;
IO0CLR=en;
} void lcd_init(void)
{
WC_Lcd(0x01); //显示模式设置,开始要求每次检测忙信号
WC_Lcd(0x38); //关闭显示
WC_Lcd(0x0f); //显示清屏
WC_Lcd(0x06); // 显示光标移动设置
WC_Lcd(0x0C); // 显示开及光标设置
} void DispChar(unsigned char X, unsigned char Y, char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; //算出指令码
WC_Lcd(X); //这里不检测忙信号,发送地址码
WD_Lcd(DData);
} void DispString(unsigned char X, unsigned char Y, char *DData)
{
unsigned char StrLen; StrLen = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while(DData[StrLen]!='\0') //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DispChar(X, Y, DData[StrLen]); //显示单个字符
StrLen++;
X++;
}
}
} int strlen(char s[])
{
int i=0;
while(s[i]!='\0')
i++;
return i;
} //主程序文件main.c: void DelayNS(uint32 dly)
{
uint32 i;
for(; dly>0; dly--)
{
for(i=0; i<5000; i++);
}
} int main(void)
{
uint32 ADC_Data;
char str[16];
lcd_init();
IO0DIR=0x7ff; //设置为输出
IO0CLR=0x7ff;
PINSEL1 = 0x01400000; // 设置P0.27、P0.28连接到AIN0、AIN1
/* 进行ADC模块设置,其中x<<n表示第n位设置为x(若x超过一位,则向高位顺延) */
ADCR =1 | // SEL = 1 ,选择通道0
((Fpclk / 1000000 ) << 8) | // CLKDIV = Fpclk / 1000000 ,即转换时钟为1MHz
(0 << 16) | // BURST = 0 ,软件控制转换操作
(0 << 17) | // CLKS = 0 ,使用11clock转换
(1 << 21) | // PDN = 1 , 正常工作模式(非掉电转换模式)
(0 << 22) | // TEST1:0 = 00 ,正常工作模式(非测试模式)
(1 << 24) ; // EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换)
DelayNS(10);
ADC_Data = ADDR; // 读取ADC结果,并清除DONE标志位
while(1)
{
ADCR = (ADCR&0x00FFFF00)|0x01|(1 << 24); // 设置通道1,并进行第一次转换
while( (ADDR&0x80000000)==0 ); // 等待转换结束
ADCR = ADCR | (1 << 24); // 再次启运转换
while( (ADDR&0x80000000)==0 ); // 等待转换结束
ADC_Data = ADDR; // 读取ADC结果
ADC_Data = (ADC_Data>>6) & 0x3FF; // 提取AD转换值
ADC_Data = (ADC_Data * 3300)/1024; // 数值转换
sprintf(str, "VIN1=%4dmV", ADC_Data);
DispString(0,0,str);
DelayNS(1);
ADCR = (ADCR&0x00FFFF00)|0x02|(1 << 24); // 设置通道2,并进行第一次转换
while( (ADDR&0x80000000)==0 ); // 等待转换结束
ADCR = ADCR | (1 << 24); // 再次启运转换
while( (ADDR&0x80000000)==0 ); // 等待转换结束
ADC_Data = ADDR; // 读取ADC结果
ADC_Data = (ADC_Data>>6) & 0x3FF; // 提取AD转换值
ADC_Data = ADC_Data * 3300/1024; // 数值转换
sprintf(str, "VIN2=%4dmV", ADC_Data);
DispString(0,1,str);
DelayNS(1);
} }
相关阅读 更多 +