📄 uncode._c
字号:
//ICC-AVR application builder : 2006-2-7 20:37:19
// Target : 2313
// Crystal: 8.0000Mhz
#include <io2313v.h>
#include <macros.h>
#include <stdio.h>
#define Uchar unsigned char
#define Uint unsigned int
#define PB PORTB
#define PD PORTD
#define nop() asm("nop")
#define _nop_() asm("nop")
#define INPUT (PIND&0x40)
#define TimerStart(); TCCR1B = 0x82;
//信号下降沿触发
#define WaitHigh(); while(!INPUT){nop();};
//只要高电平一出现就向下继续运行
#define WaitLow(); while(INPUT){nop();};
//只要高电平一出现就向下继续运行
#define RESET_TIME 2900
#define MID_TIME 1200
#define TOV1F TIFR&0x80
#define TOV1L TIFR|=0x80
Uint HowLong (void)
{Uint a=0;
TCCR1B = 0x00; //stop timer
TCNT1=0;
return(ICR1);
}
void WaitReset (void)
{
while(1)
{
WaitLow ();
WaitHigh ();
TimerStart();
WaitLow ();
if(HowLong()>RESET_TIME)break;
};
}
void watchdog_init(void)
{
WDR(); //this prevents a timout on enabling
WDTCR = 0x0A; //WATCHDOG ENABLED - dont forget to issue WDRs
}
void timer1_init(void)
{
TCCR1B = 0x00; //stop timer
TCNT1H = 0x00 /*INVALID SETTING*/; //set count value
TCNT1L = 0x00 /*INVALID SETTING*/;
OCR1H = 0x00; //set compare value
OCR1L = 0x00;
TCCR1A = 0x00;
}
void port_init(void)
{
PORTB = 0x00;
DDRB = 0xFF;
PORTD = 0x00;
DDRD = 0x3F;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer1_init();
MCUCR = 0x00;
GIMSK = 0x00;
TIMSK = 0x00;
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
main()
{
Uchar sw_counter=10;//数据在开关通道的位号码//10的作用:刚开机开关信号不稳定,这时的数据是未知的,等待一个复位信号后方可使用
Uchar sw_estate;//开关通道数据的位状态
Uchar error=0;//是否存在错误帧
//说明:如果是错误帧造成的break,那么接下来的开关数据也是未知的,必须等待一个复位信号
Uint temp;//定时器缓寸
Uchar sw_reset=0;
watchdog_init();//打开狗
WaitReset ();
WDR();//喂狗
while(1)//1
{
if(error)sw_counter=10;//错误处理,防止产生一连串错误开关信号输出
while(1)//2
{ //通道1
WaitHigh ();
TimerStart();
PD|=0x01;
WaitLow ();
PD&=(~0x01);
if(HowLong()>RESET_TIME){error=1;break;}
//通道2
WaitHigh ();
TimerStart();
PD|=0x02;
WaitLow ();
PD&=(~0x02);
if(HowLong()>RESET_TIME){error=1;break;}
//通道3
WaitHigh ();
TimerStart();
PD|=0x04;
WaitLow ();
PD&=(~0x04);
if(HowLong()>RESET_TIME){error=1;break;}
//通道4
WaitHigh ();
TimerStart();
PD|=0x08;
WaitLow ();
PD&=(~0x08);
if(HowLong()>RESET_TIME){error=1;break;}
//通道5
WaitHigh ();
TimerStart();
PD|=0x10;
WaitLow ();
PD&=(~0x10);
if(HowLong()>RESET_TIME){error=1;break;}
//通道6
WaitHigh ();
TimerStart();
PD|=0x10;
WaitLow ();
PD&=(~0x10);
if(HowLong()>RESET_TIME){error=1;break;}
//开关数据通道
WaitHigh ();
TimerStart();
WaitLow ();
temp=HowLong();
if(temp>RESET_TIME){error=1;break;}
if(temp>MID_TIME)sw_estate=1;else sw_estate=0;
//开关复位信号通道
WaitHigh ();
TimerStart();
WaitLow ();
temp=HowLong();
if(temp>RESET_TIME){error=1;break;}
if(temp>MID_TIME)sw_reset=1;else sw_reset=0;
sw_counter++;
WaitHigh ();
TimerStart();//利用复位时间长,输出开关信号
if(sw_counter<8)
if(sw_estate)PB|=(1<<sw_counter);else PB&=(~(1<<sw_counter));
if(sw_reset)
sw_counter=255;
WDR();
WaitLow ();
if(HowLong()>RESET_TIME)break;
}//while(1)2
}//while(1)1
}//main()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -