📄 m21_adc.txt
字号:
// File : m21_adc.c
#include <gc89c520_tq32i.h>
#define ADC_DIVIDE_OSC_2_DEFALUT 0
#define ADC_DIVIDE_OSC_2 1
#define ADC_DIVIDE_OSC_4 2
#define ADC_DIVIDE_OSC_8 3
#define ADC_DIVIDE_OSC_16 4
#define ADC_DIVIDE_OSC_32 5
#define ADC_DIVIDE_OSC_64 6
#define ADC_DIVIDE_OSC_128 7
#define MAX_ADC 28
unsigned char channel;
unsigned char adc_intr;
unsigned int adc_result;
unsigned char value;
unsigned char i;
void pwm_clock_selection(unsigned char divide)
{
PWMCON &= 0x1f;
PWMCON +=(divide << 4);
}
void m21_adc_clock_divide(unsigned char divide)
{
if(divide == ADC_DIVIDE_OSC_2_DEFALUT)
{
ADCON &= 0xfb;
return;
}
ADCON |= 0x04;
//pwm_counter_start_enable(); // ??
pwm_clock_selection(divide);
}
void m21_adc_channel_selection(unsigned char adc_num)
{
// adc_num : [0 ~ 11] ADC0 ~ ADC11
// adc_num : [12 ~ 27] ADCH0 ~ ADCH15
if(adc_num <= 3)
{
ADCSEL &= ~(1 << (adc_num + 4));
}
else if((4<=adc_num)&&(adc_num<=11))
{
ADCSELH &= ~(1 << (adc_num - 4));
}
else if((12<=adc_num)&&(adc_num<=19))
{
ADCHL &= ~(1 << (adc_num - 12));
}
else if((20<=adc_num)&&(adc_num<=27))
{
ADCHH &= ~(1 << (adc_num - 20));
}
}
void adc_enable()
{
ADCON |= 0x80;
}
void adc_disable()
{
value = ADCON;
value &= 0x7f;
ADCON = value;
}
void adc_request()
{
value = ADCON;
value |= 0x40;
ADCON = value;
}
void adc_clear_interrupt_flag()
{
value = ADCON;
value &= 0xef;
ADCON = value;
}
void m21_adc_mux_selection(unsigned char channel)
{
if(channel <= 11)
{
ADCHSEL &= 0x7f;
ADCSEL &= 0xf0;
ADCSEL += channel;
}
else
{
ADCHSEL |= 0x80;
ADCHSEL &= 0xf0;
ADCHSEL += channel - 12;
}
}
unsigned int adc_10bit_result()
{
unsigned int temp,temp1;
temp = ADCON & 0x03;
temp1 = ADCR << 2;
temp1 += temp;
return temp1;
}
void adc_interrupt_enable()
{
EADC = 1;
}
void adc_run(unsigned char channel)
{
m21_adc_mux_selection(channel);
adc_request();
while (!adc_intr);
adc_intr = 0;
adc_result = adc_10bit_result();
}
void enable_all_interrupt()
{
EA = 1;
}
void adc_port_pullup_off()
{
P0SEL = 0xff;
P1SEL = 0xff;
P2SEL = 0xff;
P3SEL = 0xff;
}
void adc_init()
{
adc_intr = 0;
adc_port_pullup_off();
enable_all_interrupt();
adc_interrupt_enable();
adc_enable();
m21_adc_clock_divide(ADC_DIVIDE_OSC_2);
ALTSEL |= 0x40; // resetb to IO.
for(i=3;i<MAX_ADC;i++) // MAX_ADC
{
m21_adc_channel_selection(i);
}
for(channel=0;channel<MAX_ADC;channel++) //MAX_ADC
{
adc_run(channel);
}
}
void adc_int(void) interrupt ADC_VECTOR
{
adc_clear_interrupt_flag();
adc_intr = 1;
}
void main()
{
adc_init();
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -