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

📄 tvbox.c

📁 电视接收盒软件.AVR的Mega8对电视机高频头的控制,含红外接收,I2C总线,UART.专业人士之作.绝对经典.感谢站长昨天给分.
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <iom8v.h>
#include <macros.h>
#include <eeprom.h>
///////////////////////////////
//*********define IO PORT******
typedef struct{   
 unsigned OUT0    :1;  //bit 0
 unsigned OUT1    :1;  //bit 1
 unsigned OUT2    :1;  //bit 2
 unsigned OUT3    :1;  //bit 3
 unsigned OUT4    :1;  //bit 4
 unsigned OUT5    :1;  //bit 5
 unsigned OUT6    :1;  //bit 6
 unsigned OUT7    :1;  //bit 7
}PPORTB;

typedef struct{   
 unsigned IN0     :1;  //bit 0
 unsigned IN1     :1;  //bit 1
 unsigned IN2     :1;  //bit 2
 unsigned IN3     :1;  //bit 3
 unsigned IN4     :1;  //bit 4
 unsigned IN5     :1;  //bit 5
 unsigned IN6     :1;  //bit 6
 unsigned NOUSEC7 :1;  //bit 7
}PPORTC;

typedef struct{   
 unsigned RXD     :1;  //bit 0
 unsigned TXD     :1;  //bit 1
 unsigned SYNC    :1;  //bit 2
 unsigned IR      :1;  //bit 3
 unsigned POWER   :1;  //bit 4
 unsigned NOUSED5 :1;  //bit 5
 unsigned NOUSED6 :1;  //bit 6
 unsigned NOUSED7 :1;  //bit 7
}PPORTD;

#define PUT_PORTB ((PPORTB *)&PORTB)
#define PUT_PORTC ((PPORTC *)&PORTC)
#define PUT_PORTD ((PPORTD *)&PORTD)
#define GET_PORTB ((PPORTB *)&PINB)
#define GET_PORTC ((PPORTC *)&PINC)
#define GET_PORTD ((PPORTD *)&PIND)
#define SET_PORTB ((PPORTB *)&DDRB)
#define SET_PORTC ((PPORTC *)&DDRC)
#define SET_PORTD ((PPORTD *)&DDRD)

