/******************************************************************************<br /><br /> 【显示部分程序】<br /><br />******************************************************************************/<br /><br /><br /><br />LED LedDat= //结构体定义及初始化<br />{<br />//位数|闪烁位|小数点|正负号|单位|缓存|闪烁计数器<br /> 4, 1, 3, 1, 1, 123, 0<br />}; //定义数据结构<br /><br /><br /><br />/***************************<br />【函数】:DataOut(void)<br />【功能】:io设定<br />【参数】:无<br />***************************/<br />void DataOut(unsigned char nValue)<br />{<br /> int i;<br /> for(i = 0;i < 8;i++)<br /> {<br /> if ((nValue & 0x80) == 0x80)<br /> {<br /> HC595_DATA_Hi();//输出高电平<br /> }<br /> else<br /> {<br /> HC595_DATA_Lo();//输出低电平<br /> } <br /> <br /> HC595_HC166_CLK_Hi();//时钟高电平,上升沿有效<br /> HC595_HC166_CLK_Lo();//时钟低电平<br /> nValue <<= 1; <br /> }<br /> return;<br />}<br /><br /> /***************************<br />【函数】:seg[16]<br />【功能】:显示段码<br />【参数】:无<br />***************************/<br /><br />unsigned char seg[17+10]=<br />{<br /> SEG_0,SEG_1, SEG_2,SEG_3,/* 0 1 2 3*/<br /> SEG_4,SEG_5, SEG_6,SEG_7, /* 4 5 6 7 */<br /> SEG_8,SEG_9, SEG_A,SEG_B, /* 8 9 A B */<br /> SEG_C,SEG_D_,SEG_E,SEG_F, /* C D E F */<br /> SEG_, SEG____,SEG_P, /* . - P*/<br /> s_a, s_b, s_c, s_d,<br /> s_e, s_f, s_g, s_h<br />};<br /><br />/***************************<br />【函数】:DigTab[6]<br />【功能】:LED位扫描<br />【参数】:无<br />***************************/<br />unsigned char DigTab[7] = // 定义数码管位选数据<br />{<br /> 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00<br />};<br /><br /><br /><br /><br />/***************************<br />【函数】:Show_Led_Bit(void)<br />【功能】:io设定<br />【参数】:DigValue//显示位数, SegValue//显示值<br />***************************/<br />void Show_Led_Bit(unsigned char DigValue,unsigned char SegValue)<br />{<br /> HC595_RCK_Lo();//清除锁存信号<br /> DataOut(DigTab[DigValue]);<br /> DataOut(~seg[SegValue]);<br /> HC595_RCK_Hi();//给锁存信号,共送了16位数据 高8位是 扫描数据 低8位是段码 <br />}<br /><br />/***************************<br />【函数】:unsigned int Dec_Bcd()//<br />【功能】:十进制转BCD<br />【参数】:*p_DecValue十进制地址 *p_BcdValue BCD地址<br />***************************/<br />void Dec_Bcd(unsigned int *p_DecValue,unsigned char *p_BcdValue)<br />{<br /> *p_BcdValue = *p_DecValue / 10000;<br /> p_BcdValue++;<br /> *p_BcdValue = *p_DecValue % 10000 / 1000;<br /> p_BcdValue++;<br /> *p_BcdValue = *p_DecValue % 1000 / 100;<br /> p_BcdValue++; <br /> *p_BcdValue = *p_DecValue % 100 / 10;<br /> p_BcdValue++;<br /> *p_BcdValue = *p_DecValue % 10; <br />}<br /><br />/***************************<br />【函数】:Show_Led_5(void)//5位数码管<br />【功能】:显示LED_BUFF的数据<br />【参数】:根据SegValue 显示位数,显示数据<br />***************************/<br />void Show_Led_5(unsigned char Led_Bit,unsigned int Led_Value)<br />{ <br /> unsigned char DispBuf[5];<br /> //unsigned char i,j,k=0;<br /> <br /> HC595_G_Lo();//L PCLK时钟低电平开595显示<br /> <br /> Dec_Bcd(&Led_Value,DispBuf);//转换成BCD码<br /> <br /> /*<br /> for(i=0,j=0,k=0;i<5;i++)//检测数码管位数<br /> {<br /> if(DispBuf>0x00)<br /> {<br /> j++; <br /> }<br /> if(j>0)//如果高位大于0则后面0有效<br /> {<br /> k++; <br /> }<br /> <br /> }<br /> */<br /> <br /> <br /> switch(Led_Bit) <br /> {<br /> case 0: Show_Led_Bit(6,DispBuf[0]);break; //close show<br /> <br /> case 1: Show_Led_Bit(4,DispBuf[4]);break; //show1个LED<br /> <br /> case 2: Show_Led_Bit(3,DispBuf[3]);<br /> Show_Led_Bit(4,DispBuf[4]);break; //show2个LED<br /> <br /> case 3: Show_Led_Bit(2,DispBuf[2]);<br /> Show_Led_Bit(3,DispBuf[3]);<br /> Show_Led_Bit(4,DispBuf[4]);break; //show3个LED<br /> <br /> case 4: Show_Led_Bit(1,DispBuf[1]);<br /> Show_Led_Bit(2,DispBuf[2]);<br /> Show_Led_Bit(3,DispBuf[3]);<br /> Show_Led_Bit(4,DispBuf[4]);break; //show4个LED<br /> <br /> case 5: Show_Led_Bit(0,DispBuf[0]);<br /> Show_Led_Bit(1,DispBuf[1]);<br /> Show_Led_Bit(2,DispBuf[2]);<br /> Show_Led_Bit(3,DispBuf[3]);<br /> Show_Led_Bit(4,DispBuf[4]);break; //show5个LED<br /> <br /> default : break;<br /> }<br /> HC595_G_Hi();//H PCLK时钟高电平关595显示 <br /> <br />}<br /><br /><br />/***************************<br />【函数】:OnOFF_Led_Bit(void)<br />【功能】:关显示位数<br />【参数】:根据SegValue 关显示位数<br />***************************/<br />void OnOFF_Led_Bit(unsigned char LedBit_Value)<br />{ <br /> switch(LedBit_Value)<br /> { <br /> case 0: break;<br /> case 1: DigTab[4]=0x00;break; //close数码管1<br /> case 2: DigTab[3]=0x00;break; //close数码管2 <br /> case 3: DigTab[2]=0x00;break; //close数码管3 <br /> case 4: DigTab[1]=0x00;break; //close数码管4 <br /> case 5: DigTab[0]=0x00;break; //close数码管5<br /> <br /> case 6: DigTab[0]=0x00; <br /> DigTab[1]=0x00;<br /> DigTab[2]=0x00;<br /> DigTab[3]=0x00;<br /> DigTab[4]=0x00;break; //close 5数码管<br /> <br /> case 7: DigTab[4]=0x10;break; //open数码管1 <br /> case 8: DigTab[3]=0x08;break; //open数码管2 <br /> case 9: DigTab[2]=0x04;break; //open数码管3 <br /> case 10: DigTab[1]=0x02;break; //open数码管4 <br /> case 11: DigTab[0]=0x01;break; //open数码管5 <br /> <br /> case 12: DigTab[4]=0x10; <br /> DigTab[3]=0x08;<br /> DigTab[2]=0x04;<br /> DigTab[1]=0x02;<br /> DigTab[0]=0x01;break; //open5数码管<br /> default : break;<br /> }<br />}<br /><br />/***************************<br />【函数】:Show_LedRadix(void)//5位数码管<br />【功能】:显示小数点<br />【参数】:根据Led_Radix显示小数点<br />***************************/<br />void Show_LedRadix(unsigned char Led_Radix)<br />{ <br /> HC595_G_Lo();//L PCLK时钟低电平开595显示<br /> switch(Led_Radix)<br /> {<br /> case 0: break; //去功能<br /> case 1: Show_Led_Bit(4,16);break; //show1小数点 <br /> case 2: Show_Led_Bit(3,16);break; //show2小数点 <br /> case 3: Show_Led_Bit(2,16);break; //show3小数点 <br /> case 4: Show_Led_Bit(1,16);break; //show4小数点 <br /> case 5: Show_Led_Bit(0,16);break; //show5小数点 <br /> default : break;<br /> }<br /> HC595_G_Hi();//H PCLK时钟高电平关595显示 <br />}<br /><br />/***************************<br />【函数】:Show_LedSign_P(void)<br />【功能】:显示P/负号<br />【参数】:根据Led_Sign_P 显示<br />***************************/<br />void Show_LedSign_P(unsigned char Led_Sign_P)<br />{ <br /> HC595_G_Lo();//L PCLK时钟低电平开595显示<br /> switch(Led_Sign_P) <br /> {<br /> case 0: break; //去功能<br /> case 1: Show_Led_Bit(0,17);break; //show - <br /> case 2: Show_Led_Bit(0,18);break; //show p <br /> default : break;<br /> }<br /> HC595_G_Hi();//H PCLK时钟高电平关595显示 <br />}<br /><br />/***************************<br />【函数】:Show_LedUnit(void)<br />【功能】:显示单位<br />【参数】:根据Led_Unit 显示<br />***************************/<br />void Show_LedUnit(unsigned char Led_Unit)<br />{ <br /> HC595_G_Lo();//L PCLK时钟低电平开595显示<br /> switch(Led_Unit) <br /> {<br /> case 0: break; //去功能<br /> case 4: Show_Led_Bit(5,19);break; //V<br /> case 3: Show_Led_Bit(5,20);break; //A <br /> case 2: Show_Led_Bit(5,21);break; //Hz <br /> case 5: Show_Led_Bit(5,22);break; //正反<br /> case 6: Show_Led_Bit(5,23);break; //POWER <br /> case 1: Show_Led_Bit(5,24);break; //RUN <br /> default : break;<br /> }<br /> HC595_G_Hi();//H PCLK时钟高电平关595显示 <br />}<br />/***************************<br />【函数】:void Show_LedMumeral(void)<br />【功能】:主循环或者定时中断调用<br />【参数】:flash_led//显示闪烁标志位<br />【备注】://LedDat.FlashTime为Char型最大为255<br /> //则0-- =255;<br />***************************/<br />void Show_LedMumeral()<br />{ <br /> unsigned char Show_LedMumeral_temp1=LedDat.FlashBit;//临时变量<br /> if(LedDat.FlashBit)<br /> {<br /> if(LedDat.FlashTime>210) //延时到<br /> {<br /> Show_Led_5(LedDat.ShowBit,LedDat.ShowBuff);//显示数据<br /> Show_LedRadix(LedDat.Radix); //显示小数点<br /> Show_LedSign_P(LedDat.Sign_P); //显示负号和P<br /> OnOFF_Led_Bit(LedDat.FlashBit); //关闭显示位<br /> LedDat.FlashTime--;<br /> } <br /> else<br /> {<br /> Show_Led_5(LedDat.ShowBit,LedDat.ShowBuff);//显示数据<br /> Show_LedRadix(LedDat.Radix); //显示小数点<br /> Show_LedSign_P(LedDat.Sign_P); //显示负号或P<br /> OnOFF_Led_Bit(Show_LedMumeral_temp1+=6); //开显示位<br /> LedDat.FlashTime--;<br /> }<br /> }<br /> else<br /> {<br /> Show_Led_5(LedDat.ShowBit,LedDat.ShowBuff);//显示数据<br /> Show_LedRadix(LedDat.Radix); //显示小数点<br /> Show_LedSign_P(LedDat.Sign_P); //显示负号或P<br /> }<br /> <br /> Show_LedUnit(LedDat.Unit); //显示单位<br /> }<br /><br /><br /><br /><br />
|