📄 main.c
字号:
#include <iom8v.h>
#include <macros.h>
#define F_CPU 8000000 //主频
#include "delay.h"
#define MAXCH 16 //总通道数
#define MAXSCALECH 6 //比例通道数
//数码管显示值
unsigned char SEG7[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//通道值
unsigned char PADV[MAXCH] = {-1};
unsigned char CADV[MAXCH] = {0};
unsigned char ScaleCHindex = 0;
//以下定义中断处理程序
#pragma interrupt_handler OnTimer0:iv_TIMER0_OVF
void OnTimer0(void)
{ unsigned char adv;
ADMUX = 0x20 + ScaleCHindex; //左对齐,只取高位
ADCSRA|=(1<<ADSC); //启动ADC
Delay_US(60); //第一次结果抛弃
ADCSRA|=(1<<ADSC); //启动ADC
Delay_US(60);
adv = ADCH;
if(adv == 0xFF) adv = 0xFE;
else if(ADCH == 0x00) adv = 0x01;
CADV[ScaleCHindex] = adv;
ScaleCHindex++;
if(ScaleCHindex >= MAXSCALECH) ScaleCHindex = 0;
//去抖
adv = PIND;
Delay_US(50);
if(adv != PIND) return;
CADV[MAXSCALECH] = (PIND & 0x10) ? 0xFF : 0x00;
CADV[MAXSCALECH+1] = (PIND & 0x20) ? 0xFF : 0x00;
CADV[MAXSCALECH+2] = (PIND & 0x40) ? 0xFF : 0x00;
CADV[MAXSCALECH+3] = (PIND & 0x80) ? 0xFF : 0x00;
//TCNT0 = 0xFF;
}
//初始化
void init_devices(void)
{
//内部RC校准
//OSCCAL = 0x7D;
unsigned int baud = 9600;
CLI();
//端口初始化
PORTB = 0xFF;
DDRB = 0xFF;
//比例通道
PORTC = 0x00;
DDRC = 0x00;
//开关通道
PORTD = 0xF0;
DDRD = 0x0F;
//定时器初始化
TCCR0 = 0x00; //禁止计时
TCNT0 = 0x0F; //定时器时长
TCCR0 = 0x05; //启动定时器 CLK/1024
//ADC初始化
ADCSR = 0x00; //禁止转换
ADMUX = 0x20; //多路复用选择寄存器 E0 内部参考源,左对齐(只需高八位),通道0
// REFS1 RESF0(参考源) ADLAR(左对齐) 保留 MUX3 MUX2 MUX1 MUX0
ACSR = 0x80; //模拟比较器控制与状态寄存器
ADCSR = 0x83; //10001011 83 禁止中断,使用查询方式
//ADEN(AD允许) ADSC(AD开始) ADFR(连续) ADIF(中断标志) ADIE(中断允许) ADPS(预分频,三位)
//UART初始化
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)(baud);
UCSRB = (1<<TXEN);
UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ8);
//控制寄存器
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x01; //充许Timer0中断
SEI();
}
main()
{
int i = 0,j = 0;
init_devices();
while(1)
{
for(j=0;j<MAXCH;j++)
if(PADV[j] != CADV[j])
{ i = j;
PADV[j] = CADV[j];
}
//显示低位
PORTD = 0x01;
PORTB = SEG7[CADV[i] & 0x0F];
Delay_MS(20);
//显示高位
PORTD = 0x02;
PORTB = SEG7[CADV[i] >> 4];
Delay_MS(20);
//通道值
PORTD = 0x08;
PORTB = SEG7[i];
Delay_MS(20);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -