📄 tvbox.c
字号:
#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 + -