/*
////////////////////////////////////////////////////////////////////////////////
//                          _____     _____                                   //
// /REST     /REST   PC6   | 1   \___/  28 |   PC5   ADC5   SCL     SCL       //
//           RXD     PD0   | 2          27 |   PC4   ADC4   SDA     SDA       //
//           TXD     PD1   | 3     A    26 |   PC3   ADC3                     //
// SYNC      INT0    PD2   | 4     T    25 |   PC2   ADC2                     //
// IR        INT1    PD3   | 5     m    24 |   PC1   ADC1                     //
// POWER     XCK/T0  PD4   | 6     e    23 |   PC0   ADC0                     //
// VCC               VCC   | 7     g    22 |   GND                  GND       //
// GND               GND   | 8     a    21 |   AREF                 GND       //
//           XTAL1   PB6   | 9     8    20 |   AVCC                 VCC       //
//           XTAL2   PB7   | 10         19 |   PB5   SCK                      //
//           T1      PD5   | 11         18 |   PB4   MISO                     //
//           AIN0    PD6   | 12         17 |   PB3   MOSI   OC2               //
//           AIN1    PD7   | 13         16 |   PB2   /SS    OC1B              //
//           ICP     PB0   | 14         15 |   PB1          OC1A              //
//                          ---------------                                   //
////////////////////////////////////////////////////////////////////////////////
*/
/*
////////////////////////////////////////////////////////////////////////////////
//                                                                            //
//                                                                            //
//                                                                            //
//                            I  T  R  R  S  S  A  A                          //
//                            N  X  X  E  C  D  D  D                          //
//                            T  D  D  S  L  A  C  C                          //
//                            0        T        3  2                          //
//                                                                            //
//                            P  P  P  P  P  P  P  P                          //
//                            D  D  D  C  C  C  C  C                          //
//                            2  1  0  6  5  4  3  2                          //
//                         - -- -- -- -- -- -- -- -- -                        //
//                       /   32 31 30 29 28 27 26 25   \                      //
//                      |                               |                     //
//           INT1   PD3 | 1                          24 | PC1   ADC1          //
//           T0     PD4 | 2                          23 | PC0   ADC0          //
//                  GND | 3         ATMEL            22 | ADC7                //
//                  VCC | 4         Mega8            21 | GND                 //
//                  GND | 5                          20 | AREF                //
//                  VCC | 6                          19 | ADC6                //
//           XTAL1  PB6 | 7                          18 | AVCC                //
//           XTAL2  PB7 | 8                          17 | PB5   SCK           //
//                      |                               |                     //
//                       \    9 10 11 12 13 14 15 16   /                      //
//                         - -- -- -- -- -- -- -- -- -                        //
//                            P  P  P  P  P  P  P  P                          //
//                            D  D  D  B  B  B  B  B                          //
//                            5  6  7  0  1  2  3  4                          //
//                                                                            //
//                            T  A  A  I  O  O  O  M                          //
//                            0  N  N  C  C  C  C  I                          //
//                               0  1  P  1  1  2  S                          //
//                                        A  B     O                          //
//                                                                            //
//                                                                            //
//                                                                            //
//                                                                            //
////////////////////////////////////////////////////////////////////////////////
*/
//              红外输入(IR)                                                 //
//              视频同步输入(SYNC)                                          //
//              I2C总线(SDA,SCL)(各接一10K上拉电阻)                        //
//              低电平复位(REST)(接一10K上拉电阻)                         //
//              串联按键输入(KEY)(接一10K上拉电阻)                        //
//              参考电位(CAP)(对地接一0.1uF电容)                          //
/*
////////////////////////////////////////////////////////////////////////////////
//                                                                            //
//                                                                            //
//                                                                            //
//                            S  T  R  R  S  S                                //
//                            Y  X  X  E  C  D                                //
//                            N  D  D  S  L  A                                //
//                            C        T                                      //
//                                                                            //
//                            P  P  P  P  P  P  P  P                          //
//                            D  D  D  C  C  C  C  C                          //
//                            2  1  0  6  5  4  3  2                          //
//                         - -- -- -- -- -- -- -- -- -                        //
//                       /   32 31 30 29 28 27 26 25   \                      //
//                      |                               |                     //
//           IR     PD3 | 1                          24 | PC1                 //
//           POWER  PD4 | 2         ATMEL            23 | PC0   KEY           //
//           GND    GND | 3         Mega8            22 | ADC7                //
//           VCC    VCC | 4                          21 | GND   GND           //
//           GND    GND | 5                          20 | AREF  CAP           //
//           VCC    VCC | 6                          19 | ADC6                //
//                  PB6 | 7                          18 | AVCC  VCC           //
//                  PB7 | 8                          17 | PB5                 //
//                      |                               |                     //
//                       \    9 10 11 12 13 14 15 16   /                      //
//                         - -- -- -- -- -- -- -- -- -                        //
//                            P  P  P  P  P  P  P  P                          //
//                            D  D  D  B  B  B  B  B                          //
//                            5  6  7  0  1  2  3  4                          //
//                                                                            //
//                                                                            //
//                                                                            //
////////////////////////////////////////////////////////////////////////////////
*/
#define BYTE unsigned char
#define WORD unsigned int
#define TRUE    1
#define FALSE   0
#define ON      1
#define OFF     0
#define HIGHT   1
#define LOW     0
#define OUT     1
#define IN      0
#define _EOS_   '\0'
///////////////////////////////////////////////////
#define fosc 8000000 //晶振8MHZ
#define baud 19200   //波特率
#define buffsize 64
BYTE buff[buffsize];
BYTE rd_index=0;
BYTE wr_index=0;
static void BCDSTRING(WORD wVal, BYTE *pTag);
static void HEXSTRING(WORD wVal, BYTE *pTag);
//-------------------------------------------------
void putchar(BYTE c);
//字符输入函数
BYTE getchar(void);
//字符串输出函数
void puts(char *s);
void printf(BYTE *pFmt, WORD wVal);
//UART初始化
void uart_init(void);
///////////////////////////////////////////////////
///////////////////////////////////////////////////
//TWI状态定义   低 3 位屏蔽
//MT 主方式传输  MR 主方式接收
#define START             0x08
#define RE_START          0x10
#define MT_SLA_ACK        0x18
#define MT_SLA_NOACK      0x20
#define MT_DATA_ACK       0x28
#define MT_DATA_NOACK     0x30
#define MT_DATA_FAIL      0x38
#define MR_DATA_FAIL      0x38
#define MR_SLA_ACK        0x40
#define MR_SLA_NOACK      0x48
#define MR_DATA_ACK       0x50
#define MR_DATA_NOACK     0x58
//SR 从机方式接收  ST 从机方式传输  ALL  广播
#define SR_SLA_ACK        0x60
#define MT_SR_SLA_ACK     0x68
#define SR_ALL_ACK        0x70
#define MT_SR_ALL_ACK     0x78
#define SR_DATA_ACK       0X80
#define SR_DATA_NOACK     0X88
#define SR_ALL_DATA_ACK   0x90
#define SR_ALL_DATA_NOACK 0x98
#define SR_STOP_RESTART   0xa0
#define ST_SLA_ACK        0xa8
#define MT_ST_SLA_ACK     0xb0
#define ST_DATA_ACK       0xb8
#define ST_DATA_NOACK     0xc0
#define ST_LAST_DATA_ACK  0xc8
#define NO_GOOD           0x00
#define NO_USE            0xf8
////////////////////////////////
//#define Start() (TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTA);while(!(TWCR&(1<<TWINT)));if((TWSR&0xF8)!=START) return FALSE;)
//#define Slave(x) (TWDR=x;TWCR=(1<<TWINT)|(1<<TWEN);while(!(TWCR&(1<<TWINT)));if((TWSR&0xF8)!=MT_SLA_ACK) return FALSE;)
//#define send(x) (TWDR=x;TWCR=(1<<TWINT)|(1<<TWEN);while(!(TWCR&(1<<TWINT)));if((TWSR&0xF8)!=MT_DATA_ACK) return FALSE;)
//#define Stop() (TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);)
////////////////////////////////
#define RF_ADDRESS 0xc0
#define IF_ADDRESS 0x86
BYTE const ch[6]={1,4,6,51,62,63};
WORD const fre[6]={49.75*20,77.25*20,112.25*20,471.25*20,565.75*20,607.25*20};
#define CHANNEL_NUMBER 0x20
BYTE ChannelNumber;
BYTE TunerChannel;
WORD TunerData;
BYTE TunerFlag;
BYTE TunerWrite(void);
void EepromWrite(void);
void EepromRead(void);
WORD GetFrequency(BYTE channel);
void LoadChannelData(BYTE ChannelNumber);
void SaveChannelData(BYTE ChannelNumber);
BYTE LoadChannelNumber(void);
void SaveChannelNumber(BYTE ChannelNumber);
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
#define Int1_enable()   (GICR|=0x80)
#define Int1_disable()  (GICR&=0x7f)
#define Int1_setedge(x) {MCUCR&=0xf3;MCUCR|=((x)&0x03)<<2;}
#define Int1_setport()  {DDRD&=0xf7;PORTD&=0xf7;}
#define T0_enable()     (TIMSK|=0x01)
#define T0_disable()    (TIMSK&=0xfe)
#define T0_Get()        (TCNT0)
#define T0_Set(x)       (TCNT0=(x))
#define T0_Clear()      (TCNT0=0)
#define Timer_setclk(x) {TCCR0&=0xf8;TCCR0|=((x)&0x07);}
//-------------------------------------------------------------------
BYTE const key[0x13]=
{
0x15,//   KEY_0     0x00
0x08,//   KEY_1     0x01
0x09,//   KEY_2     0x02
0x0a,//   KEY_3     0x03
0x0c,//   KEY_4     0x04
0x0d,//   KEY_5     0x05
0x0e,//   KEY_6     0x06
0x10,//   KEY_7     0x07
0x11,//   KEY_8     0x08
0x12,//   KEY_9     0x09
0x14,//   KEY_L     0x0a
0x16,//   KEY_R     0x0b
0x06,//   KEY_TV    0x0c
0x02,//   KEY_AV    0x0d
0x00,//   KEY_U     0x0e
0x04,//   KEY_D     0x0f
0x05,//   KEY_C     0x10
0x01,//   KEY_K     0x11
0xff //   KEY_NONE  0x12
};

#define   KEY_0     0x00
#define   KEY_1     0x01
#define   KEY_2     0x02
#define   KEY_3     0x03
#define   KEY_4     0x04
#define   KEY_5     0x05
#define   KEY_6     0x06
#define   KEY_7     0x07
#define   KEY_8     0x08
#define   KEY_9     0x09
#define   KEY_L     0x0a
#define   KEY_R     0x0b
#define   KEY_TV    0x0c
#define   KEY_AV    0x0d
#define   KEY_U     0x0e
#define   KEY_D     0x0f
#define   KEY_C     0x10
#define   KEY_K     0x11
#define   KEY_NONE  0x12

BYTE IrBitCounter;
BYTE IrKeyCode;
BYTE IrBuffer;
BYTE IrFlags;
void init_IR(void);
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
void init(void);
void IO_init(void);
/////////////////////////////////////////////////////////////////////
BYTE hour;
BYTE minute;
BYTE second;
void rtc_init(void);
void delayms(WORD t);
void time(void);
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
static BYTE Start(void);
static BYTE Slave(BYTE x);
static BYTE Send(BYTE x);
static BYTE Read(void);
static BYTE Readast(void);
static void Stop(void);
/////////////////////////////////////////////////////////////////////
static BYTE Start(void)
{
  TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTA);
  while(!(TWCR&(1<<TWINT)));
  if((TWSR&0xF8)!=START) return FALSE;
  return TRUE;
}
static BYTE Slave(BYTE x)
{
  TWDR=x;
  TWCR=(1<<TWINT)|(1<<TWEN);
  while(!(TWCR&(1<<TWINT)));
  if((TWSR&0xF8)!=MT_SLA_ACK) return FALSE;
  return TRUE;
}
static BYTE Send(BYTE x)
{
  TWDR=x;
  TWCR=(1<<TWINT)|(1<<TWEN);
  while(!(TWCR&(1<<TWINT)));
  if((TWSR&0xF8)!=MT_DATA_ACK) return FALSE;
  return TRUE;
}
static BYTE Read(void)
{
  TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA);
  while(!(TWCR&(1<<TWINT)));
  if((TWSR&0xF8)!=MT_DATA_ACK) return FALSE;
  return TRUE;
}
static BYTE ReadLast(void)
{
  TWCR=(1<<TWINT)|(1<<TWEN);
  while(!(TWCR&(1<<TWINT)));
  if((TWSR&0xF8)!=MT_DATA_NOACK) return FALSE;
  return TRUE;
}
static void Stop(void)
{
  TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}
BYTE TunerWrite(void)
{
  BYTE band;
  BYTE ErrorFlag;
  if(TunerData>498.25*20){band=0x04;}
  else if(TunerData>202.25*20){band=0x02;}
  else {band=0x01;}
  
  ErrorFlag =Start();
  ErrorFlag&=Slave(RF_ADDRESS);
  ErrorFlag&=Send(TunerData/0x100);
  ErrorFlag&=Send(TunerData%0x100);
  ErrorFlag&=Send(0x88);
  ErrorFlag&=Send(band);
  Stop();
//------------------------------------------------
  ErrorFlag&=Start();
  ErrorFlag&=Slave(IF_ADDRESS);
  ErrorFlag&=Send(0x00);
  ErrorFlag&=Send(0xd6);
  ErrorFlag&=Send(0x71);
  ErrorFlag&=Send(0x0f);
  Stop();

  return ErrorFlag;
}
void EepromWrite(void)
{
  
  Start();
  Slave(0xa0);
  Send(0x00);
  Send(0xaa);
  Send(0x55);
  Send(0xbb);
  Stop();
}
void EepromRead(void)
{
  
  //Start();
  //Slave(0xa0);
  //Send(0x00);
  Start();
  Slave(0xa1);
  Read();
  Read();
  ReadLast();
  Stop();
}

WORD GetFrequency(BYTE channel)
{
  BYTE i;
  if((channel==0)||(channel>95)) return 0;
  for(i=0;i<6;i++)
  {
    if(ch[i]>channel)break;
  }
  i--;
  
  return(fre[i]+(WORD)(channel-ch[i])*160+760);
}
void LoadChannelData(BYTE ChannelNumber)
{
  TunerData=(WORD)EEPROMread(ChannelNumber*2)*0x100+EEPROMread(ChannelNumber*2+1);
}
void SaveChannelData(BYTE ChannelNumber)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -