⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 remsio.c

📁 C51 控制红外遥控ht6221驱动芯片 程序间结且调试OK
💻 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 + -