📄 iar13-1.c
字号:
#include <iom16.h> //包含头文件
#define uchar unsigned char //变量类型的宏定义
#define uint unsigned int
uchar __flash SEG7[10]={0x3f,0x06,0x5b, //共阴极数码管0~9的字形码
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar __flash ACT[4]={0xfe,0xfd,0xfb,0xf7};//4位共阴极数码管的位选码
uint adc_val,dis_val; //定义全局变量
uchar i,cnt;
/************************************************/
void port_init(void) //端口初始化子函数
{ //端口初始化子函数开始
PORTA = 0x7F; // PA端口初始化输出01111111
DDRA = 0x7F; //将PA端口的低7位设为输出,最高位设为输入
PORTB = 0xFF; // PB端口初始化输出11111111
DDRB = 0xFF; //将PB端口设为输出
PORTC = 0xFF; // PC端口初始化输出11111111
DDRC = 0xFF; //将PC端口设为输出
PORTD = 0xFF; // PD端口初始化输出11111111
DDRD = 0xFF; //将PD端口设为输出
} //端口初始化子函数结束
/************************************************/
void adc_init(void) //模数转换初始化子函数
{ //模数转换初始化子函数开始
ADCSRA = 0xE3; //ADC工作在自由转换模式
ADMUX = 0xc7; //选择ADC输入通道为7
} //模数转换初始化子函数结束
//***************************
void timer0_init(void) //定时器0初始化子函数
{ //定时器0初始化子函数开始
TCNT0 = 0x83; //1mS的定时初值
TCCR0 = 0x03; //定时器0的计数预分频取64
TIMSK = 0x01; //使能T/C0中断
} //定时器0初始化子函数结束
/*********************************************/
void init_devices(void) //芯片的初始化子函数
{
port_init(); //调用端口初始化子函数
timer0_init(); //调用定时器0初始化子函数
adc_init(); //调用模数转换初始化子函数
SREG=0x80; //使能总中断
}
//***************************
#pragma vector=TIMER0_OVF_vect
__interrupt void timer0_ovf_isr(void)
{
TCNT0 = 0x83; //重装1mS的定时初值
cnt++; //变量cnt递增
if(++i>3)i=0; //变量i的计数范围0~3
switch(i) // switch语句,根据i的值分别点亮4位数码管
{
case 0:PORTA=SEG7[dis_val%10];PORTC=ACT[0];break;
case 1:PORTA=SEG7[(dis_val/10)%10];PORTC=ACT[1];break;
case 2:PORTA=SEG7[(dis_val/100)%10];PORTC=ACT[2];break;
case 3:PORTA=SEG7[dis_val/1000];PORTC=ACT[3];break;
default:break;
}
}
//=========================
uint ADC_Convert(void) //模数转换子函数
{uint temp1,temp2; //定义无符号整型局部变量
temp1=(uint)ADCL; //取得模数转换值
temp2=(uint)ADCH;
temp2=(temp2<<8)+temp1;
return(temp2); //返回取得的模数转换值
}
/**************************/
uint conv(uint i) //数据转换子函数,定义i为无符号整型变量
{
long x; //定义无符号长整型局部变量
uint y; //定义无符号整型局部变量
x=(5000*(long)i)/1023; //将变量i转换成需要显示的形式
y=(uint)x; //将无符号长整型变量x强制转换成无符号整型变量y
return y; //返回y的值
}
/***********************/
void delay(uint k) //延时子函数
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<140;j++);
}
}
/***********************/
void main(void) //定义主函数
{ //主函数开始
init_devices(); //调用芯片初始化子函数
while(1) //无限循环
{ //无限循环语句开始
if(cnt>100) //如果cnt大于100,进入if语句
{
adc_val=ADC_Convert();//调用模数转换子函数得到转换值
dis_val=conv(adc_val); //将adc_val转换成需要显示的形式
cnt=0; //cnt回零
}
delay(10); //延时10mS
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -