📄 demo_10_3.c
字号:
/*****************************************************
File name : demo_10_3.c
Chip type : ATmega16L
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
flash unsigned char led_7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //共阳极数码管
flash unsigned char position[4]={0x80,0x40,0x20,0x10}; //位选
unsigned char dis_buff[4]={0,0,0,0},posit;
bit time_2ms_ok;
// ADC电压值送显示缓冲区函数
void adc_to_disbuffer(unsigned int adc)
{
unsigned char i;
for (i=0;i<=3;i++)
{
dis_buff[i]=adc%10;
adc /= 10;
}
}
// Timer 0 比较匹配中断服务
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
time_2ms_ok = 1;
}
// ADC 转换完成中断服务
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data,adc_v;
adc_data=ADCH; //读取ADC置换结果
adc_v=(unsigned long)adc_data*5000/256; //换算成电压值
adc_to_disbuffer(adc_v);
}
void display(void) // 4位LED数码管动态扫描函数
{
PORTC &= 0xf0;
PORTD = led_7[dis_buff[posit]];
if (posit==3) PORTD &=~0x80;
PORTC |= position[posit];
if (++posit >=4) posit = 0;
}
void main(void)
{
DDRC=0xFF;
PORTC=0xFF;
DDRD=0xFF; // LED显示控制I/O端口初始化
PORTD=0x00;
// T/C0 初始化
TCCR0=0x0B; // 内部时钟,64分频(4M/64=62.5KHz),CTC模式
TCNT0=0x00;
OCR0=0x7C; // OCR0 = 0x7C(124),(124+1)/62.5=2ms
TIMSK=0x02; // 允许T/C0比较中断
// ADC 初始化
ADMUX=0x67; // 参考电源AVcc、ADC7单端输入,左对齐
SFIOR&=0x1F;
SFIOR|=0x60; // 选择T/C0比较匹配中断为ADC触发源
ADCSRA=0xAD; // ADC允许、自动触发转换、ADC转换中断允许、ADCclk=125Kz
#asm("sei") // 开放全局中断
while (1)
{
if (time_2ms_ok)
{
display(); // LED扫描显示
time_2ms_ok = 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -