我用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);
}
工程包如下:
文章评论(0条评论)
登录后参与讨论