📄 driver.c
字号:
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV = 0x00; //xtal divider
//XMCRA = 0x00; //external memory
//XMCRB = 0x00;
//SFIOR |= 0x04; //加上拉电阻
PORT_INITIALIZE();
TIMER1_INITIALIZE();
UART0_INITIALIZE();//jakegao
UART1_INITIALIZE();
//MCUCR = 0x80;
EICRA = 0x03; //extended ext ints,上升延触发
EICRB = 0x00; //extended ext ints
EIMSK = 0x01;
TIMSK = 0x04; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialised
SEND_COM1_AT((const unsigned char *)MCU_INIT_RUN,sizeof(MCU_INIT_RUN) );
}
//***************************************************************
//IO端口设置
//***************************************************************
void PORT_INITIALIZE(void)
{
MCUCSR|=0x80;
TWCR &=~ 0x02; //关闭PORTD第二功能的TWI输出
DDRA=0xff; //设置PORTA为输出
PORTA=0xFF;
//MCUCR&=~0x80; //禁止a口第二功能的使能
DDRB = 0xB7; //设置PORTB为输出(PB6设置为输入用来监测红外信号)
PORTB = 0xEF;
DDRC=0x07; //设置PORTC(0\1\2)为输出(3/4/5/6/7)为输入
PORTC=0xFF;
DDRD = 0xFF; //设置PORTD为输出
PORTD = 0xFF;
DDRE = 0xFF; //设置PORTE为输出
PORTE = 0xFF;
DDRF=0xFF; //设置PORTF为输出
PORTF=0xFF;
// MCUCR|=0X80; //enable ex_ram.
//XMCRA=0b00001110;
//XMCRB=0b10000000;
}
//*************************************************************
//计时器设置
//*************************************************************
void TIMER1_INITIALIZE(void)
{
TCCR1B = 0x00; //stop
//TCNT1H = 0xE0; //setup 1ms定时
//TCNT1L = 0xC0;
TCNT1H=0xFC; //100uS定时
TCNT1L=0xE0;
OCR1AH = 0x1F;
OCR1AL = 0x40;
OCR1BH = 0x1F;
OCR1BL = 0x40;
OCR1CH = 0x1F;
OCR1CL = 0x40;
ICR1H = 0x1F;
ICR1L = 0x40;
TCCR1A = 0x00;
TCCR1B = 0x01; //start Timer
}
//*****************************************************************
//参数初始化
//*****************************************************************
void PARAMETER_INITIALIZE(void)
{
voice_flag=EEPROM_READ(17); //读取按键音标志
}
//**********************************************定时器******************************************************//
//************************************************************
//100us定时中断
//************************************************************
void TIMER1_OVF_ISR(void)
{
//TIMER1 has overflowed
//TCNT1H = 0xE0; //reload counter high value 1MS定时
//TCNT1L = 0xC0; //reload counter low value
TCNT1H=0xFC; //100uS定时
TCNT1L=0xE0;
time++; //100uS增加一次记数
debug_time++;
logo_change_time++;
wireless_time++;
TEST_COUNT++;
clock_count++;
wait_count_time++;
//if(PORTB&BEER)
//{
//PORTB&=~BEER;
//}
//else
//{
// PORTB|=BEER;
//}
if(passward_set_flag==1)
{
passward_set_time++;
if(passward_set_time>30000)
{
passward_set_flag=0;
lcd_status=0;
}
}
if(clock_count>=10000) //计时一秒时间到
{
clock_count=0;
if(wait_count_flag!=0)
{
if(wait_count_time>40000)
{
lcd_status=0;
wait_count_flag=0;
wait_count_time=0;
}
else if (wait_count_time>30000)
{
lcd_status=32;
wait_count_flag=4;
}
else if (wait_count_time>20000)
{
lcd_status=32;
wait_count_flag=3;
}
else if (wait_count_time>10000)
{
lcd_status=32;
wait_count_flag=2;
}
}
second++;
if(second>=60)
{
second=0;
minute++;
}
if(minute>=60)
{
minute=0;
hour++;
}
if(hour>=24)
{
hour=0;
}
}
if(lcd_lamp_count_flag!=0)
{
lcd_lamp_time++;
}
if((TEST_COUNT>1000)&&(PORTB&BEER))
{
//PORTA&=~LAMP_LCD;
TEST_COUNT=0;
//SEND_COM1_AT((const unsigned char *)TIME_COUNT_WORK,sizeof(TIME_COUNT_WORK) );
}
else if((TEST_COUNT>20000)&&((PORTB&BEER)==0))
{
//PORTA|=LAMP_LCD;
TEST_COUNT=0;
}
}
//********************************************红外接收器驱动*********************************************//
//***********************************************
//对红外信号的监测
//监测端口低电平持续9ms,高电平持续4.5ms后方进入数据接收状态
//return: wireless_key_value ,得到此值后应立即清零
//***********************************************
void TEST_WIRELESS_SINGLE(void)
{
unsigned char i;
if(wireless_test_step==0)
{
if(PINB&TELEC)
{
wireless_time=0;
}
else
{
wireless_test_step=1;
}
}
else if(wireless_test_step==1)
{
if(PINB&TELEC)
{
//i=wireless_time;
//SEND_COM1_BYTE('1');
//SEND_COM1_BYTE(':');
//SEND_COM1_BYTE(ASCII(i/10));
//SEND_COM1_BYTE(ASCII(i%10));
//SEND_COM1_BYTE(0X0D);
//SEND_COM1_BYTE(0X0A);
if((wireless_time>80)&&(wireless_time<100))//在9ms波动范围以内
{
//SEND_COM1_BYTE('E');
//SEND_COM1_BYTE('N');
//SEND_COM1_BYTE('T');
//SEND_COM1_BYTE('E');
//SEND_COM1_BYTE('R');
//SEND_COM1_BYTE('2');
//SEND_COM1_BYTE(0X0D);
//SEND_COM1_BYTE(0X0A);
wireless_time=0;
wireless_test_step=2;
}
else
{
wireless_time=0;
wireless_test_step=0;
}
}
else
{
}
}
else if(wireless_test_step==2)
{
if(PINB&TELEC)
{
}
else
{
//i=wireless_time;
//SEND_COM1_BYTE('2');
//SEND_COM1_BYTE(':');
//SEND_COM1_BYTE(ASCII(i/10));
//SEND_COM1_BYTE(ASCII(i%10));
//SEND_COM1_BYTE(0X0D);
//SEND_COM1_BYTE(0X0A);
if((wireless_time>35)&&(wireless_time<55))//在4.5ms波动范围内
{
wireless_time=0;
wireless_test_step=3; //开始接收数据
}
else
{
wireless_time=0;
wireless_test_step=0;
}
}
}
while((wireless_test_step==3)||(wireless_test_step==4))
{
if(wireless_test_step==3)
{
if(PINB&TELEC)
{
wireless_test_step=4;
}
else if(wireless_time>10) //低电平的时间超过1ms(正常为0.56ms)
{
wireless_time=0;
wireless_test_step=0;
wireless_byte_count=0;
wireless_custom_code_1=0;
wireless_custom_code_2=0;
wireless_data_code_1=0;
wireless_data_code_2=0;
}
}
else if(wireless_test_step==4)
{
if(PINB&TELEC)
{
if(wireless_time>25) //高电平时间超过2.5ms(正常为1.69ms)>25jakegao
{
wireless_time=0;
wireless_test_step=0;
wireless_byte_count=0;
wireless_custom_code_1=0;
wireless_custom_code_2=0;
wireless_data_code_1=0;
wireless_data_code_2=0;
}
}
else
{
if((wireless_time>8)&&(wireless_time<14)) //1.125ms低电平 8-14
{
if(wireless_byte_count<=7)
{
wireless_custom_code_1&=~(1<<wireless_byte_count);
wireless_byte_count++;
wireless_test_step=3;
wireless_time=0;
}
else if((wireless_byte_count>7)&&(wireless_byte_count<=15))
{
wireless_custom_code_2&=~(1<<(wireless_byte_count-8));
wireless_byte_count++;
wireless_test_step=3;
wireless_time=0;
}
else if((wireless_byte_count>15)&&(wireless_byte_count<=23))
{
wireless_data_code_1&=~(1<<(wireless_byte_count-16));
wireless_byte_count++;
wireless_test_step=3;
wireless_time=0;
}
else if((wireless_byte_count>23)&&(wireless_byte_count<=31))
{
wireless_data_code_2&=~(1<<(wireless_byte_count-24));
wireless_byte_count++;
wireless_test_step=3;
wireless_time=0;
}
else
{
wireless_time=0;
wireless_test_step=0;
wireless_byte_count=0;
wireless_custom_code_1=0;
wireless_custom_code_2=0;
wireless_data_code_1=0;
wireless_data_code_2=0;
}
if(wireless_byte_count==32)
{
wireless_time=0;
wireless_test_step=0;
wireless_byte_count=0;
if((wireless_custom_code_1==0x00)&&(wireless_custom_code_2==0xFF))
{
wireless_key_value=wireless_data_code_1;
lcd_lamp_time=0; //背光灯亮的时间计时
lcd_lamp_count_flag=1; //开始计时
PORTA&=~LAMP_LCD;
}
wireless_custom_code_1=0;
wireless_custom_code_2=0;
wireless_data_code_1=0;
wireless_data_code_2=0;
}
}
else if((wireless_time>18)&&(wireless_time<26))//2.25ms高电平 18-26
{
if(wireless_byte_count<=7)
{
wireless_custom_code_1|=(1<<wireless_byte_count);
wireless_byte_count++;
wireless_test_step=3;
wireless_time=0;
}
else if((wireless_byte_count>7)&&(wireless_byte_count<=15))
{
wireless_custom_code_2|=(1<<(wireless_byte_count-8));
wireless_byte_count++;
wireless_test_step=3;
wireless_time=0;
}
else if((wireless_byte_count>15)&&(wireless_byte_count<=23))
{
wireless_data_code_1|=(1<<(wireless_byte_count-16));
wireless_byte_count++;
wireless_test_step=3;
wireless_time=0;
}
else if((wireless_byte_count>23)&&(wireless_byte_count<=31))
{
wireless_data_code_2|=(1<<(wireless_byte_count-24));
wireless_byte_count++;
wireless_test_step=3;
wireless_time=0;
}
else
{
wireless_time=0;
wireless_test_step=0;
wireless_byte_count=0;
wireless_custom_code_1=0;
wireless_custom_code_2=0;
wireless_data_code_1=0;
wireless_data_code_2=0;
}
if(wireless_byte_count==32)
{
wireless_time=0;
wireless_test_step=0;
wireless_byte_count=0;
if((wireless_custom_code_1==0x00)&&(wireless_custom_code_2==0xFF))
{
wireless_key_value=wireless_data_code_1;
lcd_lamp_time=0; //背光灯亮的时间计时
lcd_lamp_count_flag=1; //开始计时
PORTA&=~LAMP_LCD;
}
wireless_custom_code_1=0;
wireless_custom_code_2=0;
wireless_data_code_1=0;
wireless_data_code_2=0;
}
}
else
{
wireless_time=0;
wireless_test_step=0;
wireless_byte_count=0;
wireless_custom_code_1=0;
wireless_custom_code_2=0;
wireless_data_code_1=0;
wireless_data_code_2=0;
}
}
}
}
}
//********************************************按键扫描函数(做按键释放检查)********************************//
//********************************************************
//按键扫描-不带按键释放检查
//********************************************************
unsigned char SCAN_KEY(void)
{
unsigned char i,temp;
DDRC=0x07; //设置PORTC(0\1\2)为输出(3/4/5/6/7)为输入
PORTC=0xFF;
for(i=0;i<3;i++)
{
PORTC=~(1<<i); //键盘线扫描
DELAY_TIME(10); //等待低电平稳定
temp=PINC&0xf8; //读取键盘扫描信号,屏蔽低三位
if(temp!=0xf8) //如果有键按下,延时10ms消抖
{
DELAY_TIME(1000); //延时100ms消抖
temp=PINC&0xf8; //再读键盘
if(temp!=0xf8)
{
temp&=0xf8;
}
switch(temp)
{
case 0xb8:
{
temp=11-(2-i)*4;//10111000
break;
}
case 0xd8:
{
temp=10-(2-i)*4;//11011000
break;
}
case 0xe8:
{
temp=9-(2-i)*4;//11101000
break;
}
case 0xf0:
{
temp=8-(2-i)*4;//11110000
break;
}
default:
{
temp=0x7f;
break;
}
//return temp;
}
return temp;
}
PORTC=0xff;
}
return 0x7f;
}
//******************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -