⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tvbox.c

📁 电视接收盒软件.AVR的Mega8对电视机高频头的控制,含红外接收,I2C总线,UART.专业人士之作.绝对经典.感谢站长昨天给分.
💻 C
📖 第 1 页 / 共 2 页
字号:
{
  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 + -