📄 tvbox.c
字号:
{
EEPROMwrite(ChannelNumber*2,TunerData/0x100);
EEPROMwrite(ChannelNumber*2+1,TunerData%0x100);
}
BYTE LoadChannelNumber(void)
{
return(EEPROMread(CHANNEL_NUMBER));
}
void SaveChannelNumber(BYTE ChannelNumber)
{
EEPROMwrite(CHANNEL_NUMBER,ChannelNumber);
}
/////////////////////////////////////////////////
#pragma interrupt_handler uart_rxc:iv_USART_RXC
void uart_rxc(void)
{
buff[wr_index]=UDR;
if(wr_index<(buffsize-1))
wr_index++;
else
wr_index=0;
}
//字符输出函数
void putchar(unsigned char c)
{
while (!(UCSRA&(1<<UDRE)));
UDR=c;
}
//字符输入函数
unsigned char getchar(void)
{
BYTE temp;
if(wr_index==rd_index)
temp=0;
else
{
temp=buff[rd_index];
if(rd_index<(buffsize-1))
rd_index++;
else
rd_index=0;
}
return temp;
}
//字符串输出函数
void puts(char *s)
{
while (*s)
{
putchar(*s);
s++;
}
putchar(0x0a);//回车换行
putchar(0x0d);
}
//打印输出函数
void printf(BYTE *pFmt, WORD wVal)
{
BYTE TagArray[6]; // output buffer
BYTE ucBff; // character buffer
BYTE *p;
p=TagArray;
while (1)
{
ucBff = *pFmt; // get a character
if (ucBff == _EOS_) // check end of string
break;
if (ucBff == '%') // check special case
{
switch(*(++pFmt)) // check next character
{
case 'x': // hexadecimal number
case 'X':
HEXSTRING(wVal, p);
while(*p)
{
putchar(*p++);
}
break;
case 'd': // decimal number
case 'D': // decimal number
case 'i': // decimal number
case 'I':
BCDSTRING(wVal, p);
while(*p)
{
putchar(*p++);
}
break;
} // switch
}
else // general
putchar(ucBff); // put a character
pFmt++; // next
} // while
}
//数据转10进制字符
static void BCDSTRING(WORD wVal, BYTE *pTag)
{
BYTE i,buffer;
WORD mode=10000;
BYTE flag=0;
for(i=0;i<5;i++)
{
buffer=wVal/mode;
if(buffer||flag||(i==4))
{
*pTag++=buffer+'0';
flag=1;
}
wVal%=mode;
mode/=10;
}
*pTag=_EOS_;
}
//数据转16进制字符
static void HEXSTRING(WORD wVal, BYTE *pTag)
{
BYTE i,buffer;WORD mode;
if(wVal&0xff00)
{
mode=0x1000;
for(i=0;i<4;i++)
{
buffer=wVal/mode;
if(buffer<10){*pTag++=buffer+0x30;}
else{*pTag++=buffer+0x57;}
wVal%=mode;
mode/=0x10;
}
}
else
{
mode=0x10;
for(i=0;i<2;i++)
{
buffer=wVal/mode;
if(buffer<10){*pTag++=buffer+0x30;}
else{*pTag++=buffer+0x57;}
wVal%=mode;
mode/=0x10;
}
}
*pTag=_EOS_;
}
//UART初始化
void uart_init(void)
{
//OSCCAL=read_flash(0x1f20);
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//允许发送、接收及接收中断
UBRRL=(fosc/16/(baud+1))%256;
UBRRH=(fosc/16/(baud+1))/256;
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
TWBR=0;//I2C Bus
TWSR=00;
}
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
void init_IR(void)
{
CLI(); //disable all interrupts
Int1_setport(); //0b1111,1011 Port D bit2 (INT0) use for IR
Int1_enable(); //Enable external interrupt 1
Int1_setedge(0x02); //activated on the falling edge (IR is rising edge)
Timer_setclk(0x04); //Timer prescaler CLK/256 Inter RC = 8MHz
T0_enable(); //T0 interrupt enable
IrFlags=0; //if 1 IR received a key data
SEI(); //enable all interrupts
}
////////////////////////////////////////////////////////
#pragma interrupt_handler extInt1:3 // vector # //Int1:3
void extInt1()
{
BYTE IrTimeCapture;
IrTimeCapture = T0_Get();;
T0_Clear();
if(IrBitCounter>0)
{
if(IrTimeCapture>0xb0)
{
IrBitCounter = 1;
}
else if(IrTimeCapture>0x36)//0x48
{
IrBuffer>>=1;
IrBuffer|=0x80;
}
else//0x24
{
IrBuffer>>=1;
}
if(IrBitCounter==1)
{
if(IrFlags)
{
IrFlags++;
IrBitCounter=0;
}
}
else if(IrBitCounter==24)
{
IrKeyCode=IrBuffer;
}
else if(IrBitCounter>31)
{
if(IrKeyCode==~IrBuffer)
{
IrFlags = 1;
}
IrBitCounter=0;
}
}
IrBitCounter++;
}
///////////////////////////////////////////////////////////////////
//---------INIT variable and device -------------------------------
void init(void)
{
CLI();
IO_init();
init_IR();
uart_init();
rtc_init();
SEI();
}
void IO_init(void)
{
DDRB = 0x00;
SET_PORTB->OUT0=OUT;
SET_PORTB->OUT1=OUT;
PORTB = 0xff;
PUT_PORTB->OUT0=HIGHT;
PUT_PORTB->OUT1=HIGHT;
DDRC = 0x00;
PORTC = 0xff;
DDRD = 0x00;
SET_PORTD->POWER=OUT;
SET_PORTD->IR=IN;
PORTD = 0xff;
PUT_PORTD->POWER=HIGHT;
PUT_PORTD->IR=HIGHT;
}
///////////////////////////////////////////////////////
//调整时间 可以在主循环中调用
void time(void)
{
if (second<60)
return;
else
{
second-=60;
if (minute<59)
minute++;
else
{
minute=0;
if (hour<23)
hour++;
else
hour=0;
}
}
}
//初始化
void rtc_init(void)
{
TCCR2 = 0x00; //停止时钟
ASSR = 1<<AS2; //异步时钟
TCNT2 = 0xE0; //定时时间1秒
TCCR2 = (1<<CS22)|(1<<CS21)|(1<<CS20); //分频比1024,0x07
TIMSK |=1<<TOIE2;
}
#pragma interrupt_handler timer2_ovf_isr:iv_TIMER2_OVF
void timer2_ovf_isr(void)
{
TCNT2 = 0xE0;
second++;
time();
}
void delayms(WORD t)
{
WORD i;
while(t--)
{
for(i=0;i<0x4a2;i++);
}
}
///////////////////////////////////////////////////////////////////////////
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
IrBitCounter=0;
T0_Clear();
}
///////////////////////////////////////////////////////////////////////////
void main(void)
{
BYTE secondtemp;
init();
puts("Tuner use Atmel MCU Mega8L");
puts("Thanks my wife Jenny");
ChannelNumber=LoadChannelNumber();
LoadChannelData(ChannelNumber);
TunerWrite();
TunerChannel=1;
while(TRUE)
{
if(secondtemp!=second)
{
secondtemp=second;
if(TunerFlag)TunerFlag--;
PUT_PORTD->POWER = !(PUT_PORTD->POWER);
//printf("%x:",(hour/10*16+hour%10));
//printf("%x:",(minute/10*16+minute%10));
//printf("%x\n",(second/10*16+second%10));
}
if(IrFlags)
{
BYTE i;
delayms(200);
//printf("IrFlag=%d\n",IrFlags);
for(i=0;i<KEY_NONE;i++)
{
if(key[i]==IrKeyCode) break;
}
IrKeyCode = i;
switch (IrKeyCode) //Password is: F5971(2,3) (F is factory KEY)
{
case KEY_0:
case KEY_1:
case KEY_2:
case KEY_3:
case KEY_4:
case KEY_5:
case KEY_6:
case KEY_7:
case KEY_8:
case KEY_9:
ChannelNumber=IrKeyCode;
if(IrFlags<4)
{
LoadChannelData(ChannelNumber);
}
else
{
if(TunerFlag)
{
SaveChannelData(ChannelNumber);
}
}
TunerFlag=0;
SaveChannelNumber(ChannelNumber);
break;
case KEY_L:
if(IrFlags<4)
{
if(--TunerChannel<1)TunerChannel=95;
TunerData=GetFrequency(TunerChannel);
}
else
{
TunerData--;
}
TunerFlag=10;
break;
case KEY_R:
if(IrFlags<4)
{
if(++TunerChannel>95)TunerChannel=1;
TunerData=GetFrequency(TunerChannel);
}
else
{
TunerData++;
}
TunerFlag=10;
break;
case KEY_TV:
//PowerOn();
break;
case KEY_AV:
//PowerOff();
break;
case KEY_U:
EepromWrite();
break;
case KEY_D:
EepromRead();
break;
case KEY_C:
break;
case KEY_K:
break;
default:;
}
//TunerWrite();
IrFlags = 0;
//printf("ch=%d ",ChannelNumber);
//printf("ch1=%d ",TunerChannel);
//printf("fre=%d",(TunerData-760)/20);
//printf(".%d\n",((TunerData-760)%20)*5);
//printf("Flag=%d",TunerFlag);
//printf(" Code=%x\n",IrKeyCode);
IrKeyCode = 0x00;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -