原创 AVR(Mega8)的study:8、ADC&KEY

2008-3-11 22:20 2730 4 4 分类: MCU/ 嵌入式

我用ADC通道6做了一个7键的按键程序,由于手里头正好有个电视的按键板,于是就废物利用了一下,电视按键的电路原理图见下图:



程序如下:


/********************************************************


ADC.H


****************************************************/


#ifndef _adc_
#define _adc_



void ADC_init(void);
void ADC_start(void);



#endif


/*************************************************


ADC.C


**************************************************/


#include <iom8v.h>
#include "adc.h"


 



void ADC_init(void)
{
SREG=0X80;//全局中断开。
ADCSRA=0;
ADMUX=0X46;//选用外部VCC,右对齐,通道6;
ADCSRA=(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
}


void ADC_start(void)
{
ADCSRA|=(1<<ADSC);
}


/******************************************************


MAIN.C


*****************************************************/


#include <iom8v.h>
#include "mytype.h"
#include "adc.h"


uint16 adc_data;
#pragma interrupt_handler Interrp_adc:15


uint8 table[16]={"0123456789abcdef"};



void DelayXms(unsigned int x)//延迟xms
{
unsigned int m;
 while(x--)
  {
   m="1275";
   while(m--);
  }
}


void Interrp_adc(void)//ADC中断函数。
{
adc_data=ADC&0X3FF;//取ADC转换结果。
if(adc_data<0x36e)//判断按键,发送结果到串口。
{
if(adc_data<0x50)
Prints("Power ",0);
else if((adc_data>0x60)&&(adc_data<0xe0))
Prints("Source ",0);
else if((adc_data>0xf0)&&(adc_data<0x170))
Prints("Menu ",0);
else if((adc_data>0x170)&&(adc_data<0x1f0))
Prints("Vol+ ",0);
else if((adc_data>0x200)&&(adc_data<0x270))
Prints("Vol- ",0);
else if((adc_data>0x280)&&(adc_data<0x2f0))
Prints("Ch+ ",0);
else if(adc_data>0x300)
Prints("Ch- ",0);
Send_abyte('0');//发送按键ADC转换值到串口。
Send_abyte('x');
Send_abyte(table[adc_data/256]);
Send_abyte(table[adc_data%256/16]);
Send_abyte(table[adc_data%16]);
Prints(" ",1);
}
DelayXms(300);
ADC_start();//开启转换。
}



void main(void)
{
Uart_init();//串口初始化。
ADC_init();//ADC转换初始化。
ADC_start();//ADC开始转换。
while(1);
}


工程包如下:


点击下载


 


 


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条