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

📄 kongwen.c

📁 对8051cf020的温度控制和液晶显示急串口上传的代码
💻 C
📖 第 1 页 / 共 4 页
字号:
   lcd_en1_lach=1; 
   delay_time(10);  
   P7=0x04;             //7   6   5   4
   delay_time(10);
   lcd_en1_lach=0;   
}

void set_point_cmd(unsigned char id,unsigned char s)
{
   lcd_data1_cmd=0;    //command     rs
   lcd_r1w=0;          //data write  rw
   delay_time(10);
   lcd_en1_lach=1; 
   delay_time(10);  
   P7=4+id*2+s;             //7   6   5   4
   delay_time(10);
   lcd_en1_lach=0;   
}

void lcd_swich(unsigned char d,unsigned char c,unsigned char b)//D=1;整体显示ON     C=1;游标ON     B=1;游标位置ON  后3位
{
   lcd_data1_cmd=0;    //command     rs
   lcd_r1w=0;          //data write  rw
   delay_time(10);
   lcd_en1_lach=1;
   delay_time(2);
   P7=8+d*4+c*2+b;
   delay_time(10);
   lcd_en1_lach=0;   
}
void lcd_cursor_dis(unsigned char sc,unsigned char rl)//设定游标的移动与显示的移位控制位元;这个指令并不改变DDRAM的内容
{
   lcd_data1_cmd=0;    //command     rs
   lcd_r1w=0;          //data write  rw
   delay_time(10);
   lcd_en1_lach=1;   
   delay_time(10);
   P7=16+sc*8+rl*4;            //8   4   0
   delay_time(10);
   lcd_en1_lach=0;   
}

void cmd_set(unsigned char aa)//功能:DL=1(必须设为1)   RE=1;扩充指令集动作    RE=0:基本指令集动作
{
   lcd_data1_cmd=0;    //command     rs
   lcd_r1w=0;          //data write  rw
   delay_time(10);
   lcd_en1_lach=1;  
   delay_time(10);
   if(aa)
      {
	     P7=0x34;
	  }
   else
      {
	     P7=0x30;
	  } 
   delay_time(10);
   lcd_en1_lach=0;   
}

void set_cgram(unsigned char address)//功能:设定CGRAM位址到位址计数器(AC)
{
   lcd_data1_cmd=0;    //command     rs
   lcd_r1w=0;          //data write  rw
   delay_time(10);
   lcd_en1_lach=1;   
   delay_time(10);   
   P7=(64+address);            
   delay_time(10);
   lcd_en1_lach=0;   
}

void set_ddram(unsigned char address)//设定DDRAM地址到地址计数器(AC)
{
   lcd_data1_cmd=0;    //command     rs
   lcd_r1w=0;          //data write  rw
   delay_time(10);
   lcd_en1_lach=1;  
   delay_time(10);    
   P7=address;            
   delay_time(10);
   lcd_en1_lach=0;   
}

unsigned char read_busy_flag(void)//功能:读取忙碌状态(BF)可以确认内部动作是否完成
{
   unsigned char temp=0;
   lcd_data1_cmd=0;    //command     rs
   lcd_r1w=1;          //data write  rw
   delay_time(10);
   lcd_en1_lach=1;   
   delay_time(10);   
   temp=P7;           
   delay_time(10);
   lcd_en1_lach=0;  
   if((temp&0x80)==0x80)//功能:读取忙碌状态(BF)可以确认内部动作是否完成,
      {
	      return 1;
	  }
   else
      {
	      return 0;
	  }    
}

unsigned char read_add_count(void)//读取同时可以读出位址计数器(AC)的值
{
   unsigned char temp=0;
   lcd_data1_cmd=0;    //command     rs
   lcd_r1w=1;          //data write  rw
   delay_time(10);
   lcd_en1_lach=1;      
   delay_time(10);
   temp=P7;            
   delay_time(10);
   lcd_en1_lach=0;  
   temp=temp&0x7f;
   return temp;  
}

void write_ram(unsigned char temp_data)//写入资料到内部的RAM(DDRAM/CGRAM/IRAM/GDRAM)
{
   lcd_data1_cmd=1;    //command     rs
   lcd_r1w=0;          //data write  rw
   delay_time(10);
   lcd_en1_lach=1;  
   delay_time(10);    
   P7=temp_data;           
   delay_time(10);
   lcd_en1_lach=0;   
}

unsigned char read_ram(void)//从内部RAM读取资料(DDRAM/CGRAM/IRAM/GDRAM)
{
   unsigned char temp_data=0;
   lcd_data1_cmd=1;    //command     rs
   lcd_r1w=1;          //data write  rw
   delay_time(10);
   lcd_en1_lach=1;  
   delay_time(10);    
   temp_data=P7;            
   delay_time(10);
   lcd_en1_lach=0;  
   return temp_data; 
}

void wait_order(void) //将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H"
{
   lcd_data1_cmd=0;    //command     rs
   lcd_r1w=0;          //data write  rw
   delay_time(10);
   lcd_en1_lach=1;  
   delay_time(10);    
   P7=0x01;            
   delay_time(10);
   lcd_en1_lach=0;
}

void irram_curl(unsigned char temp)//SR=1:SR=0:
{
   lcd_data1_cmd=0;    //command     rs
   lcd_r1w=0;          //data write  rw
   delay_time(10);
   lcd_en1_lach=1;  
   delay_time(10); 
   if(temp)//功能:读取忙碌状态(BF)可以确认内部动作是否完成,同时可以读出位址计数器(AC)的值
      {
	      P7=0x03;           //允许输入垂直卷动地址
	  }
   else
      {
	      P7=0x02;           //允许输入IRAM地址 
	  }    
   delay_time(10);
   lcd_en1_lach=0;  
}

void reverse_video(unsigned char row)//选择4行中的任一行作反白显示,并可决定反白与否
{
   lcd_data1_cmd=0;    //command     rs
   lcd_r1w=0;          //data write  rw
   delay_time(10);
   lcd_en1_lach=1;  
   delay_time(10);    
   P7=(4+row);            
   delay_time(10);
   lcd_en1_lach=0;  
}

void set_shutdowm(unsigned char aa)//SL=1:脱离睡眠模式SL=0:进入睡眠模式
{
   lcd_data1_cmd=0;    //command     rs
   lcd_r1w=0;          //data write  rw
   delay_time(10);
   lcd_en1_lach=1;  
   delay_time(10); 
   if(aa)//
      {
	      P7=0x0c;           //
	  }
   else
      {
	      P7=0x08;           // 
	  }    
   delay_time(10);
   lcd_en1_lach=0;  
}

void expend_cmd(unsigned char re,unsigned char g)//RE=1: 扩充指令集动作RE=0: 基本指令集动作
{
                                                 //G=1 :绘图显示ON       G=0 :绘图显示OFF
   lcd_data1_cmd=0;    //command     rs
   lcd_r1w=0;          //data write  rw
   delay_time(10);
   lcd_en1_lach=1;  
   delay_time(10);   
   P7=48+4*re+g*2;           // 
   delay_time(10);
   lcd_en1_lach=0;  
}

void set_irram_address(unsigned char address)//SR=1:AC5-AC0为垂直卷动地址SR=0:AC3-AC0为ICON IRAM地址
{
   lcd_data1_cmd=0;    //command     rs
   lcd_r1w=0;          //data write  rw
   delay_time(10);
   lcd_en1_lach=1;  
   delay_time(10);   
   P7=64+address;           // 
   delay_time(10);
   lcd_en1_lach=0; 
}

void set_plot_address(unsigned char address)//设定CGRAM地址到地址计数器(AC)
{
   lcd_data1_cmd=0;    //command     rs
   lcd_r1w=0;          //data write  rw
   delay_time(10);
   lcd_en1_lach=1;  
   delay_time(10);   
   P7=128+address;           // 
   delay_time(10);
   lcd_en1_lach=0; 
}

void lcd_init(void)
{
   cmd_set(0);   //选择基本指令

   lcd_clear();
   lcd_bit_add_reset();
   set_point_cmd(1,0);
   lcd_swich(1,1,1);//D=1;整体显示ON     C=1;游标ON     B=1;游标位置ON  后3位

}
void FLASH_ByteWrite (FLADDR addr, char byte, bit SFLE)
{
   bit EA_SAVE = EA;                   // preserve EA
   char xdata * data pwrite;           // FLASH write pointer

   EA = 0;                             // disable interrupts

   pwrite = (char xdata *) addr;

   FLSCL |= 0x01;                      // enable FLASH writes/erases
   PSCTL |= 0x01;                      // PSWE = 1

   if (SFLE) {
      PSCTL |= 0x04;                   // set SFLE
   }

   *pwrite = byte;                     // write the byte

   if (SFLE) {
      PSCTL &= ~0x04;                  // clear SFLE
   }

   PSCTL &= ~0x01;                     // PSWE = 0
   FLSCL &= ~0x01;                     // disable FLASH writes/erases

   EA = EA_SAVE;                       // restore interrupts
}

//-----------------------------------------------------------------------------
// FLASH_ByteRead
//-----------------------------------------------------------------------------
//
// This routine reads a <byte> from the linear FLASH address <addr>.
//
unsigned char FLASH_ByteRead (FLADDR addr, bit SFLE)
{
   bit EA_SAVE = EA;                   // preserve EA
   char code * data pread;             // FLASH read pointer
   unsigned char byte;

   EA = 0;                             // disable interrupts

   pread = (char code *) addr;

   if (SFLE) {
      PSCTL |= 0x04;                   // set SFLE
   }

   byte = *pread;                      // read the byte

   if (SFLE) {
      PSCTL &= ~0x04;                  // clear SFLE
   }

   EA = EA_SAVE;                       // restore interrupts

   return byte;
}

//-----------------------------------------------------------------------------
// FLASH_PageErase
//-----------------------------------------------------------------------------
//
// This routine erases the FLASH page containing the linear FLASH address
// <addr>.
//
void FLASH_PageErase (FLADDR addr, bit SFLE)
{
   bit EA_SAVE = EA;                   // preserve EA
   char xdata * data pwrite;           // FLASH write pointer

   EA = 0;                             // disable interrupts

   pwrite = (char xdata *) addr;

   FLSCL |= 0x01;                      // enable FLASH writes/erases
   PSCTL |= 0x03;                      // PSWE = 1; PSEE = 1

   if (SFLE) {
      PSCTL |= 0x04;                   // set SFLE
   }

   *pwrite = 0;                        // initiate page erase

   if (SFLE) {
      PSCTL &= ~0x04;                  // clear SFLE
   }

   PSCTL &= ~0x03;                     // PSWE = 0; PSEE = 0
   FLSCL &= ~0x01;                     // disable FLASH writes/erases

   EA = EA_SAVE;                       // restore interrupts
}

float get_real_value(unsigned char temp)
{
   unsigned char i=0;
   for(i=0;i<temp;i++)
     {
	    real_value[0]=get_voltage();
	    real_value[1]=real_value[1]+real_value[0]/(temp);
	 }
}


float get_real_res(unsigned char temp)
{
   unsigned char i=0;
   for(i=0;i<temp;i++)
     {
	    real_value[0]=get_bo_res();
	    real_value[1]=real_value[1]+real_value[0]/(temp);
	 }
   return real_value[1];
}


float get_real_res_value(unsigned int temp)
{
   unsigned char i=0;
   float xdata res1=0.0,res2=0.0;
   for(i=0;i<temp;i++)
     {
	    res1=get_bo_res();
	    res2=res2+res1;
	 }
   res2=res2/temp;
   return res2;

}

void lcd_display(unsigned char page)
{
   switch(page)
     {
	    case 1:
		   {
		      lcd_clear();

			  set_ddram(0x80);
			  data_tx="    欢迎使用";
			  send_lcd_data(data_tx);
			  set_ddram(0x90);
			  data_tx="  科德威平轧机";
			  send_lcd_data(data_tx);

			  set_ddram(0x88);
			  data_tx="    客服电话";
			  send_lcd_data(data_tx);

			  set_ddram(0x98);
			  data_tx="  13904616864";
			  send_lcd_data(data_tx);
			  lcd_swich(1,0,0);  //D=1;整体显示ON     C=1;游标ON     B=1;游标位置ON  后3位
		   }
		break;
		 case 2:
		   {
		      lcd_clear();

			  set_ddram(0x80);
			  data_tx="  当前控制参数";
			  send_lcd_data(data_tx);
			  set_ddram(0x88);
			  data_tx="  钳口1:200.0 度";
			  send_lcd_data(data_tx);

			  set_ddram(0x98);
			  data_tx="  钳口2:200.0 度";
			  send_lcd_data(data_tx);
			  lcd_swich(1,0,0);  //D=1;整体显示ON     C=1;游标ON     B=1;游标位置ON  后3位
		   }
		break;
	 }

}

void set_v_out(unsigned int voltage)
{
   unsigned long temp_data=0;
   unsigned int temp_dac=0;
   if(voltage<2300)
      {
	     temp_data=(unsigned long)voltage*836/1000;
	  }
   else if(voltage<=3200)
      {
	     temp_data=(unsigned long)voltage*1195/1000-812;
	  }
   else
      {
	     temp_data=(unsigned long)voltage*836/1000;
	  }
   
   DAC0=(temp_data<<4);
}

⌨️ 快捷键说明

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