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

📄 main-rec.c

📁 zhx1810 红外通信控制发送
💻 C
字号:
//初始
#include <reg52.h>
//#include <ocm12864.h>
//#include <IO-URAT.h>

//OCM12864参考程序

#define uint       unsigned int
#define uchar      unsigned char
#define disp_off   0x3e
#define disp_on    0x3f
#define disp_x     0xb8		//页	
#define disp_z     0xc0		//行
#define disp_y     0x40		//列
#define comm       0
#define dat        1
#define data_lcd   P0       //MCU P0<------> LCM

sbit di =P2^5;  //Data or Instrument Select,H:写数据,L:写指令
sbit rw =P2^4;  //Write or Read,H:read,L:write
sbit e  =P2^3;  //读写使能
sbit cs2=P2^2;  //cs1=H,选择左半屏
sbit cs1=P2^1;  //cs2=H,选择右半屏
sbit rst=P2^0;  //Lcm reset,低有效
sbit bf =P0^7;
sbit res=P0^4;

void chk_busy (void);

uchar code shuzi[]={		  //数字
/*--  文字:  0  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,

/*--  文字:  1  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,

/*--  文字:  2  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,

/*--  文字:  3  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,

/*--  文字:  4  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,

/*--  文字:  5  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,

/*--  文字:  6  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,

/*--  文字:  7  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,

/*--  文字:  8  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,

/*--  文字:  9  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,
/*--  文字:  A  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,

/*--  文字:  B  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,

/*--  文字:  C  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,

/*--  文字:  D  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,

/*--  文字:  E  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,

/*--  文字:  F  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

};

/*---------------延时子程序----------------*/
void delay (uint us)
{
  while(us--);
}
/*
void delay1 (uint ms)
{
  uint i,j;
  for(i=0;i<ms;i++)
  for(j=0;j<1000;j++)
  ;
}	*/
/*------------写数据或命令到LCD--------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
  chk_busy ();
  di=dat_comm;
  rw=0;
  data_lcd=content;
  e=1;
  ;
  e=0;
}
/*--------------读LCD数据---------------
uchar rd_lcd ()
{
  uchar rddata;
  chk_busy ();
  di=1;
  rw=1;
  e=1;
  ;
  rddata=data_lcd;
  e=0;
  return rddata;
}  */
void chk_busy (void)
{ unsigned char i=0;
  data_lcd=0xff;
  di=0;
  rw=1;
  ;
  e=1;
  while((bf||res==1)&i<=0xc0){i++;};
  e=0;
} 
/*--------------写点阵------------------*/
void lat_disp (uchar data1,uchar data2)
{
  uchar i,j;
  cs1=1;cs2=1;
  wr_lcd (comm,disp_on);
  for(j=0;j<8;j++)
  {
    wr_lcd (comm,disp_x+j);
    wr_lcd (comm,disp_z);
    wr_lcd (comm,disp_y);
    for(i=0;i<32;i++)
    {
      wr_lcd (dat,data1);
      wr_lcd (dat,data2);
    }
  }
}

//选择数组中文字显示
void select_disp (uchar x,uchar y,uchar xl,uchar yl,uchar row_xl,uchar row_yl,const uchar *chn,uchar n)
{
  uchar i,j,k,l;
  uint a;
  wr_lcd (0,disp_on);
  for(l=0;l<row_xl;l++)
  {
    for(k=0;k<row_yl;k++)
    {
      for(j=0;j<xl;j++)
      {
        wr_lcd (0,disp_x+x+l*xl+j);
        wr_lcd (0,disp_z);
        wr_lcd (0,disp_y+y+k*yl);
        a=l*xl*yl*row_yl+k*xl*yl+j*yl+0x10*n;
        for(i=0;i<yl;i++)
          wr_lcd (1,chn[a+i]);
      }
    }
  }
}
/*------------------初始化-----------------*/
void init_lcd (void)
{
  rst=0;
  delay(50);
  rst=1;
  cs1=1;cs2=1;
  wr_lcd (comm,disp_off);
  wr_lcd (comm,disp_on);
  lat_disp(0x00,0x00);	//清屏
}

sbit BT_SND =P1^0;
sbit BT_REC =P1^1;
/**********************************************

IO 口模拟232通讯程序

使用两种方式的C程序 占用定时器0 

**********************************************/
sbit ACC0=   ACC^0;
sbit ACC1=   ACC^1;
sbit ACC2=   ACC^2;
sbit ACC3=   ACC^3;
sbit ACC4=   ACC^4;
sbit ACC5=   ACC^5;
sbit ACC6=   ACC^6;
sbit ACC7=   ACC^7;
sbit SD  =   P1^2;
unsigned char rt=0;
unsigned char rt00=0x00;
unsigned char rt0=0x00;
/*
#define  bound  96		//波特率

unsigned char last=((10000/bound)*13/32)-10;
unsigned char mid=(10000/bound)*3/16-10;
unsigned char first=((10000/bound)*13/32)-10;
unsigned char midd=(10000/bound)-3;

void sixty_three(bit pules)
{
	if(pules)
	{
		BT_SND=0;
		delay(midd);
	}
	else
	{
		BT_SND=0;
		delay(first);
		BT_SND=1;
		delay(mid);
		BT_SND=0;
		delay(last);
	}
}


bit three_sixty(bit pules)
{
	if(pules)
	{
		return 0;
	}
	else
	{	
		return 1;
	}
}
*/

#define MODE_QUICK
#define F_TM F0
#define TIMER0_ENABLE  TL0=TH0; TR0=1;
#define TIMER0_DISABLE TR0=0;

//发送一个字符
void PSendChar(unsigned char inch)
{
	#ifdef MODE_QUICK 
	ACC=inch;

	F_TM=0;
	BT_SND=1; //start bit 
	TIMER0_ENABLE; //启动
	while(!F_TM);

	BT_SND=~ACC0; //先送出低位
	F_TM=0;
	while(!F_TM);

	BT_SND=~ACC1; 
	F_TM=0;
	while(!F_TM);

	BT_SND=~ACC2; 
	F_TM=0;
	while(!F_TM);

	BT_SND=~ACC3; 
	F_TM=0;
	while(!F_TM);

	BT_SND=~ACC4; 
	F_TM=0;
	while(!F_TM);

	BT_SND=~ACC5; 
	F_TM=0;
	while(!F_TM);

	BT_SND=~ACC6; 
	F_TM=0;
	while(!F_TM);

	BT_SND=~ACC7; 
	F_TM=0;
	while(!F_TM);

	BT_SND=0; 
	F_TM=0;
	while(!F_TM);


	TIMER0_DISABLE; //停止timer
	#else
	unsigned char ii;

	ii=0;

	F_TM=0;
	BT_SND=0; //start bit 
	TIMER0_ENABLE; //启动
	while(!F_TM);

	while(ii<8)
	{
		if(inch&1)
		{
			BT_SND=1;
		}
		else
		{
			BT_SND=0;
		}
		F_TM=0;
		while(!F_TM);
		ii++;
		inch>>=1;
	}
	BT_SND=1; 
	F_TM=0;
	while(!F_TM);

	#endif 
	TIMER0_DISABLE; //停止timer
}


//接收一个字符
unsigned char PGetChar()
{
	#ifdef MODE_QUICK 

	TIMER0_ENABLE; 
	F_TM=0;
	while(!F_TM); //等过起始位
	ACC0=~BT_REC;

	TL0=TH0;

	F_TM=0;
	while(!F_TM);
	ACC1=~BT_REC;

	F_TM=0;
	while(!F_TM);
	ACC2=~BT_REC;

	F_TM=0;
	while(!F_TM);
	ACC3=~BT_REC;

	F_TM=0;
	while(!F_TM);
	ACC4=~BT_REC;

	F_TM=0;
	while(!F_TM);
	ACC5=~BT_REC;

	F_TM=0;
	while(!F_TM);
	ACC6=~BT_REC;

	F_TM=0;
	while(!F_TM);
	ACC7=~BT_REC;

	F_TM=0;
	
	while(!F_TM)
	{	
		if(BT_REC)
		{
			break;
		} 
	}
	TIMER0_DISABLE; //停止timer
	return ACC;
	#else
	unsigned char rch,ii;
	TIMER0_ENABLE; 
	F_TM=0;
	ii=0;
	rch=0;
	while(!F_TM); //等过起始位

	while(ii<8)
	{
		rch>>=1;
		if(BT_REC)
		{
			rch|=0x80;
		}
		ii++;
		F_TM=0;
		while(!F_TM);

	}
	F_TM=0;
	while(!F_TM)
	{
		if(BT_REC)
		{		
			break;
		}

	}
	TIMER0_DISABLE; //停止timer
	return rch;

	#endif 

}
//定时器0中断
void IntTimer0() interrupt 1
{
	F_TM=1;
}


//检查是不是有起始位
bit StartBitOn()
{
	return  (BT_REC==0);
}

void InT0() interrupt 0
{	delay(10000);
	rt=0;						
	rt00++;
	if(rt00>=0xf0)
	rt00=0x00;
	while(IE0);	
}

void InT1() interrupt 2
{	delay(10000);
	rt=1;
	rt00++;
	if(rt00>=0xf0)
	rt00=0x00;
	while(IE1);
}

void main()
{
	unsigned char gch,gch1,i=0;

	TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */
	PCON=00;

	TR0=0; //在发送或接收才开始使用
	TF0=0; 
	TH0=(256-96); //9600bps 就是 1000000/9600=104.167微秒 执行的

	//   timer是      104.167*11.0592/12= 96    
	TL0=TH0;
	ET0=1;

	EX0=EX1=1;	 //int0/1中断
	IT0=IT1=0;	  //int电平触发
				 
//	serial_init();
	init_lcd ();
   
   	EA=1;

	cs1=1;cs2=0;
	select_disp(0,16,2,8,1,2,shuzi,1);
	SD=0;
	BT_SND=0;
	BT_REC=1;

	while(1)
	{	 
		if(StartBitOn())
		{	
			gch=PGetChar();
//			gch1=(gch>>4)&0x07;  
			select_disp(4,i+8,2,8,1,1,shuzi,16);
    		select_disp(4,i,2,8,1,1,shuzi,gch);	
//			putchar(gch);
			i+=8;
			if(i>56)
			{	
				i=0;
				cs1=~cs1;cs2=~cs2;
			}
		}
		
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -