📄 mainnew._c
字号:
/***************************************/
/* 使用内部震荡,设置4mhz */
/****************************************/
//2007.12---xieming
// 1、使用ICCAVR的终端调试窗口(Terminal),进行通信调试。
// 2、对ICCAVR的终端调试窗口进行设置,设置串口为com1或com2,
// 通信波特率为19200(Tools->Environment Options...)。
// 3、将PC屏幕光标定位于调试窗口中
#include "iom8v.h"
#include "macros.h"
#define osccal 0x7d
//内部RC校正常数
#define set_bit(x,y) (x|=(1<<y))
#define clr_bit(x,y) (x&=~(1<<y))
#define Se 2
#define TIME 20
//PORT B
#define OUT1 5
#define OUT2 4
#define OUT3 3
#define OUT4 2
#define OUT5 1
#define OUT7 0
//PORT D
#define OUT6 7
unsigned char rcv[5]={0,0,0,0,0};
unsigned char rcnt=0,timecnt=0;
unsigned char int1cnt;
unsigned int int1time;
unsigned char id;
unsigned char srun=0,upodwn=0;
void uart_initial()
{UCSRA=0x00; //*1
UCSRB=0x00;
UCSRC=0x86; //no parity,8 data,1 stop
//UBRRL=12; //baud=19200*1 at4 Mhz
UBRRL=25; //baud=19200*1 at 8 Mhz
UBRRH=0x00;
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);////允许发送和接收,打开接受中断
}
void int_initial()
{
MCUCR=0X0F;//INT0 INT1 都设置为上升沿触发模式
//MCUCR=0X00;//INT0 INT1 都设置为低点平触发模式
//MCUCR=0X05;//INT0 INT1 都设置为任意沿触发模式
GICR=(1<<INT1);//外部中断1 使能
}
void delay(int dt) //delay=(0.95dt+1.76)us
{while(dt)
{dt--;
asm("nop");
asm("nop");
asm("nop");
}
}
/* 字符输出函数 */
void putchar(unsigned char c)
{ UCSRB&=~(1<<RXEN);//DISABLE RECIEVE
set_bit(PORTD,Se);
delay(2000);
while(!(UCSRA&(1<<UDRE)));
UDR=c;
delay(2000);
clr_bit(PORTD,Se);
UCSRB|=(1<<RXEN);//ENABLE RECIEVE
}
void timer0_init(void)
{
TCCR0 = 0x00;
TCNT0 =-125; //定时时间 秒
TCCR0 = (1<<CS02); //分频比256,
}
#pragma interrupt_handler timer0_ovf_isr:iv_TIMER0_OVF
void timer0_ovf_isr(void)
{
TCNT0 =-125;
timecnt++;
if(timecnt>=TIME)
{TCCR0 = 0x00;//close timer0
timecnt=0;
if(upodwn==2)
{clr_bit(PORTB,OUT4);
set_bit(PORTB,OUT2);
}
else //if (upodwn==4)
{clr_bit(PORTB,OUT2);
set_bit(PORTB,OUT4);
}
}
}
/*外部中断1处理*/
#pragma interrupt_handler int1:iv_INT1
void int1(void)
{GICR&=~(1<<INT1);//外部中断1 关闭
int1cnt++;
if(upodwn==2)//若在起靶状态,就发送中弹信息
{putchar(id);
putchar(int1cnt);
}
int1time=0;
//action();
}
/*串口接受中断*/
#pragma interrupt_handler usart_rxi:iv_USART_RXC
void usart_rxi(void)
{
//set_bit(PORTD,Se);//recieve disable se
//clr_bit(PORTD,Se);//recieve enable se
rcv[rcnt]=UDR;
rcnt++;
if(rcnt==2)
{rcnt=0;
if (rcv[0]==id)
{if(rcv[1]==1)//up
{clr_bit(PORTB,OUT4);
clr_bit(PORTB,OUT3);
set_bit(PORTB,OUT1);
timer0_init();
TIMSK =1<<TOIE0;//OPEN Timer0 int
upodwn=2;
}
else if(rcv[1]==2)//down
{clr_bit(PORTB,OUT2);
clr_bit(PORTB,OUT1);
set_bit(PORTB,OUT3);
rcv[1]=0;
timer0_init();
TIMSK =1<<TOIE0;//OPEN Timer0 int
upodwn=4;
}
else if(rcv[1]==7)//audio cnt
rcv[1]=int1cnt;
else rcv[1]=0x0b;
//delay(100);
putchar(id);//return value
putchar(rcv[1]);
rcv[0]=0;
rcv[1]=0;
}
}
//action();
}
void run(unsigned char cmd)
{
if(cmd)
{
switch(upodwn)
{case 2://up
clr_bit(PORTB,OUT4);
clr_bit(PORTB,OUT3);
set_bit(PORTB,OUT1);
break;
case 4://down
clr_bit(PORTB,OUT2);
clr_bit(PORTB,OUT1);
set_bit(PORTB,OUT3);
break;
default:break;
}
//启动定时器0
timer0_init();
TIMSK =1<<TOIE0;//OPEN Timer0 int
srun=0;//运行过后清除运行标志
}
}
void main(void)
{
unsigned char j,keyst;
unsigned int temp,i=0;
DDRC=0x00;/*PORTC is INPUT PORT*/
PORTC=0x7F;//PORTC PULLUP ENABLED
DDRD=0xD7; /* PD5 3 input ;others output */
PORTD=0x73; //se=0 pd2 pd3=0
DDRB=0xff;/* output */
PORTB=0x00;/* */
//DDRD=(1<<DDD2);
//PORTD=0;
id=PINC+0x80;//读入地址
uart_initial();
int_initial();
SEI();//开全局中断//open intrrupt
keyst=PIND;
keyst=keyst&(1<<DDD5);//取出按键的初始状态
while(1)
{
int1time++;
if(int1time==150)
{
GIFR=(1<<INTF1);//清除标志
GICR=(1<<INT1);//外部中断1 使能
}
/*判断按键key的方向*/
i=PIND;
delay(2000);
temp=PIND;
if(i==temp)
if (i&(1<<DDD5)) //key=1-----up
{if(i!=keyst)
{upodwn=2;//---up
srun=1;
keyst=i;
}
}
else //key=0-----down
{if(i!=keyst)
{keyst=i;
srun=1;//运行标志有效
upodwn=4;//----down
}
}
/*yunxing*/
run(srun);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -