📄 ad_converter2.c
字号:
/*============================================================
File Name :AD Converter2.c
说明 :
1. 学习10位 分辨率的ADC
2. 将MIC & ADC选择开关调至ADC
3. 调节可变电阻,LCD显示相应的ADC值(0~9)
4. 将MIC & ADC选择开关调至MIC
5. 向MIC放声音的话,LCD显示相对应的值
=============================================================*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#define TLCD_CTRL (unsigned char *)0x7000
#define TLCD_DATA (unsigned char *)0x7001
#define ADC_VREF_TYPE 0x40
#define SET_AD6 ADMUX=6|ADC_VREF_TYPE
#define START_ADC 0xEF
volatile unsigned int adc_result=0;
unsigned char *lcd_data,*lcd_control;
void initialize_adc(void);
void delay(int d1,int d2);
void initialize_text_lcd(void);
void lcd_control_wait(void);
void lcd_data_wait(void);
void adc_display(unsigned int data);
SIGNAL(SIG_ADC)
{
adc_result=ADCL; // 保存低8位
adc_result|=ADCH<<8; // 保存高2位
}
int main(void)
{
MCUCR|=(1<<SRE); // SRE=1 可访问外部存储器
initialize_adc();
initialize_text_lcd();
sei(); // 使能全局中断
while(1)
adc_display(adc_result);
}
void initialize_adc(void)
{
ADMUX=SET_AD6; // ADC ch # 6
ADCSR=START_ADC; // ADLAR = 0 将变换结果向右侧调整
SFIOR=0x00;
}
void delay(int d1,int d2)
{
int i,j;
for(i=0;i<d1;i++){
for(j=0;i<d2;j++);
}
}
void initialize_text_lcd(void)
{
lcd_control=TLCD_CTRL; // 分配LCD-CTRL物理地址
lcd_data=TLCD_DATA; // 分配LCD-DATA物理地址
lcd_control_wait(); // 延时
*lcd_control=0x38; // 8位接口和输出模式
lcd_control_wait();
*lcd_control=0x02; // 将光标移至1行1列
lcd_control_wait();
*lcd_control=0x01; // 清除画面
lcd_control_wait();
*lcd_control=0x06; // 增大光标的地址
lcd_control_wait();
*lcd_control=0x0c; // 显示 On 光标 off
lcd_control_wait();
}
void lcd_control_wait(void)
{
delay(1000,100);
}
void lcd_data_wait(void)
{
delay(1000,10);
}
void adc_display(unsigned int data)
{
unsigned char tmp1=0,tmp2=0,tmp3=0,tmp4=0;
unsigned int remd;
lcd_control=TLCD_CTRL; // 分配LCD-CTRL物理地址
lcd_data=TLCD_DATA; // 分配LCD-DART物理地址
*lcd_control=0xC7; // 选择LCD的地址 0x80+ADD(实际地址=0x47)
lcd_control_wait();
tmp4=data/1000;
remd=data%1000;
tmp3=remd/100;
remd=remd%100;
tmp2=remd/10;
tmp1=remd%10;
if(!tmp4)
*lcd_data=' '; // 显示千位-没有显示
else
*lcd_data='0'+tmp4; // 显示千位
lcd_data_wait();
if(!tmp3&&!tmp4)
*lcd_data=' '; // 显示百位-没有显示
else
*lcd_data='0'+tmp3; // 显示百位
lcd_data_wait();
if(!tmp2&&!tmp3&&!tmp4)
*lcd_data=' '; // 显示十位-没有显示
else
*lcd_data='0'+tmp2; // 显示十位
lcd_data_wait();
*lcd_data='0'+tmp1; // 显示一位
lcd_data_wait();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -