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

📄 led.c

📁 基于DsPic30F4011的高精度位置伺服控制系统
💻 C
字号:
/*******************************
数码管显示显示模块程序

***********************************/

extern bit bdata SetHStu_Flag ;		  //湿度设置状态标志位
extern bit bdata SetTStu_Flag ;		  //温度设置状态标志位

/*************************定义全局变量***************************/
unsigned char Led_Show_Data;         //LED显示缓冲区
unsigned char Led_Show_Bit;
unsigned char Nwei_Show = 0;	     //刷新控制寄存器

unsigned char bdata flash_kz;  		 //
sbit Flash_TSetFlag  = flash_kz^0;	 //温度设置闪烁标志位
sbit Flash_HSetFlag  = flash_kz^1;	 //湿度设置闪烁标志位
sbit Flash_InSetFlag = flash_kz^2;	 //进风风速等级设置闪烁标志位
sbit Flash_ExSetFlag = flash_kz^3;	 //出风风速等级设置闪烁标志位
              
bit bdata Led_Flash_Flag=0;          //led闪烁标志判断位(根据此位决定定时时间是否到)

bit bdata Wendu_Sel_Show = 0;	     //温度显示标志位,根据此位决定显示设定值或实测值
bit bdata Shidu_Sel_Show = 0;	     //湿度显示标志位,根据此位决定显示设定值或实测值

bit bdata Heater_Flag = 0;
             					  
unsigned char led_show_buf[LED_IN_USE];      //显示缓冲区,对应每一位
unsigned char zancun[LED_IN_USE];
/**********************************************************
名称:show_delay()
***********************************************************/
void led_delay(unsigned int i)
{
   while(i)
   {i--;}
}
/****************************************************************
名称:init_led
描述:led初始化子程序
***************************************************************/
void init_led(void)
{
  P2M0 = 0;
  P2M1 = 0xff;  //P2口为位选口设置为推挽输出方式
  
  P1M0 &= 0x3f;
  P1M1 &= 0x3f;  //P17 P16为74HC164的码段输出口,设置为准双向口

  Led_DatClockP = 0; 		  //时钟为低
}

/*********************************************************
名称:take_data
描述:取字符代码子程序,从字库中取出字符代码
入口参数:i为显示缓存中的第某位数据
**********************************************************/
void take_data(unsigned char i)
{
  unsigned char j;
    j=led_show_buf[i];                 //取显示缓存的某位数据
    Led_Show_Data=led_table[j];         //从led字符表中查找对应的字符编码
}

/***********************************************
名称:led_chang
描述:对led显示的数据进行更新
说明:对全局变量Led_Disp_Data和Led_Disp_Bit进行操作
以更新显示数据和显示位
入口参数:char i_Show
出口参数:无
*************************************************/
void led_chang(unsigned char i_Show)
{
  switch(i_Show)
  {
   case 0x00:
        Led_Show_Bit=WEI1_SEL;    //右边第一位显示
        take_data(0x00);           //取显示缓冲区的第0个字节数据
        if((Shidu_Sel_Show == 0)&&(SetHStu_Flag == 0))
		  Led_Show_Data &= 0xdf;
		break;
   case 0x01:
        Led_Show_Bit=WEI2_SEL;    //右边第二位显示
        take_data(0x01);           //取显示缓冲区的第1个字节数据
        if((Shidu_Sel_Show == 1)&&(SetHStu_Flag == 0))
		  Led_Show_Data &= 0xdf;
		break;
   case 0x02:
        Led_Show_Bit=WEI3_SEL;    //右边第三位显示
        take_data(0x02);           //取显示缓冲区的第2个字节数据
        if((Wendu_Sel_Show == 0)&&(SetTStu_Flag == 0))
		  Led_Show_Data &= 0xdf;
		break;
   case 0x03:
        Led_Show_Bit=WEI4_SEL;    //右边第四位显示
        take_data(0x03);           //取显示缓冲区的第3个字节数据
        if((Wendu_Sel_Show == 1)&&(SetTStu_Flag == 0))
		  Led_Show_Data &= 0xdf;
		break;					                             
   case 0x04:
        Led_Show_Bit=WEI5_SEL;    //右边第五位显示
        take_data(0x04);           //取显示缓冲区的第4个字节数据
        if(Heater_Flag == 1)
		  Led_Show_Data &= 0xdf;
		break;
   case 0x05:
        Led_Show_Bit=WEI6_SEL;    //右边第六位显示
        take_data(0x05);           //取显示缓冲区的第5个字节数据
        break;
   case 0x06:
        Led_Show_Bit=WEI7_SEL;    //右边第七位显示
        take_data(0x06);           //取显示缓冲区的第6个字节数据
        break;
   case 0x07:
        Led_Show_Bit=WEI8_SEL;    //右边第八位显示
        take_data(0x07);           //取显示缓冲区的第7个字节数据
        break;
  }
}
/***********************************************************************
名称:led_blink
描述:led闪烁子程序,根据标志位确定三个指示灯或显示值的闪烁
说明:如果相应的标志置位并且定时时间到则关闭显示
注意:此为显示缓存的操作,为了不破坏原来的显示数据,应在调用此
子程序前将相应的显示缓存暂存
*************************************************************************/
void led_blink(void)
{
  if(Flash_TSetFlag==QUICK_FLASH)        //判断温度设置闪烁标志
    {
       if(Led_Flash_Flag==1)             //如果闪烁定时到
         { 
		   led_show_buf[2]=0x0c;         //字库中0x12所对应的字符码(不显示)
           led_show_buf[3]=0x0c;         //
    	 }
	}
  if(Flash_HSetFlag==QUICK_FLASH)        //判断湿度设置闪烁标志
    {
       if(Led_Flash_Flag==1)             //如果闪烁定时到
         {
		   led_show_buf[0]=0x0c;         //字库中0x12所对应的字符码(不显示)
           led_show_buf[1]=0x0c;         //
    	 }
	}
  if(Flash_InSetFlag==QUICK_FLASH)       //判断进风等级闪烁标志
    {
       if(Led_Flash_Flag==1)
         { 
		   led_show_buf[6]=0x0c;         //字库中0x12所对应的字符码(不显示)
           led_show_buf[7]=0x0c;         //
    	 }
	}
 if(Flash_ExSetFlag==QUICK_FLASH)        //判断出风等级闪烁标志
    {
       if(Led_Flash_Flag==1)
         { 
		   led_show_buf[4]=0x0c;         //字库中0x12所对应的字符码(不显示)
           led_show_buf[5]=0x0c;         //
		 }
    }
}
/***************************************************************
名称:send_data

****************************************************************/
void send_leddata(uchar c)
{
  unsigned char cnt=0x08,tmp = 0x80;
  do
   {
	  if(c & tmp) Led_DatPulse = 1;   //发送0
	  else  Led_DatPulse = 0;		 //发送1
	  _Nop();
	  Led_DatClockP = 1;
	  _Nop();
	  Led_DatClockP = 0;
	  tmp=tmp>>1;            //tmp右移一位
	  cnt--;
   }
  while(cnt);
}
/************************************************************
名称:led_display
描述:进行硬件操作,显示数据
说明:对更新好的全局变量Led_Disp_Data和Led_Disp_Bit进行显示
注意:显示新一位数据前应先熄灭前一位
*************************************************************/
void led_display(void)
{						   
   P2=NOWEI_SEL;	              //先熄灭控制位为低
   send_leddata(Led_Show_Data);   //数据送入端口
   P2=Led_Show_Bit;		          //显示位送入端口 
   led_delay(0);
}

/************************************************************
名称:led_refresh
描述:led刷新子程序,对led各显示位刷新一次
说明:局部变量i控制对某位的刷新显示
**************************************************************/
void led_refresh(void)
{
  unsigned char k;
    for(k=0;k<LED_IN_USE;k++)
       zancun[k]=led_show_buf[k];    //将显示缓存的数据暂存,防止在闪烁的过程中被破坏

    led_blink();                     //根据标志位和时间标志将对应的位进行打开或关闭
    led_chang(Nwei_Show);            //对要显示的位和数据进行刷新
    led_display();                   //显示

    for(k=0;k<LED_IN_USE;k++)
       led_show_buf[k]=zancun[k];    //将显示缓存的数据恢复

    Nwei_Show++;
    if(Nwei_Show == LED_IN_USE)
       Nwei_Show=0;
}

/**************************************************************
名称:dec_showbuf
描述:将整数i转换为十进制形式放入led显示缓冲区
入口参数:i,待显示处理的数据.n,第某屏欲显示的数据。
说明:此转换十进制子程序只能处理三位有效数字,将其放入显示缓存
      然后由显示程序显示内容
***************************************************************/
void dec_showbuf(uint i,uchar n)
{
 if(i>=0)
   {
     led_show_buf[2*n]=(i%100)/10;         //个位
     if(i>99)
	    led_show_buf[2*n+1]=(i%1000)/100;  //十位
	 else
        led_show_buf[2*n+1]=0x0c;          //没有十位,则此位显示空白 
   }
}
		

⌨️ 快捷键说明

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