📄 main.c
字号:
#include <\Register\6688.h>
#include <\Register\6688OPN.h>
#include <\Register\6688XFR.h>
#include "define.h"
#include "main.h"
//****************************程序版本号RC4490.HEX*********************************//
// The following line should be declared if using emulator, otherwise, diable it
sfr P2 = 0xA0;
//--------------------------------------
// Port A interrupt
//--------------------------------------
void PORTA_ISR (void) interrupt 0
{
KEY_DETECTED=1;
}
//--------------------------------------
// Timer 0 interrupt
//--------------------------------------
void TIMER0_ISR (void) interrupt 1
{
// write code here
}
//--------------------------------------
// Counter A interrupt
//--------------------------------------
void COUNTER_A_ISR (void) interrupt 2
{
// write code here
}
//--------------------------------------
// Timer 1 interrupt
//--------------------------------------
void TIMER1_ISR (void) interrupt 3
{
// write code here
}
//--------------------------------------
// Serial port 0 interrupt
//--------------------------------------
void UART0_ISR (void) interrupt 4
{
}
//--------------------------------------
// Timer 2 interrupt
//--------------------------------------
void TIMER2_ISR (void) interrupt 5
{
TF2=0;
CACON=CACON_VALUE;
}
//--------------------------------------
// Serial port 1 interrupt
//--------------------------------------
void UART1_ISR (void) interrupt 7
{
}
//******************************************
//*** DELAY ROUTINE ***
//******************************************
void INIT_BEFORE_SCAN (void)
{
/*
TMOD=0X11;//TIMER0 init 16BIT timer,TIMER1 init 16BIT timer
TCON=0X00;
TL0=0;
TH0=0;
*/
T2CON=0X00;//timer2 init
T2MOD=0X00;
PCCONH = 0X3F; //required for DC6688FSA
PBCONH=0X55;//01010101 PB7-4 open drain out
PBCONL=0X55;//01010101 PB3-0 open drain out
PBPUR =0; //PULL-UP DISABLE
last_pc=0XFF;
PORTB =0XFF;//init PORTB to high
//pull up in 1
PACONH=0;//PA7-4 IN int falling edge
PACONL=0;//PA3-0 IN int falling edge
PAPUR =0XFF;//PULL-UP ENABLE
CACON =0X03;//carrier fosc/1 start counter A, repeating mode, flip-flop high lvl
PCCONL=0XAB;//10101011 PC1 = push pull output REM Port Normal I/O Carrier on
PORTC=PORTC&0XBB;//PC2 to low , ,turn off all light
PORTC=PORTC|0X01;//PC0 TO HIGH.
ET2 =0;
IT0=0;//falling edge trigger
EA=1;//enable cpu interrupt
//set=0;//总是从TV开始
//last_led_value=0x7f;
get_set();
get_flash_data();
//time0_value.tempval=0;
//time0_over=0;
//low.tempval=0;
//low_over=0;
type=0;
//KEYSCAN_ENABLE=0;//??????????
//EXTEND_TIME =0;//????????????
toggle=0;
end_flag=0;
//last_led_value=0x7f;//1011 1111
last_pb=0x7f;
//stuck_key=255;
}
void CHECK_ACCESS_COMPLETE(void)
{
while((FAS & 0x01) == 1); // FBUSY bit
}
void _WR_(void)
{
CHECK_ACCESS_COMPLETE();//test busy bit wait for complete
FPTRL = (unsigned char)DATA_FLASH_PTR;//address
FPTRH = (unsigned char)(DATA_FLASH_PTR>>8);
FDB = FLASH_BUFFER;//a byte
FCNT = 1;//start to execute
CHECK_ACCESS_COMPLETE();//test busy bit wait for complete
}
void _RD_(void)
{
CHECK_ACCESS_COMPLETE();
FPTRL = (unsigned char)DATA_FLASH_PTR;
FPTRH = (unsigned char)(DATA_FLASH_PTR>>8);
FLASH_BUFFER = FDB;
CHECK_ACCESS_COMPLETE();
}
void SRAM_TO_FLASH(char adress,char value)
{
DATA_FLASH_PTR=adress;
FLASH_BUFFER = value;
_WR_();
}
char FLASH_TO_SRAM(char adress)
{
DATA_FLASH_PTR=adress;
_RD_();
return(FLASH_BUFFER);
}
void get_flash_data(void)
{
flash_flag=FLASH_TO_SRAM(8);
if(flash_flag!=0x90)//如果是第一次则向FLASH写入出厂初值
{
memory_channel[0]=7;
memory_channel[1]=11;
memory_channel[2]=21;
memory_channel[3]=23;
for(m=0;m<4;m++)//高地址为高位,低地址为低位。
{
temp_data_flash=(unsigned char)memory_channel[m];
SRAM_TO_FLASH(2*m,temp_data_flash);
temp_data_flash=(unsigned char)(memory_channel[m]>>8);
SRAM_TO_FLASH(2*m+1,temp_data_flash);
}
}
for(m=0;m<4;m++)//从FLASH中得到四套当前套值
{
temp_data_flash=FLASH_TO_SRAM(2*m+1);
memory_channel[m]=temp_data_flash;
temp_data_flash=FLASH_TO_SRAM(2*m);
memory_channel[m]=(memory_channel[m]<<8)+temp_data_flash;
}
}
void get_last_led_value(void)
{
if(set==0)
{
last_led_value=0x7f;
}
else if(set==1)
{
last_led_value=0xbf;
}
else if(set==2)
{
last_led_value=0xdf;
}
else if(set==3)
{
last_led_value=0xef;
}
}
void get_set(void)
{
flash_flag=FLASH_TO_SRAM(11);
if(flash_flag!=0x90)//如果是第一次出厂赋初值
{
set=0;
}
else
{
set=FLASH_TO_SRAM(10);
}
get_last_led_value();
}
/*
void init_timer0(void)
{
TL0=0;
TH0=0;
TF0=0;
}
*/
//################基本电平#############################//
void sent_uint_rc5_hi(void)
{
RCAP2L=0xff-0x78;
RCAP2H=0xff-0x03;
CACON_VALUE=0x07;//00000111
PCON=PCON|0X01;//bit 0 -> IDLE mode, assumed only waiting timer 2 interrupt
}
void sent_uint_rc5_low(void)
{
RCAP2L=0xff-0x78;
RCAP2H=0xff-0x03;
CACON_VALUE=0x03;//00000011
PCON=PCON|0X01;
}
void sent_uint_rc6_hi(void)
{
RCAP2L=0xff-0xbc;
RCAP2H=0xff-0x01;
CACON_VALUE=0x07;//00000111
PCON=PCON|0X01;//bit 0 -> IDLE mode, assumed only waiting timer 2 interrupt
}
void sent_uint_rc6_low(void)
{
RCAP2L=0xff-0xbc;
RCAP2H=0xff-0x01;
CACON_VALUE=0x03;//00000011
PCON=PCON|0X01;
}
//########################################################//
//################基本位电平#####################//
void sent_unit_rc5_hi_low(void)//n:type i:lead,0,1,or endcode
{
sent_uint_rc5_hi();
sent_uint_rc5_low();
}
void sent_unit_rc5_low_hi(void)
{
sent_uint_rc5_low();
sent_uint_rc5_hi();
}
void sent_unit_rc6_hi_low(void)//n:type i:lead,0,1,or endcode
{
sent_uint_rc6_hi();
sent_uint_rc6_low();
}
void sent_unit_rc6_low_hi(void)
{
sent_uint_rc6_low();
sent_uint_rc6_hi();
}
//###############################################//
//###################基本字节电平###################//
void sent_n_bit_0_hl_1_lh(char n,char temp)//rc5码 0电平为高低,1电平为低高
{
unsigned char idata reverse;
unsigned char idata m;
if(n==8)
{
reverse=2;
}
else
{
reverse=10;
}
for(m=0;m<n;m++)
{
if(m==reverse)
{
if(toggle==0)
{
sent_unit_rc5_hi_low();
}
else
{
sent_unit_rc5_low_hi();
}
}
else
{
if((temp&0X80)==0)//judge 0 or 1
{
sent_unit_rc5_hi_low();
}
else
{
sent_unit_rc5_low_hi();
}
}
temp<<=1;
}
}
void sent_n_bit_0_lh_1_hl(char n,char temp)//rc6码 0电平为低高,1电平为高低
{
unsigned char idata m;
for(m=0;m<n;m++)
{
if((temp&0X80)==0)//judge 0 or 1
{
sent_unit_rc6_low_hi();
}
else
{
sent_unit_rc6_hi_low();
}
temp<<=1;
}
}
//#################################################//
//###########################rc6头码###################//
void sent_rc6_head(void)
{
RCAP2L=0xff-0x68;
RCAP2H=0xff-0x0a;
CACON_VALUE=0x07;//00000111
PCON=PCON|0X01;//bit 0 -> IDLE mode, assumed only waiting timer 2 interrupt
RCAP2L=0xff-0x78;
RCAP2H=0xff-0x03;
CACON_VALUE=0x03;//00000011
PCON=PCON|0X01;
}
//###########################dream_DVB固定码###################//
void sent_DVB_uint(char n,char m)
{
RCAP2L=0xff-0xbe;
RCAP2H=0xff-0x00;
CACON_VALUE=0x07;//00000111
PCON=PCON|0X01;//bit 0 -> IDLE mode, assumed only waiting timer 2 interrupt
RCAP2L=0xff-m;
RCAP2H=0xff-n;
CACON_VALUE=0x03;//00000011
PCON=PCON|0X01;
}
//#################################################//
//#################################################//
//###########################尾码###################//
void sent_tail(char n,char m)//83ms use a flag all tail with this function
{
RCAP2L=0;
RCAP2H=0;
CACON_VALUE=0x03;//00000011
PCON=PCON|0X01;
RCAP2L=0xff-m;
RCAP2H=0xff-n;
CACON_VALUE=0x03;//00000011
PCON=PCON|0X01;
}
//####################################################//
void sent_rc5(void)//13
{
CADATAL =110;
CADATAH =222;
sent_n_bit_0_hl_1_lh(8,temp_system_value);
temp_key_value<<=2;
sent_n_bit_0_hl_1_lh(6,temp_key_value);
sent_tail(0x52,0xe8);//0x52e8=89.76-3-65.536
}
void sent_rc6(void)//13
{
unsigned char fix;
fix=0x08;
CADATAL =110;
CADATAH =222;
sent_rc6_head();
fix<<=4;
sent_n_bit_0_lh_1_hl(4,fix);
if(toggle==0)//toggle bit
{
sent_unit_rc5_low_hi();
}
else
{
sent_unit_rc5_hi_low();
}
sent_n_bit_0_lh_1_hl(8,temp_system_value);
sent_n_bit_0_lh_1_hl(8,temp_key_value);
sent_tail(0x3a,0xec);//0x3aec=83-3-65.536
}
void sent_dream_DVB(void)//系统码9244F1C1
{
unsigned char idata hbit;
unsigned char idata lbit;
unsigned char idata temp;
unsigned int idata time;
unsigned int idata temp_key_value1;
CADATAL =103;
CADATAH =209;
temp_key_value1=766+136*dvb[KEY1_OFFSET];//键码
lbit=(unsigned char)temp_key_value1 ;
hbit=(unsigned char)(temp_key_value1>>8) ;
sent_DVB_uint(0x03,0x86);//1---902us
sent_DVB_uint(0x09,0x5e);//c---2398us
sent_DVB_uint(0x03,0x86);//1---902us
sent_DVB_uint(0x0a,0xf6);//f---2806us
sent_DVB_uint(0x05,0x1e);//4---1310us
sent_DVB_uint(0x05,0x1e);//4---902us
sent_DVB_uint(0x04,0x0e);//2---1038us
sent_DVB_uint(0x07,0xc6);//9---1990us
sent_DVB_uint(0x32,0xf0);//间隔码,13040us
sent_DVB_uint(0x03,0x86);//1---902us
if(press==0)
{
sent_DVB_uint(hbit,lbit); //一位变量
sent_DVB_uint(0x02,0xfe);//0---766us
}
else
{
temp=8+dvb[KEY1_OFFSET];
if(temp>=16)
{
temp=temp-16;
}
time=766+136*temp;
lbit=(unsigned char)time ;
hbit=(unsigned char)(time>>8) ;
sent_DVB_uint(hbit,lbit); //一位变量
sent_DVB_uint(0x07,0x3e);//0---1854us
}
sent_DVB_uint(0x03,0x86);//1---902us
//*************变量的低四位*************//
temp=(temp_key_value&0x0f);//取低四位
time=766+136*temp;
lbit=(unsigned char)time ;
hbit=(unsigned char)(time>>8) ;
sent_DVB_uint(hbit,lbit);//两位键码
//*************变量的高四位*************//
temp=(temp_key_value&0xf0);//
temp=(temp>>4);//取高四位
time=766+136*temp;
lbit=(unsigned char)time ;
hbit=(unsigned char)(time>>8) ;
sent_DVB_uint(hbit,lbit);//两位键码
sent_DVB_uint(0x02,0xfe);//0---766us
sent_DVB_uint(0x02,0xfe);//0---766us
sent_DVB_uint(0x00,0x00);//低电平
sent_tail(0x36,0x14); //高电平0x3aec=83-3-65.536
}
void SEND_CODE(void)//send code,new code and repeat code diffrent in code_length and code_list
{
if( ( (KEY1_OFFSET>=16) && (KEY1_OFFSET<=18) )&&((memory_channel[set]==13)||(memory_channel[set]==23)||(memory_channel[set]==25)) )//SAT的203发TV的码,遇到声音的三个键
{
flash_current_led=0X7F;//1011 1111 light tv led
temp_set=0;
}
else
{
flash_current_led=last_led_value;//指示灯地址赋值
temp_set=set; //当前套变量赋值
}
temp_key_value=channel[memory_channel[temp_set]][KEY1_OFFSET];//键码
type=channel[memory_channel[temp_set]][37]; //类型代号
temp_system_value=channel[memory_channel[temp_set]][38]; //系统码
if ( temp_key_value!=0xff )//有健值的闪烁1S闪烁5次
{
sent_flash++;
if(sent_flash<=2)
{
turn_on_portb_led(flash_current_led);//在键盘扫描处关闭了指示灯,故该处再次打开
}
else
{
turn_off_portb_led();
}
if(sent_flash>=4)
{
sent_flash=0;
}
}
else //无码键
{
turn_off_portb_led();
delay_65ms();
delay_65ms();
return;
}
sent_detail_code();
}
void sent_detail_code(void)
{
// rotate_flag=0;//default right rotate
// tail_flag=0;//default tail type high and low
// reverse_bit=10;//default reverse bit
switch(type)
{
case 0://MN6014A/W-C6D6
sent_rc5();
break;
case 1://M50560
sent_rc6();
break;
case 2://M50119P
sent_dream_DVB();
break;
default:
break;
}
}
void BIT_SCANKEY(void)//bia this routine we can get KEY_COUNT,KEY1_OFFSET,GF_9 input variable PB,PA,COLUMN,BUFFER_KEY
{
// bit bdata 0_row;
unsigned char idata CYC_PB;
unsigned char idata CYC_PA;
unsigned char idata i;//row cycle
unsigned char idata j;//column cycle
// unsigned char current_row;//the pressed key row
// unsigned char current_column;//the pressed key column
unsigned char idata current_key_value;//the pressed key value
unsigned char idata pa_value;//the port a value buffer
last_pc=PORTC;//保存PC口值
// last_pb=PORTB;//保存PB口值
//init before scan
PAPUR = 0X00; //扫描前先把PA口设置为推挽输出
PACONH = 0XAA;
PACONL = 0XAA; //并把上拉禁止
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -