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

📄 led.c

📁 基于STC12C5410AD单片机的温度控制显示程序,带控制标志,数码管闪烁和快闪慢闪,连加连减,自动闪烁停止手动闪烁停止功能
💻 C
字号:
/****************************************
*数码管显示子程序 led.c*
*采用动态扫描方式显示,P3端口为数据口和控制口复用口*
说明:采用连续刷新显示,刷新控制可放在定时器中进行()
如果相应位的闪烁标志置位并且定时时间到则显示缓存中置不显示代码,在此之前应先暂存原显存中的数
以便显示的时候显示原数
****************************************/
#include<msp430x44x.h>

/*************************定义全局变量***************************/
unsigned char Led_Disp_Data=0x00,      //LED显示缓冲区
              Led_Disp_Bit=0x00,       //led显示位选
              Dip=0x01,       //小数点(0x00第一位后显示小数点,0x01第二位后显示小数点,当Dip>LED_IN_USE不显示小数点)
              Nwei_Show=0x00,          //刷新控制寄存器
              Flash_DefrFlag=0x00,     //化霜闪烁标志(二个状态:不闪0x00、闪0x02,)
              Flash_CoolFlag=0x00,     //制冷闪烁标志(三个状态:不闪0x00、闪0x02,慢闪0x03)
              Flash_ShowFlag=0x00,     //显示闪烁标志(二个状态:不闪0x00、闪0x02,)
              Led_Flash_Flag=0x00,      //led闪烁标志位
              Led_Flash_Flag1=0x00,    //led闪烁标志位1(制冷慢闪)
              zhishi_flag=0xfe;        //控制标志寄存器(指示灯的开关)
unsigned char led_show_buf[LED_IN_USE]={0x0e,0x4,0x23,0x43,0x23,0x21};      //显示缓冲区,对应每一位


/****************************************************************
名称:init_led
描述:led初始化子程序
***************************************************************/
void init_led(void)
{
  P3DIR|=0xff;                //P3口为输出方向
  P3OUT|=0xff;                //P3口输出高电平
  P4DIR|=WEI_CTRL;
  P4DIR|=DAT_CTRL;            //控制口为输出方向
  P4OUT|=(DAT_CTRL+WEI_CTRL); //控制口输出高电平
  //led_ctrl=0x00;
  zhishi_flag=0xff;
  zhishi_flag&=(~COOL_FLAG);     //显示制冷标志
  //Flash_ShowFlag=0x02;
  //Flash_DefrFlag=0x02;
  //Flash_SetFlag=0x02;
  Flash_CoolFlag=0x03;
  //Flash_ShowFlag=0x02;
}
/**********************************************************
名称:show_delay()
***********************************************************/
void show_delay(void)
{
  unsigned int i=300;
  while(i)
   {i--;}
}
/************************************************************
名称:led_display
描述:进行硬件操作,显示数据
说明:对更新好的全局变量Led_Disp_Data和Led_Disp_Bit进行显示
注意:显示新一位数据前应先熄灭前一位
*************************************************************/
void led_display(void)
{ P3OUT=0x00;               //显示位送入端口(此为不显示)
  P4OUT|=WEI_CTRL;          //打开控制锁存
  P4OUT&=~WEI_CTRL;         //打开控制锁存,控制某一位的显示

  P3OUT=Led_Disp_Data;      //显示数据送入端口
  P4OUT|=DAT_CTRL;          //打开数据锁存
  P4OUT&=~DAT_CTRL;         //关闭数据锁存,将数据锁存

  P3OUT=Led_Disp_Bit;       //显示位送入端口
  P4OUT|=WEI_CTRL;          //打开控制锁存
  P4OUT&=~WEI_CTRL;         //打开控制锁存,控制某一位的显示
  show_delay();
}
/*********************************************************
名称:take_data
描述:取字符代码子程序,从字库中取出字符代码
入口参数:i为显示缓存中的第某位数据
**********************************************************/
void take_data(unsigned char i)
{   register unsigned char j;
    if(i!=LED_IN_USE-1)              //判断是否为最高指示位
    {
      j=led_show_buf[i];             //取显示缓存的某位数据
      if(i==Dip)                     //判断小数点的位置
        Led_Disp_Data=led_table1[j]; //从led字符表中查找对应的字符编码(带小数点的编码)
      else
        Led_Disp_Data=led_table[j];  //从led字符表中查找对应的字符编码
    }
    else
      Led_Disp_Data=zhishi_flag;      //显示指示位(包括负号,设置标志,化霜标志,制冷标志)
}
/***********************************************
名称: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_Disp_Bit=WEI1_SEL;  //右边第一位显示
    take_data(0x00);           //取显示缓冲区的第一个字节数据
    break;
  case 0x01:
    Led_Disp_Bit=WEI2_SEL;  //右边第二位显示
    take_data(0x01);           //取显示缓冲区的第二个字节数据
    break;
  case 0x02:
    Led_Disp_Bit=WEI3_SEL;  //右边第三位显示
    take_data(0x02);           //取显示缓冲区的第三个字节数据
    break;
  case 0x03:
    Led_Disp_Bit=WEI4_SEL;  //右边第四位显示
    take_data(0x03);           //取显示缓冲区的第四个字节数据
    break;
  case 0x04:
    Led_Disp_Bit=WEI5_SEL;  //右边第五位显示
    take_data(0x04);           //取显示缓冲区的第五个字节数据
    break;
  case 0x05:
    Led_Disp_Bit=WEI6_SEL;  //右边第六位显示
    take_data(0x05);           //取显示缓冲区的第六个字节数据
    break;
  default:
    break;
  }
}
/***********************************************************************
名称:led_blink
描述:led闪烁子程序,根据标志位确定三个指示灯或显示值的闪烁
说明:如果相应的标志置位并且定时时间到则关闭显示
注意:此为显示缓存的操作,为了不破坏原来的显示数据,应在调用此
子程序前将相应的显示缓存暂存
*************************************************************************/
void led_blink(void)
{
  if(Flash_DefrFlag==QUICK_FLASH)           //判断"化霜"闪烁标志
  {
    if(Led_Flash_Flag==0x01)         //如果闪烁定时到
      zhishi_flag|=DEFR_GLAG;        //指示缓存中"化霜标志"所对应的控制位置1(即熄灭)
  }

  if(Flash_CoolFlag==QUICK_FLASH)    //判断"制冷"快闪烁标志
  {
    if(Led_Flash_Flag==0x01)         //如果闪烁定时到
      zhishi_flag|=COOL_FLAG;        //指示缓存中"制冷标志"所对应的控制位置1(即熄灭)
  }
  if(Flash_CoolFlag==SLOW_FLASH)     //判断"制冷"慢闪烁标志
  {
    if(Led_Flash_Flag1==0x01)
      zhishi_flag|=COOL_FLAG;        //指示缓存中"设置标志"所对应的控制位置1(即熄灭)
  }

  if(Flash_ShowFlag==QUICK_FLASH)    //判断"显示"闪烁标志
  {
    if(Led_Flash_Flag==0x01)
    {
      led_show_buf[0]=0x0c;          //字库中0x12所对应的字符码(不显示)
      led_show_buf[1]=0x0c;          //(如果要扩展到别的单片机
      led_show_buf[2]=0x0c;          //对应三位闪烁,如果只闪烁两个可去掉一行)
    }
  }
}
/************************************************************
名称:led_refresh
描述:led刷新子程序,对led各显示位刷新一次
说明:局部变量i控制对某位的刷新显示
**************************************************************/
void led_refresh(void)
{
  unsigned char k,m,zancun[LED_IN_USE-1];
    for(k=0;k<LED_IN_USE-1;k++)
       zancun[k]=led_show_buf[k];    //将显示患存的数据暂存,防止在闪烁的过程中被破坏
    m=zhishi_flag;                   //暂存指示标志

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

    for(k=0;k<LED_IN_USE-1;k++)
       led_show_buf[k]=zancun[k];    //将显示缓存的数据恢复
    zhishi_flag=m;                   //恢复指示标志

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

/*********************************************************************
名称:led_refresh1
描述:对led刷新显示
说明:由于硬件的原因,导致子程序内部的局部变量i在(i<<led_ctrl)的过程中
led所显示的位置跟i指示的不一致,实际的对应是:0x01:WEI3_SEL,0x02:WEI2_SEL
0x04:WEI1_SEL,0x08:WEI6_SEL,0x10:WEI5_SEL,0x20:WEI4_SEL,所以在实际的向显示
缓存放入数据时可按此一一对应
*********************************************************************/
/*
void led_refresh1(void)
{
  unsigned i=0x01;
  P3OUT=0x00;                                //显示位送入端口(即无显示)
  P4OUT|=WEI_CTRL;                           //打开控制锁存
  P4OUT&=~WEI_CTRL;                          //先将显示熄灭

  P3OUT=led_table[led_show_buf[led_ctrl]];   // 设置显示值
  P4OUT|=DAT_CTRL;                           //打开数据锁存
  P4OUT&=~DAT_CTRL;                          //关闭数据锁存,将数据锁存

  P3OUT=(i<<led_ctrl);                        //设置哪只led显示
  P4OUT|=WEI_CTRL;                           //打开控制锁存
  P4OUT&=~WEI_CTRL;                          //打开控制锁存,控制某一位的显示
  led_ctrl=(led_ctrl+1)%LED_IN_USE;          //设置下一个要显示的LED
}
*/
/**************************************************************
名称:dec_showbuf
描述:将整数i转换为十进制形式放入led显示缓冲区
入口参数:i,待显示处理的数据
说明:此转换十进制子程序只能处理三位有效数字,将其放入显示缓存
      然后由显示程序显示内容
***************************************************************/
void dec_showbuf(int i)
{
 if(i>=0)
  {
    led_show_buf[LED_IN_USE-4]=i%10;             //十分位
    led_show_buf[LED_IN_USE-3]=(i%100)/10;       //个位
    if(i>=100)                                   //如果有十分位则处理十分位
      led_show_buf[LED_IN_USE-2]=(i%1000)/100;   //十位
    else
      led_show_buf[LED_IN_USE-2]=0xff;           //没有十分位,则此位显示空白
    zhishi_flag|=MINUS_FLAG;                     //取消'-'负号标志
  }
  else
 {
    i=-i;
    led_show_buf[LED_IN_USE-4]=i%10;             //十分位
    led_show_buf[LED_IN_USE-3]=(i%100)/10;       //个位
    if(i>=100)
      led_show_buf[LED_IN_USE-2]=(i%1000)/100;   //十位
    else
        led_show_buf[LED_IN_USE-2]=0xff;
    zhishi_flag&=~MINUS_FLAG;                    //'-'标志
  }
  Dip=0x01;                                      //第二位数字后显示小数点
}

⌨️ 快捷键说明

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