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