|
发表于 2005-10-29 22:46:54
|
显示全部楼层
提供我的ACD_LDC_DISP应用例子。
//ICC-AVR application builder
// Target : M16
// Crystal: 8.0000Mhz
#include <iom16v.h>
#include <macros.h>
#include "1602BLCD.h"
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
uchar Lcd_data_buff_1[16]; //LCD 第一行在MEGA16 RAM 显示缓冲区
uchar Lcd_data_buff_2[16]; //LCD 第二行在MEGA16 RAM 显示缓冲区
/*-----------------------------------------------------------------------
英文字符串存放在MEGA16 RAM 显示缓冲区Lcd_data_buff_(1~2)[16]函数
-----------------------------------------------------------------------*/
void LCD_buff_write_string(uchar Line,uchar location,uchar *s)
{
if (Line == 1)
{
while (*s)
{
Lcd_data_buff_1[location]=(*s);
location++;
s++;
}
}
else if (Line == 2)
{
while (*s)
{
Lcd_data_buff_2[location]=(*s);
location ++;
s ++;
}
}
}
/*-----------------------------------------------------------------------
第一行在MEGA16 RAM 显示缓冲区存送到LCD第一行显示寄存器地址:0X80-0X8F
-----------------------------------------------------------------------*/
void Lcd_data_buff_send_LCD_1(void)
{
uchar Counter,x;
x=0;
LCD_set_xy(0,0);
for(Counter=0;Counter<16;Counter++)
{
LCD_write_char(1,Lcd_data_buff_1[x]);
x++;
}
}
/*-----------------------------------------------------------------------
第二行在MEGA16 RAM 显示缓冲区存送到LCD第二行显示寄存器地址:0XC0-0XCF
-----------------------------------------------------------------------*/
void Lcd_data_buff_send_LCD_2(void)
{
uchar Counter,x;
x=0;
LCD_set_xy(0,1);
for(Counter=0;Counter<16;Counter++)
{
LCD_write_char(1,Lcd_data_buff_2[x]);
x ++;
}
}
/***********************************************************
查询方式读取ADC 0~31通道
************************************************************/
uint read_adc(uchar vol_reference,uchar ADC_chunnel)
{
ADMUX=(vol_reference<<6)|(0<<ADLAR)|(ADC_chunnel&0x1F); //ADLAR_bit5=0 右对齐
/*
ADMUX (ADC Multiplexer Select Register)
bit7 bit6
REFS1 REFS0 参考电压选择
0 0 AREF,内部Vref关闭
0 1 AVCC,AREF引脚外加滤波电容
1 0 保留
1 1 2.56V的片内基准电压源,AREF引脚外加滤波电容
bit5 ADC结果左对齐选择 1=左对齐 0=右对齐
bit4~0 选择32通道
*/
ADCSRA=(1<<ADEN)|(0<<ADSC)|(0<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
/*
ADCSRA (ADC Control and Status Register A)
bit7 ADEN ADC使能=1
bit6 ADSC 启动ADC开始转换=1
bit5 ADATE 自己触发使能
bit4 ADIF ADC中断标志
bit3 ADIE ADC中断使能
bit2:0 ADC 预分频选择位 111=128时钟分频
*/
delay_nus(200);
ADCSRA|=(1<<ADSC); //启动ADC开始转换
while ((ADCSRA&0x10)!=0x10); //等待ADC转换结束
ADCSRA|=(1<<ADIF); //写1清除标志位
ADCSRA=0x00; //关闭ADC
return (ADC&0x03FF); //ADC=ADCH:ADCL
}
/***************************
将BCD码转换为ASCII码函数
****************************/
uchar bcd_to_ascii(uchar bcd)
{
bcd &= 0x0F;
if(bcd > 9)
bcd +=('0'+7); // 将A~F转换为ASCII
else
bcd += '0'; // 将0~9转换为ASCII 0~9
return(bcd);
}
//**************************************************************************
//**************************************************************************
void LCD_DISP_ADC(void)
{
uint Temp;
uchar d1000,d100,d10,d1;
uchar hex_100,hex_10,hex_1;
uchar vol_reference=3; //2.56V的片内基准电压源,AREF引脚外加滤波电容
uchar ADC_chunnel=30; //选择0~31 ADC通道
Temp=read_adc(vol_reference,ADC_chunnel); // 读取ADC 0~31通道
hex_100=(Temp>>8)&0x03; //转换十六进制数百位
hex_10=(Temp>>4)&0x0F; //转换十六进制数十位
hex_1=Temp & 0x0F; //转换十六进制数个位
hex_100=bcd_to_ascii(hex_100);
hex_10=bcd_to_ascii(hex_10);
hex_1=bcd_to_ascii(hex_1);
//Temp=Temp-2;
Temp=Temp*25; //2.56V基准 25*1024=25600只要前四位数2560就可作为十进制数
d1000=Temp/10000; Temp=Temp%10000; //转换十进制数万位
d100=Temp/1000; Temp=Temp%1000; //转换十进制数千位
d10=Temp/100; Temp=Temp%100; //转换十进制数百位
d1=Temp/10; //转换十进制数十位
if(ADC_chunnel>9)
{
Lcd_data_buff_2[3]=(ADC_chunnel/10)+'0'; //转换十进制数十位
Lcd_data_buff_2[4]=(ADC_chunnel%10)+'0'; //转换十进制数个位
}
else
{
Lcd_data_buff_2[4]=(ADC_chunnel&0x0F)+'0'; //转换十进制数个位
}
Lcd_data_buff_2[6]=(d1000+'0');
Lcd_data_buff_2[8]=d100+'0';
Lcd_data_buff_2[9]=d10+'0';
Lcd_data_buff_2[10]=d1+'0';
Lcd_data_buff_2[13]=hex_100;
Lcd_data_buff_2[14]=hex_10;
Lcd_data_buff_2[15]=hex_1;
Lcd_data_buff_send_LCD_2();
}
//**************************************************************************
//**************************************************************************
void main (void)
{
uint Temp;
//OSCCAL=0xB7; // 8M系统内部时钟校准
DDRC |= LCD_DATA | LCD_RS | LCD_EN;
LCD_EN_PORT &= ~LCD_EN; //EN=0
LCD_init();
LCD_buff_write_string(1,0," Voltage Meter "); //1=第一行,0=位置0~15,
LCD_buff_write_string(2,0," CH__= . V "); //2=第二行,0=位置0~15,
Lcd_data_buff_send_LCD_1();
// Lcd_data_buff_send_LCD_2();
for(;;)
{
LCD_DISP_ADC();
delay_nms(250);
}
} |
|