📄 testmega8.c
字号:
#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/signal.h>
#include<avr/delay.h>
#include"io_bit.h"
#define uchar unsigned char
uchar a[]={0x81,0xed,0x43,0x49,0x2d,0x19,0x11,0xcd,0x01,0x09,0xef}; //LED码"0,1,2,3,4,5,6,7,8,9,-"
uchar b[]={0x08,0x04,0x02,0x01}; //位选
uchar w=0,x=0,y=0,z=0,s=0;
uchar hh=0,hl=0,mh=0,ml=0;
uchar v,j=0xff,kg=0;
unsigned int ii=0x42a,iii=0;
unsigned int c=0;
unsigned int u;
uchar signal=0; //标志寄存器
void led(uchar h,uchar hh,uchar m,uchar mm) //数码管扫描程序模块
{ uchar i;
PORTD=a[h]; PORTC=b[3];
for(i=0;i<60;i++)
{}
PORTC=0X0;PORTD=0Xff; for(i=0;i<40;i++){}
PORTD=a[hh]; PORTC=b[2];
for(i=0;i<60;i++)
{}
PORTC=0X0;PORTD=0Xff; for(i=0;i<40;i++){}
if(c!=0)
{c=c-1;PORTD=0XFE; PORTC=b[2];
for(i=0;i<60;i++){}
PORTC=0X0;PORTD=0Xff; for(i=0;i<60;i++){} }
PORTD=a[m]; PORTC=b[1];
for(i=0;i<60;i++)
{}
PORTC=0X0; PORTD=0XFF;for(i=0;i<40;i++){}
PORTD=a[mm]; PORTC=b[0];
for(i=0;i<60;i++)
{}
PORTC=0X0;PORTD=0XFF; for(i=0;i<40;i++){}
}
void check1(void) // 检查时钟进位
{
if(z==10){z=0;y=y+1;}
if(y==6){y=0;x=x+1;}
if(x==10){x=0;w=w+1;}
if((w==2)&&(x==4)){w=0;x=0;}
if((w==hh)&&(x==hl)&&(y==mh)&&(z==ml)&&(s==0)&&((signal&0x01)==0x01)){kg=0xff;} //开闹钟
}
SIGNAL(SIG_OVERFLOW2) //中断服务程序,减1秒模块
{
j=~j;
TIFR|=_BV(TOV1); //清中断标志寄存器
c=0x01CF;
s=s+1;
if(s==60){s=0;z=z+1;check1();}
}
//初始化程序
void Init_DS18B20(void)
{ unsigned char x=0;
DQ=1; //DQ先置高
delay(8); //稍延时
DQ=0; //发送复位脉冲
delay(85); //延时(>480us)
DQ=1; //拉高数据线
delay(14); //等待(15~60us)
x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
delay(20);
} /
int main() //主函数
{
DDRD=0XFF; //定义d口输出
DDRC=0XFF;
DC4_0;
DB6_0;
DDRB=0X00; //定义b口输入
PORTB=_BV(PB0)|_BV(PB1)|_BV(PB2)|_BV(PB3);
TIMSK=0X00; //关溢出中断允许
ASSR=_BV(AS2); //选择32768时钟源
TCCR2=0x05; //128分频
while(ASSR&0X07) //等待
{}
SREG=0x80; //开全局中断
//TIFR|=_BV(TOV2); //请溢出中断标志
TIMSK=0x40; //允许TIMER2溢出中断
//sei(); //开中断
while(1)
{
v=PINB; //判断有无按键按下
v=v&0x0f;
switch(v)
{ case 0x0E:cli(); x=x+1;
check1(); //检查进位
if(w==2&&x==5){x=0;}
for(u=0;u<500;u++){led(w,x,y,z);} ;break;
case 0x0D:cli(); z=z+1;
check1(); //检查进位
for(u=0;u<500;u++){led(w,x,y,z);} ;break;
}
sei();
led(w,x,y,z);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -