📄 led.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 + -