📄 main.c
字号:
/**********************************************************************
*File Name : Main.c
*Creat Time : 2002/02/11
*Program Author : mqli
*File Discreption :
************************************************************************/
#include "common.h"
#include "var.h"
#include "main.h"
#include "key.h"
#include "Keyboard.h"
#include "Eeprom.h"
#include "lcd.h"
#include "Int.h"
void main(void)
{
Init_51MCU();
Init_all_Hardware();
Init_Run_VAR();
Init_System();
EA = 1;
while(1)
{
Process_KeyPress();
Process_Message();
Process_Delay_Event();
}
}
U8 System_Main_Volume=50;
BOOL System_Play_Pause_State=0;
BOOL Beeper_On=0;
void Process_KeyPress(void)
{
if(Key_Code==0xFF) return;
if(System_Flag_Being_Scrolling)
{
Stop_Scroll_LCD_String();
Normal_Dispaly();
}
if(System_Flag_Temp_DisplaY)
{
System_Flag_Temp_DisplaY=0;
Normal_Dispaly();
}
switch(Key_Code)
{
case 2:
Beeper_On^=1;
if(Beeper_On)
{
P3_4=1;
Display_Temp_String("Beep ON");
}
else
{
P3_4=0;
Display_Temp_String("Beep OFF");
}
break;
case 44:
if(IR_Key_Be_Hold_Key)
Start_Scrolling_Text("Get PLAY key holding");
else
{
System_Play_Pause_State^=1;
if(System_Play_Pause_State)
Display_Temp_String(" PLAY ");
else
Display_Temp_String(" PAUSE ");
}
break;
case 49:
if(IR_Key_Be_Hold_Key)
Start_Scrolling_Text("Get Stop key holding");
else
Display_Temp_String(" STOP ");
break;
case 32:
if(IR_Key_Be_Hold_Key)
Start_Scrolling_Text("Get NEXT key holding");
else
Display_Temp_String(" NEXT ");
break;
case 16: //volume up
System_Main_Volume++;
if(System_Main_Volume>=100)
System_Main_Volume=100;
Display_Temp_String("VOL ");
LCD_Display_Char(4, System_Main_Volume/100+'0');
LCD_Display_Char(5, System_Main_Volume/10%10+'0');
LCD_Display_Char(6, System_Main_Volume%10+'0');
break;
case 17:
if( System_Main_Volume)
System_Main_Volume--;
Display_Temp_String("VOL ");
LCD_Display_Char(4, System_Main_Volume/100+'0');
LCD_Display_Char(5, System_Main_Volume/10%10+'0');
LCD_Display_Char(6, System_Main_Volume%10+'0');
break;
case KEY_FP_MUTE: // 0x49,
case 78:
Mute_Key_Process();
if(System_Flag_MuteState)
Display_Temp_String(" MUTE ");
else
Display_Temp_String("MUTE CANCEL");
break;
case KEY_FP_PREVIOUS: // 0x41,
Display_Temp_String(" PREVIOUS ");
break;
case KEY_FP_TRACK_DOWN: // 0x4B,
Display_Temp_String(" TRACK DOWN");
break;
case KEY_FP_SEEK_UP: // 0x4B,
Display_Temp_String(" SEEK UP ");
break;
case KEY_IR_STEREO: // 0x07,
default :
{
switch(Key_Code_Mode)
{
case PHILIPS_IR_KEY_MODE_DVD:
Display_Temp_String("DVD ");
break;
case PHILIPS_IR_KEY_MODE_DVD_R:
Display_Temp_String("DVR ");
break;
case PHILIPS_IR_KEY_MODE_DVD_R1:
Display_Temp_String("DVR1 ");
break;
case PHILIPS_IR_KEY_MODE_HDR:
Display_Temp_String("HDR ");
break;
default:
Display_Temp_String(" ");
LCD_Display_Char(0, 'M');
LCD_Display_Char(1, Key_Code_Mode/100+'0');
LCD_Display_Char(2, Key_Code_Mode/10%10+'0');
LCD_Display_Char(3, Key_Code_Mode%10+'0');
break;
}
LCD_Display_Char(5, Key_Code/100+'0');
LCD_Display_Char(6, Key_Code/10%10+'0');
LCD_Display_Char(7, Key_Code%10+'0');
}
break;
case INVALID_KEY: // 0xFF
break;
}
Key_Code=INVALID_KEY;
Key_Code_Mode=INVALID_KEY;
IR_Key_Be_Hold_Key=0;
}
void Process_Message(void)
{
Get_Keyboard_Key();
if(System_Flag_Power_State==OFF)
return;
}
void Process_Delay_Event(void)
{
Update_LCD_Display();
if(System_Flag_Being_Scrolling)
{
if(Timer_for_Sytem_Display>SCROLL_TEXT_TIME_INTERVEL_X3mS)
{
Timer_for_Sytem_Display=0;
Scrolling_Chars();
}
}
if(System_Flag_RTC_Update==TRUE)
{
U8 RTC_String[8];
System_RTC_Second++;
if(System_RTC_Second==60)
{
System_RTC_Second=0;
System_RTC_Minute++;
if(System_RTC_Minute==60)
{
System_RTC_Minute=0;
System_RTC_Hour++;
if(System_RTC_Hour==24)
System_RTC_Hour=0;
}
}
System_Flag_RTC_Update=FALSE;
if(System_Flag_Temp_DisplaY==0
&&System_Flag_Being_Scrolling==0)
{
LCD_Display_String(0," ");
RTC_String[0]=System_RTC_Hour/10+'0';
RTC_String[1]=System_RTC_Hour%10+'0';
RTC_String[2]=System_RTC_Minute/10+'0';
RTC_String[3]=System_RTC_Minute%10+'0';
LCD_Icon_Display_Control(SEG_P5,ON);
LCD_Icon_Display_Control(SEG_P8,ON);
LCD_Icon_Display_Control(SEG_P3,ON);
RTC_String[4]=System_RTC_Second/10+'0';
RTC_String[5]=System_RTC_Second%10+'0';
RTC_String[6]='\0';
LCD_Display_String(1,RTC_String);
}
}
if(Timer_for_Refresh_LCD_Display>=50)//250)
{
System_Flag_RTC_Update=TRUE;
Timer_for_Refresh_LCD_Display=0;
System_Confirm_Refresh_LCD_Counter++;
System_Confirm_Refresh_LCD_Counter%=3;
switch(System_Confirm_Refresh_LCD_Counter)
{
case 0:
for(LCD_Refresh_Poniter=0;LCD_Refresh_Poniter<5;LCD_Refresh_Poniter++)
{
Refresh_LCD_One_Byte(LCD_Refresh_Poniter);
}
break;
case 1:
for(LCD_Refresh_Poniter=5;LCD_Refresh_Poniter<10;LCD_Refresh_Poniter++)
{
Refresh_LCD_One_Byte(LCD_Refresh_Poniter);
}
break;
case 2:
for(LCD_Refresh_Poniter=10;LCD_Refresh_Poniter<16;LCD_Refresh_Poniter++)
{
Refresh_LCD_One_Byte(LCD_Refresh_Poniter);
}
break;
}
}
if(System_Flag_DispEvent)
{
Display_Number(Monitor);
System_Flag_DispEvent=0;
}
if(System_Flag_Temp_DisplaY)
{
if(Timer_for_Sytem_Display>250)//TEMP_TEXT_DISPLAY_STILL_TIME_X3mS)
{
Timer_for_Sytem_Display=0;
Normal_Dispaly();
System_Flag_Temp_DisplaY=0;
}
}
}
void Init_51MCU(void)
{
IE=0;
//IE = 0x30; // 00110000 EA EC ET2 ES ET1 EX1 ET0 EX0
/***PORT DATA ****/
/***extern interrupt 0,1 setting****/
IT1=1; // 0/1 LOW LEVEL/FALLING edge triggle the external interrupt 1 (for RDS)
IE1=0; //clear the interrupt flag
IT0=1; // 0/1 LOW LEVEL/FALLING edge triggle the external interrupt 0 (for CLOCK)
IE0=0; //clear the interrupt flag
/*** Serial communucation port set ***/
SM0 = 0; // 8 bit UART variable baud
SM1 = 1;
SM2 = 0; // disable multi-processor communication
REN = 1; // receive enable
TB8 = 0; // clear transmit parity bit
RB8 = 0; // clear receive parity bit
TI = 0; // clear transmit interrupt flag
RI = 0; // clear receive interrupt flag
/***timers function set***/
/*** Timer0 for 16 timer***/
TMOD=0x21; //timer0(Timer MOD1 ): 0001 use as 16 timer for the 20ms interrupt
// timer1(Timer MOD2) : 0010 use as for baud rate and auto reload mode
#if ( SYSTEM_CRYSTAL ==USE_CRYSTAL_40M)
TH0=0x00; /*reload value 19.6ms for X=40M*/
TL0=0x00; /*reload value 19.6ms for X=40M*/
#elif(SYSTEM_CRYSTAL ==USE_CRYSTAL_27M)
//TH0=0xDC; /*reload value 4ms for X=27M*/
//TL0=0xCF; /*reload value 4ms for X=27M*/
TH0=0x50; /*re load value 20ms for X=27M*/
TL0=0x37; /*reload value 20ms for X=27M*/
#elif(SYSTEM_CRYSTAL ==USE_CRYSTAL_27MX2)
TH0=0x50;
TL0=0x37;
#elif( SYSTEM_CRYSTAL== USE_CRYSTAL_24M598_X2)
TH0=0xCC; /*reload value 3ms for 25.598*2**/
TL0=0xD5;
#elif( SYSTEM_CRYSTAL== USE_CRYSTAL_40M039_X2)
TH0=0x97; /*reload value 4ms for 40.039*2**/
TL0=0xBC;
#elif( SYSTEM_CRYSTAL== USE_CRYSTAL_12M_X2)
TH0=0xE0; /*reload value 4ms for 12M*2**/
TL0=0xB8;
#else
TH0=0xff; /*reload value 25ms for X=22.118M*/
TL0=0x4b; /*reload value 25ms for X=22.118M*/
#endif
/*** Timer1 for baud rate***/
PCON |= 0x80;
TL1 = 0; // clear timer 1 counter low
//TH1=0xFF-fs/B/32/12 +1 SMOD=0
//TH1=0xFF-fs/B/16/12 +1 SMOD=1
/* TH1 =0xff-0x0C+1; //2400bps for 11.0592 SMOD=0
TH1 =0xff-0x06+1; //4800bps for 11.0592 SMOD=0
TH1 =0xff-0x03+1; //9600bps for 11.0592 SMOD=0
TH1 =0xff-0x03+1; PCON|=0x80; //19200bps for 11.0592 SMOD=1
TH1 =0xff-0x18+1; //2400bps for 22.1184 SMOD=0
TH1 =0xff-0x0C+1; //4800bps for 22.1184 SMOD=0
TH1 =0xff-0x06+1; //9600bps for 22.1184 SMOD=0
TH1 =0xff-0x03+1; //19200bps for 22.1184 SMOD=0
TH1 =0xff-0x01+1; //38400bps for 22.1184 SMOD=0 */
TH1 =0xff-0x1D+1; SM1 =0; //2400bps for 27 SMOD=0
/* TH1 =0xff-0x0E+1; //4800bps for 27 SMOD=0
TH1 =0xff-0x07+1; //9600bps for 27 SMOD=0
TH1 =0xff-0x0F+1; //9600bps for 27 SMOD=1
TH1 =0xff-0x07+1; //19200bps for 27 SMOD=1
TH1 =0xff-0x04+1; //19200bps for 27 SMOD=0
TH1 =0xff-0x02+1; //38400bps for 27 SMOD=0
TH1 =0xff-0x01+1; //57600bps for 27 SMOD=0
TH1 =0xff-0x56+1; //2400bps for 40.039*2M SMOD=0
TH1 =0xff-0x2B+1; //4800bps for 40.039*2M SMOD=0
TH1 =0xff-0x15+1; //9600bps for 40.039*2M SMOD=0
TH1 =0xff-0x0A+1; //19200bps for40.039*2M SMOD=0
TH1 =0xff-0x05+1; //38400bps for 40.039*2M SMOD=0
TH1 =0xff-0x04+1; //57600bps for 40.039*2M SMOD=0
TH1 =0xff-0x02+1; //115200bps for 40.039*2M SMOD=0
*/
/***timer 2 for timer***/
T2CON=0x09; /*TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CR/RL2*/
/* use the timer2 as capture mode and timer1 for baud rate*/
/*TF2 timer2 overflow flag,not set*/
/*EXF2 T2 extern pin P1.1 negative edge flag*/
/*RCLK TCLK =00 ,use timer1 overflow clock to RXD TXD*/
/*set the EXEN2=1, allow the extern input T2EX(P11) */
/*set TR2=0,temp to mask the timer2 clock input*/
/*set C/T2=0,select the timer fuction for TIMER2 */
/*set CP/RT2=1, enable the timer capture */
TH2=0; TL2=0; /*reload the prescalor 19.6ms for X=40M , 37.5ms for X=22.118M*/
/****triggle the timer***/
TR0=1; //start timer0
TR1=1; // start timer 1 for baud rate
TR2=1; //start timer2 for IR decoder
/****set the priority of interrupt***/
PS = 0; // set serial to low priority
ES = 1; // enable serial interrupt
PT0=0; //set timer0 to low prioity
PX1=0; // set the Externel 1 interrupt
PT2 =1; //timer2 to high prioty
PT1=0;
ET0=1; //enable timer0 interrupt
ET1=1; /*enable T1 interrupt*/
ET2=1; /*enable T2 interrupt*/
EX0=0; //disable the EXtern0 interrupt
EX1=0; // disable the extern interrupt1
ET1=1; /*enable T1 interrupt*/
ET0=1;
}
void Init_all_Hardware(void)
{
Init_LCD_COtrollor();
//first init the EEPROM
/* ReadXEEprom(temp_byte,EEPAddress_INIT_FLAG,1);
if(*temp_byte!=0xAA)
{
WriteEEprom(EEPAddress_INIT_FLAG, 0xAA);
Reset_EEProm();
}
*/
P3_4=0;
Display_Temp_String("POWER ON");
}
void Save_all_Var_to_EEProm(void)
{
}
void Reset_EEProm(void)
{
//save all var
Save_all_Var_to_EEProm();
}
void Init_Run_VAR(void)
{
Need_Send_Single_Key=0;
Flag_Get_Hold_Key=0;
IR_Get_Start_Begin=0;
Start_Parse_Key_Input=0;
Key_Scan_Step=0;
Enable_Get_Key=1;
Need_Send_Click_key=0;
Get_Single_Key_Code=0;
System_Flag_Being_Scrolling=0; //flag to indicate that allow scrolling
IR_Get_Start_Begin=0;
System_Flag_RTC_Update=FALSE;
Start_Parse_Key_Input=0;
Key_Scan_Step=0;
Enable_Get_Key=0;
Need_Send_Click_key=0;
IR_Key_Be_Hold_Key=0; //when we check the IR realse we will set the flag for send out a single key
Get_Single_Key_Code=0;
Enable_Hold_Key_Valid=0;
System_Flag_Temp_DisplaY=0;
Enable_Repeat_Bit=0;
Timer_for_Refresh_LCD_Display=0;
System_Confirm_Refresh_LCD_Counter=0;
System_RTC_Hour=0;
System_RTC_Minute=0;
System_RTC_Second=0;
}
void Init_System()
{
}
void Mute_Key_Process()
{
System_Flag_MuteState^=1;
if(System_Flag_MuteState)
{
LCD_Icon_Display_Control(SEG_MUTE, ON);
}
else
{
LCD_Icon_Display_Control(SEG_MUTE, OFF);
}
}
void Normal_Dispaly()
{
}
void Delay_x5uS(U8 time )
{
while(time)
time--;
}
void Delay_xmS( U8 time)
{
U8 i;
i=0;
while(i<time)
{
Delay_x5uS(190);
Delay_x5uS(190);
i++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -