?? rs_main.c
字號:
#include <REG51.H>
//定義端口資源
sbit Control_1 = P1^0; /* 輸出到光耦,低電平選通*/
sbit Control_2 = P1^2; /* 輸出到光耦,低電平選通*/
sbit Control_3 = P1^4; /* 輸出到光耦,低電平選通*/
sbit Control_4 = P1^6; /* 輸出到光耦,低電平選通*/
sbit Control_LED1 = P1^1; /* 輸出到發光二極管,低電平點亮*/
sbit Control_LED2 = P1^3; /* 輸出到發光二極管,低電平點亮*/
sbit Control_LED3 = P1^5; /* 輸出到發光二極管,低電平點亮*/
sbit Control_LED4 = P1^7; /* 輸出到發光二極管,低電平點亮*/
sbit BUZZER_Control = P3^6; /* 蜂鳴器,低電平蜂鳴*/
sbit RUN_LED = P3^7; /* 運行指示LED */
//鍵盤編碼
#define KEY_SHIFT 0x06
#define KEY_TONE 0x16
#define KEY_POWER 0x86
#define KEY_1 0x7E
#define KEY_2 0x2E
#define KEY_3 0x26
#define KEY_4 0x5E
#define KEY_5 0x6E
#define KEY_6 0x56
#define KEY_7 0x9E
#define KEY_8 0xAE
#define KEY_9 0xB6
#define KEY_0 0xBE
#define KEY_ESC 0x96
#define KEY_DEC 0xDE
#define KEY_OK 0x8E
#define KEY_INC 0xCE
void Main_Initlization( void ); /* 主初始化程序*/
void Interrupt_INT0( void ); /* 遙控解碼*/
void Interrupt_INT1( void ); /* 10ms定時脈沖中斷*/
void Interrupt_T0( void ); /* 遙控解碼*/
void Interrupt_T1( void ); /* PWM 定時器*/
void KEY_Process( void ); /* 遙控按鍵解碼*/
void APP_Initlization( void ); /* 應用程序初始化*/
void CH_LED_Control( void ); /* 通道指示燈*/
void CH_Power_ON( void ); /* 電源控制*/
void RUN_LED_Control( void ); /* 運行指示燈控制*/
unsigned char VOL_INC( unsigned char VOL ); /* 通道功率增加*/
unsigned char VOL_DEC( unsigned char VOL ); /* 通道功率減小*/
/* 遙控器解碼變量定義*/
bit KEY_DECODE_OK; /* 遙控器解碼成功標志*/
bit Fresh_KEY_Flag; /* 首次按鍵標志*/
unsigned char KEY_DECODE; /* 解碼后的鍵值*/
unsigned char RS_Index; /* 當前遙控碼位置*/
unsigned char RS_High; /* 遙控器解碼定時器高位*/
unsigned long RS_Decode; /* 解碼數據*/
union URS_CODE /* 遙控碼解碼數據*/
{ /* 格式:設備碼1E,設備反碼E1*/
unsigned char KEY[4]; /* 數據碼,數據反碼,32bit */
unsigned long FULL_KEY;
} RS_CODE;
/* PWM 信號發生脈沖變量定義*/
unsigned char TimeSlot; /* PWM定時器*/
unsigned char CH_Vol[4]; /* 通道音量數據*/
unsigned char Current_CH; /* 當前遙控控制通道選擇0~3*/
bit POWER_FLAG; /* 電源總開關標志*/
#define PWM_INIT 200 /* 初始計數值*/
#define VOL_MAX PWM_INIT-2 /* 最大值,越大,功率越大*/
#define VOL_MIN VOL_MAX-40 /* 最小值,越小,功率越低*/
#define VOL_INIT VOL_MIN + 10 /* 初始亮度*/
#define IDLE_Cnt 3 /* 空閑時間,確定新鍵按下*/
unsigned char P1_Mirror; /* P1口鏡像寄存器*/
unsigned char LED_Mirror; /* LED鏡像寄存器*/
/* 系統處理變量定義*/
bit System_Timer; /* 系統10ms定時標志,來自100Hz中斷*/
bit Timer_Flag; /* 10ms定時器標志*/
unsigned char LED_FLASH_Cnt; /* LED閃爍定時器*/
unsigned char PRE_KEY; /* 前一個按鍵數據*/
/********************************************************************/
/* 主程序 */
/********************************************************************/
void main( void )
{
Main_Initlization( ); /* 主初始化程序*/
APP_Initlization( ); /* 應用程序初始化*/
while( 1 )
{
KEY_Process( ); /* 鍵盤處理*/
CH_LED_Control( ); /* 通道指示燈*/
/* 定時器服務*/
if( System_Timer )
{
System_Timer = 0;
Timer_Flag = 1;
}
/* RUN_LED閃燈程序,正常1s閃爍一次,遙控解碼時,快速閃爍*/
RUN_LED_Control( );
if( Timer_Flag )
Timer_Flag = 0;
}
}
/********************************************************************/
/* 遙控按鍵解碼處理程序 */
/********************************************************************/
void KEY_Process( void ) /* 遙控按鍵解碼*/
{
if( KEY_DECODE_OK )
{
KEY_DECODE_OK = 0; /* 處理結束*/
switch( KEY_DECODE ) /* 根據鍵值散轉*/
{
/* 電源總開關控制*/
case KEY_POWER: if( Fresh_KEY_Flag )
{
POWER_FLAG = !POWER_FLAG;
if( POWER_FLAG )
CH_Power_ON( );
}
break;
/* 通道電源功率增加*/
case KEY_INC: if( POWER_FLAG )
{
if( Current_CH == 0 ) /* 所有通道*/
{
CH_Vol[ 0 ] = VOL_INC( CH_Vol[ 0 ] );
CH_Vol[ 1 ] = VOL_INC( CH_Vol[ 1 ] );
CH_Vol[ 2 ] = VOL_INC( CH_Vol[ 2 ] );
CH_Vol[ 3 ] = VOL_INC( CH_Vol[ 3 ] );
}
else
CH_Vol[ Current_CH -1 ] = VOL_INC( CH_Vol[ Current_CH -1 ] );
}
break;
/* 通道電源功率減小*/
case KEY_DEC: if( POWER_FLAG )
{
if( Current_CH == 0 ) /* 所有通道*/
{
CH_Vol[ 0 ] = VOL_DEC( CH_Vol[ 0 ] );
CH_Vol[ 1 ] = VOL_DEC( CH_Vol[ 1 ] );
CH_Vol[ 2 ] = VOL_DEC( CH_Vol[ 2 ] );
CH_Vol[ 3 ] = VOL_DEC( CH_Vol[ 3 ] );
}
else
CH_Vol[ Current_CH -1 ] = VOL_DEC( CH_Vol[ Current_CH -1 ] );
}
break;
/* 遙控控制通道切換,循環切換*/
case KEY_TONE: if( Fresh_KEY_Flag )
{
Current_CH ++;
if( Current_CH > 4 )
Current_CH = 1;
}
break;
/* 通道切換,通過SHIFT + 數字鍵,0鍵表示所有*/
case KEY_0: if( Fresh_KEY_Flag )
if( PRE_KEY == KEY_SHIFT )
Current_CH = 0;
break;
case KEY_1: if( Fresh_KEY_Flag )
if( PRE_KEY == KEY_SHIFT )
Current_CH = 1;
break;
case KEY_2: if( Fresh_KEY_Flag )
if( PRE_KEY == KEY_SHIFT )
Current_CH = 2;
break;
case KEY_3: if( Fresh_KEY_Flag )
if( PRE_KEY == KEY_SHIFT )
Current_CH = 3;
break;
case KEY_4: if( Fresh_KEY_Flag )
if( PRE_KEY == KEY_SHIFT )
Current_CH = 4;
break;
case KEY_ESC: if( Fresh_KEY_Flag )
Current_CH = 0;
break;
}
Fresh_KEY_Flag = 0;
PRE_KEY = KEY_DECODE; /* 前一個鍵值更新*/
}
}
/********************************************************************/
/* 主初始化程序 */
/* 初始化定時器,中斷模式等 */
/********************************************************************/
void Main_Initlization( void ) /*主初始化程序*/
{
TMOD = 0x19; /* 定時器1用于PWM 定時,定時器0用于遙控信號解碼*/
TCON = 0x55; /* 啟動兩個定時器,外部中斷模式為下降沿*/
TH1 = 0xF9; /* PWM 調節步長*/
TL1 = 0x7D;
TH0 = 0x00; /* 定時設置,最長約80ms, 24MHz晶振*/
TL0 = 0x00;
IE = 0x8F; /* 開放中斷:INT0-遙控解碼,INT1-10ms中斷,T0-遙控解碼, T1-PWM 發生*/
IP = 0x0C; /* 10ms外部中斷優先級最高*/
}
/********************************************************************/
/* 外部中斷0服務程序( 遙控解碼) */
/********************************************************************/
/* 解碼輸出在RS_DECODE,標志為RS_DECODE_OK,首次按鍵為Fresh_KEY_Flag */
void Interrupt_INT0( void ) interrupt 0
{
/* 搜索幀頭,幀尾,數據*/
/* 00 22數據為幀頭*/
/* 00 03為數據0,00 0C為數據1*/
/* 01 38為幀尾*/
/* 00 11, 02 F1為重復標志*/
bit Error_Flag;
switch( TH0 )
{
case 0x02: /* 數據0 */
case 0x03:
case 0x04: if( RS_High == 0 )
{
RS_CODE.FULL_KEY <<= 1;
RS_Index ++;
}
else
RS_Index = 0;
break;
case 0x0B: /* 數據1 */
case 0x0C:
case 0x0D: if( RS_High == 0 )
{
RS_CODE.FULL_KEY <<= 1;
RS_CODE.FULL_KEY ++;
RS_Index ++;
}
else
RS_Index = 0;
break;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -