📄 main.c
字号:
//ICC-AVR application builder : 2004-11-19 9:42:35
// Target : M8
// Crystal: 7.3728Mhz
#include <eeprom.h>
#include "head.h"
unsigned char getchar(void); //申明函数:串口接收函数;
void sendchar(unsigned char data); //申明函数:串口发送函数;
unsigned char table[10]={0xeb,0x60,0xc7,0x8f,0x2e,0xbd,0xed,0x0b,0xef,0xaf};
unsigned char lcd_buffer[16];
unsigned char host_id,guest_id,t,ques[100],data[110],ques_num;
unsigned int t1;
void port_init(void)
{
PORTB = 0xDF;
DDRB = 0xFF;
PORTC = 0x75; //m103 output only
DDRC = 0x77;
PORTD = 0xFF;
DDRD = 0x97;
}
//UART0 initialisation
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = 0x86;
UBRRL = 0x2F; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x18;
}
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x00 /*INVALID SETTING*/; //set count
TCCR0 = 0x05; //start timer
}
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0 = 0x00 /*INVALID SETTING*/; //reload counter value
t++;
if(t>100)
{
t1++;
t=0;
}
}
void adc_init(void)
{
DDRC=0x77;
PORTC=0x75;
ADCSRA = 0x00; //disable adc
ADMUX = 0xC3; //select adc input 0
ACSR = 0x80;
ADCSRA = 0xC6;
}
//call this routine to initialise all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
uart0_init();
timer0_init();
adc_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x01; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialised
}
//send data from the UART.
void sendchar(unsigned char data)
{
while(!(UCSRA&(1<<UDRE)));
UDR=data;
}
//receive data from the UART.
unsigned char getchar(void)
{
while(!(UCSRA&(1<<RXC)));
return UDR;
}
void send_ans(unsigned char star_flag,unsigned char star_num,unsigned char ans_num)
{
unsigned char i,chk;
chk=0xFF;
chk=0xFF^star_flag;
sendchar(star_flag);
chk^=0x78;
sendchar(0x78);
chk^=0xAB;
sendchar(0xAB);
chk^=0xEF;
sendchar(0xEF);
chk^=host_id;
sendchar(host_id);
chk^=guest_id;
sendchar(guest_id);
chk^=0x01;
sendchar(0x01);
chk^=ques_num;
sendchar(ques_num);
for(i=star_num;i<ans_num;i++)
{
sendchar(ques[i]);
chk^=ques[i];
}
chk^=0xF0;
sendchar(0xF0);
chk^=0x0F;
sendchar(0x0F);
sendchar(chk);
}
void send_answer()
{
if(ques_num<38)
send_ans(0x12,0,ques_num);
else if(ques_num>37&&ques_num<75)
{
send_ans(0x12,0,37);
send_ans(0x13,37,ques_num);
}
else
{
send_ans(0x12,0,37);
send_ans(0x13,37,74);
send_ans(0x14,74,ques_num);
}
}
unsigned char receive()//
{
unsigned char i,j;
begin: if(t>18) return 0;//goto A;
i=getchar(); //get data from RF
if(i==0x0f) //get the start signal
{
data[0]=getchar();
if(data[0]==0xf0)
{
data[1]=getchar();
if(data[1]==0xdd)
{
data[2]=getchar();
if(data[2]==0xbb)
{
data[3]=getchar();
if(data[3]==host_id)
{
data[4]=getchar();
if(data[4]==guest_id||data[4]==0xfe||data[4]==0xdb)
{
for(j=5;j<12+ques_num;j++) //
data[j]=getchar();
}
else goto begin;
}
else goto begin;
}
else goto begin;
}
else goto begin;
}
else goto begin;
}
else goto begin;
return 1;
}
void main()
{
unsigned char i,j,k,temp,ques_id,key,key_flag,d,d1,
n_ques[100],n_num,nques_id,score,ans[100],keya_flag,
keyb_flag,keyc_flag,keyd_flag,keye_flag,adc_h,adc_l;
unsigned int adc_rel,adc_old;
guest_id=EEPROMread(0x02);
host_id=EEPROMread(0x03);
i=0;
j=0;
k=0;
t=0;
temp=0;
ques_num=0;
ques_id=1;
nques_id=1;
keya_flag=0;
keyb_flag=0;
keyc_flag=0;
keyd_flag=0;
keye_flag=0;
key_flag=1;
init_devices();
init_lcd();
display(0x00);
//temp=EEPROMread(0x04);
//ques_num=EEPROMread(0x05);
//score=EEPROMread(0x06);
//for(i=0;i<100;i++)
//{
// ques[i]=EEPROMread(i+7);
// }
//for(i=0;i<100;i++)
//{
// ans[i]=EEPROMread(i+107);
// }
// while(1);
if((PIND|0x9f)==0x9f)
{
while(key!=5)
{
if(keyc_flag==0)
{
i=host_id/10;
k=host_id-(10*i);
lcd_buffer[9]=0x02;
lcd_buffer[1]=0;
}
else
{
i=guest_id/10;
k=guest_id-10*i;
lcd_buffer[1]=0x02;
lcd_buffer[9]=0;
}
lcd_buffer[7]=table[i];
lcd_buffer[15]=table[k]&0xef;
send_data(14,lcd_buffer[7]);
send_data(30,lcd_buffer[15]);
send_data(2,lcd_buffer[1]);
send_data(18,lcd_buffer[9]);
key=key_scan();
if(key==3)
keyc_flag=~keyc_flag;
if(key==7)
{
if(keyc_flag==0)
host_id++;
else
guest_id++;
}
if(key==4)
{
if(keyc_flag==0)
host_id--;
else
guest_id--;
}
if(host_id>80||host_id<1)
host_id=1;
if(guest_id>80||guest_id<1)
guest_id=1;
if(key==5)
{
lcd_buffer[0]=table[i];
lcd_buffer[6]=table[k];
PORTB&=~BIT(PB5);
PORTC&=~BIT(PC1);
while(!((PIND|0x97)==0x97))
{
if(t<50)
{
send_data(0x10,table[0]|0x10);
send_data(0,lcd_buffer[0]);
send_data(12,lcd_buffer[6]);
}
if(t>50)
{
send_data(0x10,0);
send_data(0,0);
send_data(12,0);
}
}
EEPROMwrite(0x02,guest_id);
EEPROMwrite(0x03,host_id);
}
}
}
i=guest_id/10;
j=guest_id-10*i;
lcd_buffer[0]=table[i];
lcd_buffer[6]=table[j];
send_data(0x10,table[0]|0x10);
send_data(0,lcd_buffer[0]);
send_data(12,lcd_buffer[6]);
work_state();
rece_state();
for(i=0;i<100;i++)
{
ques[i]=0;
n_ques[i]=0;
ans[i]=0;
}
d=0xF0;
while(1)
{
n_num=0;
if(t==1)
{
i=receive();
if(i)
for(j=0;j<11;j++)
d^=data[j];
if(d==data[11])
{
if(data[4]==guest_id||data[4]>80||data[4]==0)
{
if(data[6]==temp)//
goto B;
else
{
temp=data[6];
//key_flag=0;
switch(data[7])
{
case 0x22: lcd_buffer[1]=0x90;
lcd_buffer[11]=0x10;
lcd_buffer[15]=0x10;
send_data(0x16,lcd_buffer[11]);
send_data(0x02,lcd_buffer[1]);
send_data(0x1e,lcd_buffer[15]);
ques_num=data[8];
ques_id=ques_num;
break;
case 0xDA: score=data[8];
key_flag=0;
i=score/100;
j=(score-i*100)/10;
k=score-i*100-j*10;
if(i==1)
lcd_buffer[3]=table[j]|0x10;
else
lcd_buffer[3]=table[j];
lcd_buffer[13]=table[k]|0x10;
send_data(6,lcd_buffer[3]);
send_data(26,lcd_buffer[13]);
break;
deflaut: break;
}
}
}
}
}
A: if((data[4]==0xFE||data[4]==0xDB)&&data[ques_num+5]==0xDB)// //it is the answer
{
key_flag=0;
lcd_buffer[9]=0x40;
for(i=0;i<ques_num;i++)
ans[i]=data[i+5];
}
if(ans[ques_id-1]&0x01)
lcd_buffer[9]|=0x04;
else
lcd_buffer[9]&=0xfb;
if(ans[ques_id-1]&0x02)
lcd_buffer[9]|=0x08;
else
lcd_buffer[9]&=0xf7;
if(ans[ques_id-1]&0x04)
lcd_buffer[1]|=0x20;
else
lcd_buffer[1]&=0xdf;
if(ans[ques_id-1]&0x08)
lcd_buffer[1]|=0x40;
else
lcd_buffer[1]&=0xbf;
if(ans[ques_id-1]&0x10)
lcd_buffer[1]|=0x04;
else
lcd_buffer[1]&=0xfb;
send_data(2,lcd_buffer[1]);
send_data(18,lcd_buffer[9]);
if(ques_num!=0)//&&key_flag==1
{
j=0;
for(k=0;k<ques_num;k++)
{
if(ques[k]==0)
{
n_ques[j]=k+1;
j++;
n_num++;
}
}
i=n_num/100;
j=(n_num-i*100)/10;
k=n_num-i*100-j*10;
lcd_buffer[12]|=0x40;
if(i==1)
lcd_buffer[2]=table[k]|0x10;
else
lcd_buffer[2]=table[k]&0xef;
lcd_buffer[10]=table[j];
send_data(4,lcd_buffer[2]);
send_data(20,lcd_buffer[10]);
send_data(24,lcd_buffer[12]);
key=key_scan();
if(key==9||key==6)
{
if(key==9)
ques_id++;
if(ques_id>ques_num)
ques_id=1;
if(key==6)
ques_id--;
if(ques_id<1)
ques_id=ques_num;
//ques_id
if(ques[ques_id-1]&0x01)
lcd_buffer[9]|=0x02;
else
lcd_buffer[9]&=0xfd;
if(ques[ques_id-1]&0x02)
lcd_buffer[1]|=0x02;
else
lcd_buffer[1]&=0xfd;
if(ques[ques_id-1]&0x04)
lcd_buffer[12]|=0x20;
else
lcd_buffer[12]&=0xdf;
if(ques[ques_id-1]&0x08)
lcd_buffer[12]|=0x02;
else
lcd_buffer[12]&=0xfd;
if(ques[ques_id-1]&0x10)
lcd_buffer[4]|=0x20;
else
lcd_buffer[4]&=0xdf;
send_data(2,lcd_buffer[1]);
send_data(8,lcd_buffer[4]);
send_data(18,lcd_buffer[9]);
send_data(24,lcd_buffer[12]);
//send_data(14,lcd_buffer[7]);
// send_data(30,lcd_buffer[15]);
}
if((key==1||key==4||key==5||key==7||key==8)&&(key_flag==1))
{
if(ques[ques_id-1]&0x01)
keya_flag=1;
else
keya_flag=0;
if(ques[ques_id-1]&0x02)
keyb_flag=1;
else
keyb_flag=0;
if(ques[ques_id-1]&0x04)
keyc_flag=1;
else
keyc_flag=0;
if(ques[ques_id-1]&0x08)
keyd_flag=1;
else
keyd_flag=0;
if(ques[ques_id-1]&0x10)
keye_flag=1;
else
keye_flag=0;
switch(key)
{
case 7: ++keya_flag;
if(keya_flag>1)
keya_flag=0;
break;
case 4: ++keyb_flag;
if(keyb_flag>1)
keyb_flag=0;
break;
case 1: ++keyc_flag;
if(keyc_flag>1)
keyc_flag=0;
break;
case 8: ++keyd_flag;
if(keyd_flag>1)
keyd_flag=0;
break;
case 5: ++keye_flag;
if(keye_flag>1)
keye_flag=0;
break;
default: break;
}
ques[ques_id-1]=(keya_flag|(keyb_flag<<1)|(keyc_flag<<2)|(keyd_flag<<3)|(keye_flag<<4));
if(keya_flag==1)
lcd_buffer[9]|=0x02;
else
lcd_buffer[9]&=0xfd;
if(keyb_flag==1)
lcd_buffer[1]|=0x02;
else
lcd_buffer[1]&=0xfd;
if(keyc_flag==1)
lcd_buffer[12]|=0x20;
else
lcd_buffer[12]&=0xdf;
if(keyd_flag==1)
lcd_buffer[12]|=0x02;
else
lcd_buffer[12]&=0xfd;
if(keye_flag==1)
lcd_buffer[4]|=0x20;
else
lcd_buffer[4]&=0xdf;
send_data(2,lcd_buffer[1]);
send_data(8,lcd_buffer[4]);
send_data(18,lcd_buffer[9]);
send_data(24,lcd_buffer[12]);
}
if(key==3)
{
lcd_buffer[1]&=0xfd;
lcd_buffer[4]&=0x1f;
lcd_buffer[9]&=0xfd;
lcd_buffer[12]&=0x59;
send_data(2,lcd_buffer[1]);
send_data(8,lcd_buffer[4]);
send_data(18,lcd_buffer[9]);
send_data(24,lcd_buffer[12]);
nques_id++;
if(nques_id>n_num)
nques_id=1;
ques_id=n_ques[nques_id-1];
}
i=ques_id/100;
j=(ques_id-i*100)/10;
k=ques_id-i*100-j*10;
if(i)
lcd_buffer[7]=table[j]|0x10;
else
lcd_buffer[7]=table[j];
lcd_buffer[15]=table[k]|0x10;
send_data(14,lcd_buffer[7]);
send_data(30,lcd_buffer[15]);
B: i=receive();
if(i)
{
if(data[7]==0x88)//||data[4]==guest_id
{
key=0;
lcd_buffer[10]&=0xEF;
lcd_buffer[1]&=0xFE;
lcd_buffer[14]=0x00;
lcd_buffer[12]=(lcd_buffer[12]&0x6B)|0x01;
send_data(2,lcd_buffer[1]);
send_data(24,lcd_buffer[12]);
send_data(20,lcd_buffer[10]);
send_data(28,lcd_buffer[14]);
}
}
if(key==2)
{
// B: t=2;
lcd_buffer[0]|=0x10;
lcd_buffer[10]|=0x10;
lcd_buffer[12]|=0x18;
send_data(0,lcd_buffer[0]);
send_data(20,lcd_buffer[10]);
send_data(24,lcd_buffer[12]);
//i=receive();
//if(i)
// while(data[7]!=0x88)
// {
//i=receive();
//if(i)
//{
work_state();
send_state();
delay_ms(3);
// delay_us(250);
sendchar(0x00);
send_answer();
sendchar(0x00);
sendchar(0x00);
//}
work_state();
rece_state();
// delay_us(250);
// delay_us(250);
delay_ms(1);
//if(t1>200) break;
if(t>=2&&t<33)
{
lcd_buffer[1]|=0x01;
lcd_buffer[14]=0x00;
send_data(2,lcd_buffer[1]);
send_data(28,lcd_buffer[14]);
}
if(t>=33&&t<75)
{
lcd_buffer[14]=0x10;
lcd_buffer[1]&=0xFE;
send_data(28,lcd_buffer[14]);
send_data(2,lcd_buffer[1]);
}
if(t>=75&&t<100)
{
lcd_buffer[14]=0x01;
lcd_buffer[1]&=0xFE;
send_data(2,lcd_buffer[1]);
send_data(28,lcd_buffer[14]);
}
goto B;
// i=receive();
//if(i)
/*
while(i!=0x0F||data[0]!=0xF0)
{
i=getchar();
data[0]=getchar();
}
for(j=1;j<12;j++)
data[j]=getchar();
for(j=0;j<11;j++)
d^=data[j]; */
//if(d==data[11])
//{
/* if(data[7]==0x88)//||data[4]==guest_id
{
lcd_buffer[10]&=0xEF;
lcd_buffer[1]&=0xFE;
lcd_buffer[14]=0x00;
lcd_buffer[12]=(lcd_buffer[12]&0x6B)|0x01;
send_data(2,lcd_buffer[1]);
send_data(24,lcd_buffer[12]);
send_data(20,lcd_buffer[10]);
send_data(28,lcd_buffer[14]);
}
*/
// }
}
}
if(t==0)
{
while(!(ADCSRA&0x10));
adc_l=ADCL;
adc_h=(ADCH&0x03);
ADMUX=0xC3;// value|=(int)ADCH << 8; //read 2 high bits and shift into top byte
ADCSRA|=(1<<ADSC);
adc_rel=(((adc_h<<8)&0xff00)|adc_l);
lcd_buffer[4]&=0xF0;
if(adc_old!=adc_rel)
adc_old=adc_rel;
if(adc_old>0)
lcd_buffer[4]|=0x01;
if(adc_old>0x0100&&adc_old<0x0230)
lcd_buffer[4]|=0x05;
if(adc_old>0x0230&&adc_old<0x0244)
lcd_buffer[4]|=0x0D;
if(adc_old>0x0244)
lcd_buffer[4]|=0x0F;
send_data(0x08,lcd_buffer[4]);
}
//EEPROMwrite(0x04,temp);
//EEPROMwrite(0x05,ques_num);
//EEPROMwrite(0x06,score);
//for(i=0;i<100;i++)
//{
// EEPROMwrite((i+7),ques[i]);
// }
//for(i=0;i<100;i++)
//{
// EEPROMwrite((i+107),ans[i]);
// }
//}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -