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

📄 st_rgb122x32.c

📁 无线传输C51主程序(基于NFR905)
💻 C
字号:
#include<STC58RD.H>
//#include<REGX52.h>
//#include "reg52.h"
#include <intrins.h>
#include "nRF905.H"
#include "absacc.h"
#include "head.h"
//#include "led.C"
#define uchar unsigned char
#define uint unsigned int
/******************************************************
                       延时函数
*******************************************************/

void Send_905(uchar addr,uchar *BUF);
void Display_Menu_1(void);


void delay_1ms(uint times)//delay  1 ms,for 12MHZ
{ uchar i;
  while(times--)
   for(i=0;i<121;i++) ;
    {_nop_();}
}

void delay_60ms(int i)
{
 while(i--)
  {if(Cls_stype) break;
	 Display_Menu_1();
   }
}
void Display_Menu_1(void)
{ uchar i;
  Xiaoguo=Sys_info[0];
  //speed=Speed_;
  tx_type=Tx_type_;
  if(Cls_stype){cls();Cls_stype=0;}
  Pintf_8x16(0,2,8,10);//(
  Pintf_8x16(0,2,98,11);//)
  for(i=0;i<4;i++)
   { Pintf_12x16(0,2,33+i*13,((Xiaoguo-1)%5)*4+9+i);} //当前显示模式
  Pintf_8x8(0,2,114,10+(tx_type%2));//通信标志 0:无线  1:485
  Pintf_8x8(0,1,0,14+OK_key);//菜单标志

  Pintf_8x16(0,0,16,10);//(
  Pintf_8x16(0,0,90,11);//)
  Pintf_12x16(0,0,36,3);//速
  Pintf_12x16(0,0,49,4);//度
  Pintf_12x16(0,0,62,0);//:
  Pintf_8x16(0,0,75,speed%10);//

  }

void Display_Menu_2(void)
{ uchar i;
  //type_num=Type_num_;
  if(Key2_down){++type_num;Key2_down=0;}
  if(Key3_down){--type_num;Key3_down=0;}
  if(type_num>5)type_num=1;
  if(type_num<1)type_num=5;
  if(Key1_down)
   {Key1_down=0;
     if((Type_Flag[type_num]&0x80)==0x80)Type_Flag[type_num] &= 0x7f;
	  else Type_Flag[type_num] |= 0x80;
   }
 if(Cls_stype){cls();Cls_stype=0;}
  Pintf_8x8(0,2,114,10+(Tx_type_%2));//通信标志 0:无线  1:485
  Pintf_8x8(0,1,0,14+OK_key);//菜单标志
  Pintf_8x16(0,2,8,10);//(
  Pintf_8x16(0,2,16,type_num/10);//效果的序号
  Pintf_8x16(0,2,24,type_num%10);
  if((Type_Flag[type_num]&0x80)==0x80)Pintf_8x8(0,2,87,23);//√
    else Pintf_8x8(0,2,87,24);
  Pintf_8x16(0,2,98,11);//)
  for(i=0;i<4;i++)
    {Pintf_12x16(0,2,33+i*13,(type_num-1)*4+9+i); } //效果选择
  Pintf_8x8(0,1,38,4);//key3 左箭头
  Pintf_8x8(0,1,76,5);//key2 右箭头
  Pintf_8x8(0,1,114,8);//OK 确认存储

}

void Display_Menu_3(void)
{
 // speed=Speed_;
  if(Key3_down){++speed;Key3_down=0;}
  if(Key2_down){--speed;Key2_down=0;}
  if(speed>9)speed=1;
  if(speed<1)speed=9;
  if(Key1_down){Key1_down=0;Speed_= speed;Sys_info[1]=speed;}
  if(Cls_stype){cls();Cls_stype=0;}
  Pintf_8x8(0,2,114,10+(Tx_type_%2));//通信标志 0:无线  1:485
  Pintf_8x8(0,1,0,14+OK_key);//菜单标志
  Pintf_8x16(0,2,16,10);//(
  Pintf_8x16(0,2,90,11);//)
  Pintf_12x16(0,2,36,3);//速
  Pintf_12x16(0,2,49,4);//度
  Pintf_12x16(0,2,62,0);//:
  Pintf_8x16(0,2,75,speed);//
  Pintf_8x8(0,1,38,2);//上箭头
  Pintf_8x8(0,1,76,3);//下箭头
  Pintf_8x8(0,1,114,8);//OK
}

void Display_Menu_4(void)
{ uchar i;
  //tx_type=Tx_type_;
  if(Key2_down)
    { Key2_down=0;	tx_type++;}
  if(Key1_down){Key1_down=0;Tx_type_= tx_type%2;Sys_info[2]=tx_type%2;}
  if(Cls_stype){cls();Cls_stype=0;}
  Pintf_8x8(0,1,0,14+OK_key);//菜单标志
  for(i=0;i<4;i++)
   { Pintf_12x16(0,2,i*13,5+i); } //通信方式
  Pintf_8x16(0,2,52,10);//(
  Pintf_8x16(0,2,114,11);//)

  if(tx_type%2)
      { for(i=0;i<4;i++)
	    {Pintf_12x16(0,2,60+i*12,29+i);  //无线传输
        }
      }
     else{Pintf_8x16(0,2,60,4);//4
          Pintf_8x16(0,2,68,8);//8
          Pintf_8x16(0,2,76,5);//5
          Pintf_12x16(0,2,84,31);//传
		  Pintf_12x16(0,2,96,32);//输
		 }
  Pintf_8x8(0,1,76,21);//上下箭头
  Pintf_8x8(0,1,114,8);//OK
}


void Display_Menu_5(void)
{uchar i;
  if(Key3_down){++Floor_High;Key3_down=0;}
  if(Key2_down){--Floor_High;Key2_down=0;}
  if(Floor_High>30)Floor_High=1;
  if(Floor_High<1)Floor_High=30;
  if(Key1_down){Key1_down=0;FLOOR_HIGH_ = Floor_High;Sys_info[3]=Floor_High;}

  if(Cls_stype){cls();Cls_stype=0;}
  Pintf_8x8(0,2,114,10+Tx_type_);//通信标志 0:无线  1:485
  Pintf_8x8(0,1,0,14+OK_key);//菜单标志
  Pintf_8x16(0,2,8,10);//(
  Pintf_8x16(0,2,105,11);//)
  for(i=0;i<5;i++){ Pintf_12x16(0,2,16+i*12,33+i);}//楼层数设置
  Pintf_12x16(0,2,76,0);//:
  Pintf_8x16(0,2,89,Floor_High/10);//十位
  Pintf_8x16(0,2,97,Floor_High%10);//个位
  Pintf_8x8(0,1,38,2);//上箭头
  Pintf_8x8(0,1,76,3);//下箭头
  Pintf_8x8(0,1,114,8);//OK
}

void Display_Menu_6(void)
{
  if(Key3_down){++times;Key3_down=0;}
  if(Key2_down){--times;Key2_down=0;}
  if(times>60)times=1;if(times<1)times=60;
  if(Key1_down){Key1_down=0;Times_= times;Sys_info[4]= times;}
  if(Cls_stype){cls();Cls_stype=0;}
  Pintf_8x8(0,2,114,10+Tx_type_);//通信标志 0:无线  1:485
  Pintf_8x8(0,1,0,14+OK_key);//菜单标志
  Pintf_8x16(0,2,16,10);//(
  Pintf_8x16(0,2,96,11);//)
  Pintf_12x16(0,2,28,38);//间
  Pintf_12x16(0,2,41,39);//隔
  Pintf_12x16(0,2,54,0);//:
  Pintf_8x16(0,2,67,times/10);//
  Pintf_8x16(0,2,75,times%10);//
  Pintf_12x16(0,2,83,40);//秒
  Pintf_8x8(0,1,38,2);//上箭头
  Pintf_8x8(0,1,76,3);//下箭头
  Pintf_8x8(0,1,114,8);//OK

}


/*************************************************************************************
                                    固有效果
**************************************************************************************/
void Display_Mode_1(void)//单色往上跑
{ uchar Color,i;
	for(Color=0;Color<7;Color++)
	 for(i=0;i<FLOOR_HIGH_;i++)
	  {nF905_Send_buf[0]=((color[Color]>>0)&0x01)*255;
	   nF905_Send_buf[1]=((color[Color]>>1)&0x01)*255;
	   nF905_Send_buf[1]=((color[Color]>>2)&0x01)*255;
	   Send_905(i,nF905_Send_buf);
	   delay_1ms(Speed_*120);
	  }
     // delay_1ms(Times_*1000);
}

void Display_Mode_2(void)
{;}


void Display_(void)
{uchar i,j;
  for(i=1;i<6;i++)
	{if((Type_Flag[i]&0x80)==0x80)
	 if(Tx_type_)		 //
       { 
       switch(i)
	    { case 5: Sys_info[0]=i;break;
		  case 1: Sys_info[0]=i;break;
		  case 2: Sys_info[0]=i;break;
		  case 3: Sys_info[0]=i;break;
	  	  case 4: Sys_info[0]=i;break;
	      default: break;
	    }
	    nF905_Send_buf[0]=(color[i]&0x01)*255;nF905_Send_buf[1]=((color[i]>>1)&0x01)*255;nF905_Send_buf[2]=((color[i]>>2)&0x01)*255;
	  for(j=0;j<FLOOR_HIGH_;j++)
	    { Send_905(j+1,nF905_Send_buf);//delay_60ms((Times_*1000)/50);//delay2(50);
		}	
	delay_60ms((Times_*1000)/50);  		 
	  }
      else 
      { 
	      for(j=0;j<5;j++)	      
	       {          
		    Sys_info[0]=i;
			send_addr(0x01);
            sndchar(0xaa);
            sndchar((color[i]&0x01)*255);
            sndchar(((color[i]>>1)&0x01)*255);
            sndchar(((color[i]>>2)&0x01)*255);
            sndchar(0);
            delay_60ms((Times_*1000)/50);
      /*     if(Received_Flag)
		   { Received_Flag=0;
			 Pintf_8x16(0,0,76,temp[1]/100);
		     Pintf_8x16(0,0,84,temp[1]%100/10);
             Pintf_8x16(0,0,92,temp[1]%10);
		     Pintf_8x16(0,0,100,(temp[2]&0xf0)>>4);
			 Pintf_8x16(0,0,108,(temp[2]&0x0f));
		     temp[2]=0;temp[1]=0;
			 break;
			}*/
			if(Send_ok==1){Send_ok=0;break;}         
		 }
		 Send_ok=0;
     }	
  }
}



void ISP_IAP_enable(void)
{
	EA	=	0;	/* 关中断 */
	ISP_CONTR	=	ISP_CONTR & 0x18;       /* 0001,1000 */
	ISP_CONTR	=	ISP_CONTR | WAIT_TIME;
	ISP_CONTR	=	ISP_CONTR | 0x80;       /* 1000,0000 */
}
/* 关闭 ISP,IAP 功能 */
void ISP_IAP_disable(void)
{
	ISP_CONTR	=	ISP_CONTR & 0x7f;	/* 0111,1111 */
	ISP_TRIG	=	0x00;
	EA			=   1;                	/* 开中断 */
}
/* 写一个扇区-------写数据进 数据Flash存储器, 只在同一个扇区内写,不保留原有数据	*/
/* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源	*/
void write_flash_in_one_sector(uint begin_addr, uint counter, uchar array[])
{
	uint	i	=	0;
	uint	sector_addr	=	0;
    /* 擦除 要修改/写入 的扇区 */
	sector_addr	=	(begin_addr & 0xfe00);	/* 1111,1110,0000,0000; 取扇区地址 */
	ISP_ADDRH	=	(uchar)(sector_addr >> 8);
	ISP_ADDRL	=	0x00;
	ISP_CMD		=	ISP_CMD	&	0xf8;		/* 1111,1000 */
	ISP_CMD		=	ISP_CMD	|	SECTOR_ERASE_AP_and_Data_Memory_Command;	/* 0000,0011 */
	ISP_IAP_enable();
	ISP_TRIG	=	0x46;        /* 触发ISP_IAP命令 */
	ISP_TRIG	=	0xb9;        /* 触发ISP_IAP命令 */
	_nop_();

	for(i = 0; i< counter; i++)
	{
		/* 写一个字节 */
		ISP_ADDRH	=	(uchar)(begin_addr >> 8);
		ISP_ADDRL	=	(uchar)(begin_addr & 0x00ff);
		ISP_DATA	=	array[i];
		ISP_CMD		=	ISP_CMD	&	0xf8;	/* 1111,1000 */
		ISP_CMD		=	ISP_CMD	|	PROGRAM_AP_and_Data_Memory_Command;		/* 0000,0010 */
		ISP_TRIG	=	0x46;	/* 触发ISP_IAP命令 */
		ISP_TRIG	=	0xb9;	/* 触发ISP_IAP命令 */
		_nop_();
        begin_addr++;
	}
	ISP_IAP_disable();
}
/* 读一个扇区-------从Flash中读出数据, 只在同一个扇区内读,------------------------*/
/* begin_addr,被读数据Flash开始地址;counter,连续读多少个字节; array[],数据存放	*/
void read_flash_in_one_sector(uint begin_addr, uint counter, uchar array[])
{
	uint	i	=	0;
	ISP_IAP_enable();
	for(i = 0; i< counter; i++)
	{
		/* 读一个字节 */
		ISP_ADDRH	=	(uchar)(begin_addr >> 8);
		ISP_ADDRL	=	(uchar)(begin_addr & 0x00ff);
		ISP_DATA	=	0x00;
		ISP_CMD		=	ISP_CMD	&	0xf8;	/* 1111,1000 */
		ISP_CMD     =	ISP_CMD	|	READ_AP_and_Data_Memory_Command;	/* 0000,0001 */
		ISP_TRIG	=	0x46;	/* 触发ISP_IAP命令 */
		ISP_TRIG	=	0xb9;	/* 触发ISP_IAP命令 */
		array[i]	=	ISP_DATA;
		_nop_();
        begin_addr++;
	}
	ISP_IAP_disable();
}
/*****************************************************
                 初始化串口
*******************************************************/
void SYS_Init (void)
 {

      TH1=0xf3;//4800Bit 12MHZ
	  TL1=0xf3;
//TMOD     T/C1-----GATE C/T M1 M0        T/C0-- GATE C/T M1 M0	     
      TMOD=0x02;
   //   TH0=156;
//	  TL0=156; //100 US来一次中断
	  TMOD=0x20;//M0=0;M1=1;//自动从载八位定时器
//IE   EA D6 ET2 ES ET1 EX1 ET0 EX0
	  EX0=1;
	  EX1=1;
	  ES=1;
	//  ET0=1;
	  ET1=0;

//SCON  SM0 SM1 SM2 REN TB8 RB8 TI RI
	  SM0=1;
	  SM1=1;
	  SM2=1;
	  REN=1;
	  TB8=1;
//PCON  SMOD D6 D5 D4 GF1 GF0 PD IDL
	  PCON=0x80;//加倍
//TCON  TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
      IT0=1;//下降沿触发
  
	  //IT1=1;
//IP 中断优先级控制
     IP=0x04;//D7 D6 PT2 PS PT1 PX1 PT0 PX0


      TR1=1;
	  TR0=1;
	  EA=1;
      DE=0;
	  P3=0xff;
	  Key1=0;
	  Key2=0;
	  Key3=0;
	  OK_key=0;
	  Received_Flag=0;
}

void getchar(void)
{uint data cout;
 // unsigned long int  cout;
  DE=0;
 riflag=0;
 for(cout=0;cout<15000;cout++)
    {if(RI==1)
        {riflag=1;
         RI=0;
         break;
        }
    }
}

void sndchar(uchar dats)//reentrant
{uint cout;
  EA=0;
   DE=1;
  SBUF=dats;
  for(cout=0;cout<15000;cout++)
    {if(TI==1)
        {TI=0;break;}
    }
   DE=0;
	EA=1;
}
//////////////////////////////////////////
void send_addr(uchar addr)//reentrant
{uint  count;
  EA=0;
  DE=1;
  TB8=1;
  SBUF=addr;//addr=0x55表示命令,让所有从机启动扫灯程序
    for(count=0;count<15000;count++)
      {if(TI==1)
         {TI=0; break;}
      }
  DE=0;
  TB8=0;
  EA=1;
}
/*****************************************************
                串口中断
*******************************************************/

void serialint(void) interrupt 4 using 3
{uchar idata ir;
// uchar temp[6];
  EA=0;

if(RI)
 {getchar();
   if(riflag==0)
      {SM2=1; EA=1;return;}//Asck(Error);
       temp[0]=SBUF;	   
    if(temp[0]!=0x00)//地址
       {SM2=1; EA=1;return; }//Asck(Error);
    SM2=0;    
    for(ir=0;ir<2;ir++)
       {getchar();
	    if(riflag==0)
           {SM2=1;EA=1; return;}//Asck(Error);
	    temp[ir+1]=SBUF;
	   }     
    if(temp[1]==0xaa)//同步码
     {if(temp[2]==0x66){Send_ok=1;}	 
       else{ Send_ok=0;}    
     }
   //Received_Flag=1;
  EA=1;
 }
EA=1;

}

void Read_nF905(void) interrupt 0 using 1
{
   EA=0;
  if(AM)
   {
    TRX_CE=0;
    TX_EN =0;
    delay2(4);
    SPI_read_some(0x24,Received_buf+18,4);
    while(AM);
    Received_Flag=1;
    TRX_CE=1;
	if(Received_buf[18+1]==0x66){Send905_ok=1;Received_buf[18+1]=0;}
	else {Send905_ok=0;Received_buf[18+1]=0;}
   }
  EA=1;
}

void KEY_INT() interrupt 2 using 2
{ EA=0;
 // P3_3=1;
 delay2(300);
 while(!P3_3);
 OK_key++; 
 if(OK_key>=6)OK_key=0;
 Cls_stype=1; 
 Key3=0;Key2=0;Key1=0;

type_num=Type_num_; 
speed=Sys_info[1]; tx_type=Sys_info[2];Floor_High = Sys_info[3];times=Sys_info[4];
Speed_=Sys_info[1];Tx_type_=Sys_info[2];FLOOR_HIGH_=Sys_info[3];Times_=Sys_info[4];

  EA=1;
}
///////////////////////////////////////////////////////
void Key_service(void)
{//uchar i;
  if(OK_key>0)
   {
   KEY_3=1;
   if(KEY_3==0){delay2(2);while(!KEY_3);Key3_down=1;Key3++;}
     KEY_2=1;
    if(KEY_2==0){delay2(2);while(!KEY_2);Key2_down=1;Key2++;}
	KEY_1=1;
	if(KEY_1==0){delay2(2);while(!KEY_1);Key1_down=1;Key1++;}
   }
}

//////////////////////////////////////////
void Send_905(uchar addr,uchar *BUF)
{   EA=0;
   // InitnRF905();
    TRX_CE=0;
    TX_EN=0;
    SPI_write_some(0x20, BUF,4);
    SPI_addrs(addr);
	TRX_CE=1;
	TX_EN=1;
 //   delay2(5);
	while(DR);
    TX_EN=0;
//	InitnRF905();
	EA=1;
}

/*****************************************************
               主程序
*******************************************************/
main()
{  
    uint aa=0;   
    SYS_Init();
	EA=0;
    InitnRF905();
    LCD_Init();
    cls();
    Display_Flash();

 read_flash_in_one_sector(0x8200,10,Type_Flag);
 read_flash_in_one_sector(0x8100,10,Sys_info );

 speed=Sys_info[1]; tx_type=Sys_info[2];Floor_High = Sys_info[3];times=Sys_info[4];
 Speed_=Sys_info[1];Tx_type_=Sys_info[2];FLOOR_HIGH_=Sys_info[3];Times_=Sys_info[4];

EA=1;
Key1=0;Key2=0;Key3=0;
while(1)
 {// InitnRF905();

//Display_image(&LOG[0],0,0,122,32) ;
if(OK_key==0)
   { Display_Menu_1(); Display_();}
if(OK_key==1)
   Display_Menu_2();
if(OK_key==2)
   Display_Menu_3();
if(OK_key==3)
   Display_Menu_4();
if(OK_key==4)
   Display_Menu_5();
if(OK_key==5)
   Display_Menu_6();


write_flash_in_one_sector(0x8100, 10, Sys_info);
write_flash_in_one_sector(0x8200, 10, Type_Flag);
//if(Received_Flag){ Received_Flag=0;

/*
 TRX_CE=0;
 TX_EN=0;

 SPI_read_some(0x10,Received_buf,10);
 SPI_read_some(0x23,Received_buf+10,4);
 SPI_read_some(0x21,Received_buf+14,4);


 TRX_CE=1;
 TX_EN=0;

 for(i=0;i<22;i++)
 {sndchar(Received_buf[i]);
  Received_buf[i]=0;}
 */



//delay2(100);
}
}

⌨️ 快捷键说明

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