📄 remsio.c
字号:
/**********************************************************************
公司名: 广州强智数码科技有限公司
文件名: FM100.c
设计者: 王健强
开始日: 2005-12-20 12:19
完成日: 2006-2-7 11:49
----------------------------------------------------------------------
MCU stc89c51
Crycle 12MHz
Audio input selector PT2314 ; FM PC MP
2CH Audio Processor PT2314 ; Volume & Tone & Loud
LCD Drive HT1621 ;
A/D LM324 ;
Template DS18B20 ;
Remote transmit HT2222
**********************************************************************/
#define X0_Seq 0
#define T0_Seq 1
#define X1_Seq 2
#define T1_Seq 3
#define T2_Seq 5
#include < reg51.h >
#include < intrins.h>
#include "b.h"
/*************************************************************
Data Define
*************************************************************/
#define uchar unsigned char
#define uint unsigned int
#define BYTE unsigned char
#define WORD unsigned int
#define nop _nop_()
#define True 1
#define False 0
#define High 1
#define Low 0
#define ON 1
#define OFF 0
#define Lcd_On 0x8060
#define Lcd_Off 0x8040
#define Sys_En 0x8020
#define Bais_4 0x8520
#define F_Lcd_X1 0
#define F_Lcd_X2 1
#define F_Lcd_Bal 2
#define F_Lcd_FAD 3
#define F_Lcd_A 4
#define F_Lcd_MP 5
#define F_Lcd_X 6
#define F_Lcd_AM 7
#define F_Lcd_FM 8
#define F_Lcd_P1 9
#define F_Lcd_T 10
#define F_Lcd_X3 11
#define F_Lcd_X4 12
#define F_Lcd_MHZ 13
#define F_Lcd_KHZ 14
#define F_Lcd_AUX 15
#define F_Lcd_COL 16
#define F_Lcd_PC 17
#define LCD_0 0
#define LCD_1 1
#define LCD_2 2
#define LCD_3 3
#define LCD_4 4
#define LCD_5 5
#define LCD_6 6
#define LCD_7 7
#define LCD_8 8
#define LCD_9 9
#define LCD_A 10
#define LCD_B 11
#define LCD_C 12
#define LCD_d 13
#define LCD_E 14
#define LCD_F 15
#define LCD_Space 16
#define LCD_V 17
#define LCD_n 18
#define LCD_o 19
#define LCD_T 20
#define LCD_M 21
#define LCD_P 22
#define LCD_L 23
#define LCD_c 24
#define Dot_A 25
#define Dot_B 26
#define Dot_C 27
#define Dot_D 28
#define Dot_E 29
#define Dot_F 30
#define Dot_G 31
#define No_Key 0
#define Key_In 0x0c
#define Key_Mute 0x0a
#define Key_Ch_Dn 0x09
#define Key_Ch_Up 0x11
#define Key_Vol_Dn 0x12
#define Key_Vol_Up 0x14
/*************************************************************
P0
*************************************************************/
sbit P_DO72130 = P0^0;
sbit P_CLK72130 = P0^1;
sbit P_DI72130 = P0^2;
sbit P_CE72130 = P0^3;
sbit P_SDA = P0^4;
sbit P_SCK = P0^5;
sbit P_AD_Ctrl = P0^6;
sbit P_LoudLed = P0^7;
/*************************************************************
P2
*************************************************************/
sbit P_RedLed = P2^7;
sbit P_GreenLed = P2^6;
sbit P_BlueLed = P2^5;
/*************************************************************
P1
*************************************************************/
sbit P_18B20 = P1^4;
/*************************************************************
P3
*************************************************************/
sbit P_ADIn = P3^2;
sbit P_Remote = P3^3;
sbit P_Cs1621 = P3^4;
sbit P_Clk1621 = P3^5;
sbit P_Dat1621 = P3^6;
sbit P_Buzz = P3^7;
/*************************************************************
bdata max16 bytes ( 20h-3fh )
*************************************************************/
bit F_Key_In ; // Key flag
bit F_RemAdr ;
/*************************************************************
data max24+80=104 bytes ( 08h-1fh & 30h-7fh )
*************************************************************/
uchar data Disp_Buf0[8];
uchar data Disp_Char_Buf[4];
BYTE Rem_Buf[4] ;
uchar data Key_Tmp ;
uchar data Key_Code ;
/******************************************
; Delay
******************************************/
void Delay_10us(void)
{
nop ;
nop ;
nop ;
nop ;
nop ;
nop ;
}
//-----------------------------------------
void Delay_100us(uchar count)
{
uchar i=0 ;
uchar j=0 ;
for (i=0;i<count;i++)
{
for (j=0;j<10;j++)
{
nop ;
nop ;
nop ;
nop ;
nop ;
nop ;
}
}
}
//-----------------------------------------
void Delay_ms(uchar count)
{
uchar i=0 ;
uchar j=0 ;
for (i=0;i<count;i++)
{
for (j=0;j<78;j++)
{
Delay_10us() ;
}
}
}
uchar code Char_Word_Tab[]=
{
/*BAegf_xxxx,Bdcba_xxXx,*/
B0101_0000,B1111_0000,//0 LCD_0 0
B0000_0000,B0110_0000,//1 LCD_1 1
B0110_0000,B1011_0000,//2 LCD_2 2
B0010_0000,B1111_0000,//3 LCD_3 3
B0011_0000,B0110_0000,//4 LCD_4 4
B0011_0000,B1101_0000,//5 LCD_5 5
B0111_0000,B1101_0000,//6 LCD_6 6
B0000_0000,B0111_0000,//7 LCD_7 7
B0111_0000,B1111_0000,//8 LCD_8 8
B0011_0000,B1111_0000,//9 LCD_9 9
B0111_0000,B0111_0000,//A LCD_A 10
B0010_0000,B1111_0010,//B LCD_B 11
B0101_0000,B1001_0000,//C LCD_C 12
B0110_0000,B1110_0000,//D LCD_D 13
B0111_0000,B1001_0000,//E LCD_E 14
B0111_0000,B0001_0000,//F LCD_F 15
/*BAegf_xxxx,Bdcba_xxXx,*/
B0000_0000,B0000_0000,//space LCD_Space 16
B0101_0000,B1110_0000,//U/V LCD_V 17
B0101_0000,B0111_0000,//- LCD_n 18
B0110_0000,B1100_0000,//o LCD_o 19
B0000_0000,B0001_0010,//T LCD_T 20
B0101_0000,B0111_0010,//M LCD_M 21
B0111_0000,B0011_0000,//P LCD_P 22
B0101_0000,B1000_0000,//L LCD_L 23
B0110_0000,B1000_0000,//c LCD_c 24
/*BAegf_xxxx,Bdcba_xxXx,*/
B0000_0000,B0001_0000,//- Dot_A 25
B0000_0000,B0010_0000,//- Dot_B 26
B0000_0000,B0100_0000,//- Dot_C 27
B0000_0000,B1000_0000,//- Dot_D 28
B0100_0000,B0000_0000,//- Dot_E 29
B0001_0000,B0000_0000,//- Dot_F 30
B0010_0000,B0000_0000,//- Dot_G 31
};
uchar code Char_Byte_Tab[]=
{
/*Bdcba_xegf*/
B1111_0101,//0 LCD_0 0
B0110_0000,//1 LCD_1 1
B1011_0110,//2 LCD_2 2
B1111_0010,//3 LCD_3 3
B0110_0011,//4 LCD_4 4
B1101_0011,//5 LCD_5 5
B1101_0111,//6 LCD_6 6
B0111_0000,//7 LCD_7 7
B1111_0111,//8 LCD_8 8
B1111_0011,//9 LCD_9 9
B0111_0111,//A LCD_A 10
B1100_0111,//b LCD_B 11
B1001_0101,//C LCD_C 12
B1110_0110,//d LCD_d 13
B1001_0111,//e LCD_E 14
B0001_0111,//f LCD_F 15
/*Bdcba_xegf*/
B0000_0000,//space LCD_Space 16
B1110_0101,//U/V LCD_V 17
B0111_0101,//- LCD_n 18
B1100_0110,//b LCD_b 19
B0000_0010,//- LCD_T 20
B0000_0010,//- LCD_M 21
B0011_0111,//P LCD_P 22
B1000_0101,//u LCD_L 23
B1000_0110,//c LCD_c 24
/*Bdcba_xegf*/
B0001_0000,//- Dot_A 25
B0010_0000,//- Dot_B 26
B0100_0000,//- Dot_C 27
B1000_0000,//- Dot_D 28
B0000_0100,//- Dot_E 29
B0000_0001,//- Dot_F 30
B0000_0010,//- Dot_G 31
};
uchar code Lcd_Flag_Tab[][2]=
{// Buf(n),dot
0, B0000_0001, // LCD_Flag_X1 0
0, B0000_0010, // LCD_Flag_X2 1
0, B0000_0100, // LCD_Flag_Bal 2
0, B0000_1000, // LCD_Flag_FAD 3
0, B1000_0000, // LCD_Flag_A 4
1, B0000_0001, // LCD_Flag_MP 5
1, B0000_0010, // LCD_Flag_X 6
1, B0000_0100, // LCD_Flag_AM 7
1, B0000_1000, // LCD_Flag_FM 8
3, B0000_1000, // LCD_Flag_P1 9
4, B0000_1000, // LCD_Flag_T 10
5, B0000_0001, // LCD_Flag_X3 11
5, B0000_0010, // LCD_Flag_X4 12
5, B0000_0100, // LCD_Flag_MHZ 13
5, B0000_1000, // LCD_Flag_KHZ 14
6, B0001_0000, // LCD_Flag_AUX 15
6, B0010_0000, // LCD_Flag_COL 16
6, B0100_0000, // LCD_Flag_PC 17
};
/************************************************
Ht1621驱动程序(24C128/PTC2323/Pt2314)
************************************************/
void Lcd_Command( uint Command )
{
uchar i;
P_Cs1621 = Low ;
for ( i=0; i<12; i++ )
{
P_Clk1621 = Low ;
if (Command&0x8000)
{
P_Dat1621 = High ;
}
else
{
P_Dat1621 = Low ;
}
P_Clk1621 = High ;
Command <<= 1;
}
P_Cs1621 = High ;
}
/************************************************/
void Lcd_Write_Head(void)
{
P_Dat1621 = High ;
nop ;
P_Clk1621 = Low ;
nop ;
P_Clk1621 = High ;
nop ;
P_Dat1621 = Low ;
nop ;
P_Clk1621 = Low ;
nop ;
P_Clk1621 = High ;
nop ;
P_Dat1621 = High ;
nop ;
P_Clk1621 = Low ;
nop ;
P_Clk1621 = High ;
}
/************************************************/
void WriteHt1621( uchar Addr_Tmp,uchar Data_Tmp )
{
uchar i ;
P_Cs1621 = Low ;
Lcd_Write_Head() ;
for (i=0;i<6;i++)
{ // set offset address
P_Clk1621 = Low ;
if (Addr_Tmp&0x20)
{
P_Dat1621 = High ;
}
else
{
P_Dat1621 = Low;
}
P_Clk1621 = High;
Addr_Tmp <<= 1 ;
}
for (i=0;i<8;i++)
{ // data output
P_Clk1621 = Low ;
if ( Data_Tmp&0x01 )
{
P_Dat1621 = High ;
}
else
{
P_Dat1621 = Low ;
}
P_Clk1621 = High ;
Data_Tmp >>= 1 ;
}
P_Cs1621 = High ;
}
/************************************************/
void Update_Disp( void )
{
uchar i;
for ( i=0;i<8;i++ )
{
WriteHt1621( (15+i*2),Disp_Buf0[i] );
Disp_Buf0[i] = 0 ;
}
}
/************************************************/
void Lcd_Initial( void)
{
Lcd_Command( Lcd_On ) ;
Lcd_Command( Sys_En ) ;
Lcd_Command( Bais_4 ) ;
Update_Disp() ;
}
/************************************************/
void Make_Flag_Data( uchar LCD_Flag )
{
Disp_Buf0[ Lcd_Flag_Tab[(LCD_Flag)][0] ] |= Lcd_Flag_Tab[(LCD_Flag)][1] ;
}
/************************************************/
void Make_Char_Data( void )
{
uchar i,Tmp;
for ( i = 0; i < 4; i++ )
{
Tmp = Disp_Char_Buf[i];
if ( i )
{
Disp_Buf0[i+1] = Char_Byte_Tab[Tmp] ;
}
else
{
Tmp <<= 1;
Disp_Buf0[0] = Char_Word_Tab[Tmp] ;
Disp_Buf0[1] = Char_Word_Tab[Tmp+1];
}
}
}
/************************************************/
void send_one_byte( uchar send_data )
{
TI =False;
SBUF = send_data;
while( TI==0 );
TI =False;
}
/*************************************
9600bps
**************************************/
void Uart_Initial( void )
{
TMOD = 0x22; // 定时器工作方式2
SCON = 0x50; // 串口工作方式1
TL1 = 243 ; // 波特率=(1/32)*(12M*/12)*(1/(256-TL)==> TL=256-(1M/(波特率*32))
TH1 = 243 ; // 波特率=2400bps
TR1 = 1 ; // 启动定时器记数
EA = 1 ; // 允许中断
}
/************************************************/
void CharDisplay( void )
{
if (F_Key_In)
{
P_Buzz = Low ;
Delay_ms(100) ;
P_Buzz = High;
F_Key_In = OFF ;
switch(Key_Code)
{
case Key_In:
Disp_Char_Buf[0] = Rem_Buf[0]/16 ;
Disp_Char_Buf[1] = Rem_Buf[0]&0x0f ;
Disp_Char_Buf[2] = Rem_Buf[1]/16 ;
Disp_Char_Buf[3] = Rem_Buf[1]&0x0f ;
send_one_byte(Rem_Buf[0]) ;
send_one_byte(Rem_Buf[1]) ;
break ;
default:
Disp_Char_Buf[0] = Rem_Buf[2]/16 ;
Disp_Char_Buf[1] = Rem_Buf[2]&0x0f ;
Disp_Char_Buf[2] = Rem_Buf[3]/16 ;
Disp_Char_Buf[3] = Rem_Buf[3]&0x0f ;
send_one_byte(Rem_Buf[2]) ;
send_one_byte(Rem_Buf[3]) ;
break ;
}
}
Make_Char_Data();
}
/************************************************/
void Rem6222_Scan( void )
{
BYTE i ;
BYTE j ;
P_Remote = High ;
if (P_Remote==Low)
{
while (P_Remote==Low) ; // 等待9ms低电平变高
i = 0 ;
do
{
Delay_100us(6) ;
i++ ;
} while (P_Remote&&i<9) ; // 等待4.5ms高电平变低
if (i!=8)
{ // <4.2ms或>4.8ms则退出
return ;
}
for (j=0;j<4;j++)
{
Rem_Buf[j] = 0 ;
for ( i=0; i<8; i++ )
{
Rem_Buf[j] >>= 1 ;
while (P_Remote==Low); // 等待低电平变高
Delay_100us(6) ; // 延时0.6ms
if (P_Remote)
{ // 如果P_Remote为高,则
Delay_100us(6) ; // 延时0.6ms
while (P_Remote) ; // 等待高电平变低
Rem_Buf[j] |= 0x80 ; // 电平为“1”
}
}
}
F_Key_In = ON ;
Key_Code=No_Key ;
}
}
/****************************************************************
//sbit PI_KEY_1 = P2^0 ;
//sbit PI_KEY_2 = P2^1 ;
//sbit PI_KEY_3 = P2^2 ;
//sbit PO_KEY_1 = P2^3 ;
//sbit PO_KEY_2 = P2^4 ;
****************************************************************/
void Key_Scan( void )
{
uchar row_key_val ;
P2 &= B1110_0111 ;
Delay_10us() ;
row_key_val = P2&B0000_0111 ; // row key
P2 |= B0001_1111 ; // reset
P2 &= B1111_1000 ;
Delay_10us() ;
Key_Tmp = P2&B0001_1000 ; // line key
P2 |= B0001_1111 ; // reset
Key_Tmp |= row_key_val ;
Key_Tmp =~ Key_Tmp ;
Key_Tmp &= B0001_1111 ;
if (Key_Tmp!=No_Key&&Key_Code!=Key_Tmp)
{
F_Key_In = ON ;
Key_Code=Key_Tmp ;
}
}
/************************************************/
void main( void )
{
Uart_Initial() ;
Lcd_Initial() ;
P_RedLed = Low ;
P_GreenLed = Low ;
P_BlueLed = Low ;
Disp_Char_Buf[0] = 6 ;
Disp_Char_Buf[1] = 2 ;
Disp_Char_Buf[2] = 2 ;
Disp_Char_Buf[3] = 2 ;
send_one_byte(0x62) ;
send_one_byte(0x22) ;
Make_Char_Data();
while( 1 )
{
Key_Scan() ;
Rem6222_Scan() ;
CharDisplay() ;
Update_Disp() ;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -