74H595 数码驱动为何传不了 小数除大数的变量 | 可以了
#include "io.h"u8 SEG_NUM[]=
{
0x3F, /*'0', 0*/
0x06, /*'1', 1*/
0x5B, /*'2', 2*/
0x4F, /*'3', 3*/
0x66, /*'4', 4*/
0x6D, /*'5', 5*/
0x7D, /*'6', 6*/
0x07, /*'7', 7*/
0x7F, /*'8', 8*/
0x6F, /*'9', 9*/
0x77, /*'A', 10*/
0x7C, /*'B', 11*/
0x39, /*'C', 12*/
0x5E, /*'D', 13*/
0x79, /*'E', 14*/
0x71, /*'F', 15*/
0x40, /*'-', 16*/
0x00, /*' ', 17*/
0x80, /*'.', 18*/
};
u8 T_NUM =
{
0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80
};
void Init_595(void)
{
HC595_SER = 0;
HC595_RCK = 0;
HC595_SCK = 0;
}
void Send_595( u8 dat )
{
u8 i;
for( i=0;i<8;i++ )
{
dat <<= 1; //DAT = (DAT<<1); //CY
HC595_SER = CY; //先把数据写到引脚上
HC595_SCK = 1; //输出上升沿的时钟信号
HC595_SCK = 0;
}
}
void Display_Seg(u8 HC595_1,u8 HC595_2)
{
//数码管段码输出高电平点亮
Send_595(HC595_2); //数码管位码 低电平点亮
Send_595(HC595_1);
HC595_RCK = 1; //数据输出
HC595_RCK = 0;
}
u8 Seg_no = 0;
u16 shi=0;
u16 fen=0;
u16 miao =0;
void Seg_Task(void)
{
uf num = 0;
if( Seg_no ==0 ) //小时十位
{
num =(fen/100)%10;
Display_Seg( SEG_NUM , ~T_NUM); //数码管刷段码和位码
}
else if( Seg_no ==1 ) //小时的个位
{
num =(fen/10)%10;
Display_Seg( SEG_NUM , ~T_NUM); //数码管刷段码和位码
}
else if( Seg_no ==2 ) //第一个横杠
{
num =(fen/1)%10;
Display_Seg( SEG_NUM , ~T_NUM); //数码管刷段码和位码
}
else if( Seg_no ==3 ) //分钟的十位
{
num = fen%10;
Display_Seg( SEG_NUM , ~T_NUM); //数码管刷段码和位码
}
else if( Seg_no ==4 )
{
num = (miao/1000)%10;
Display_Seg( SEG_NUM , ~T_NUM); //数码管刷段码和位码
}
else if( Seg_no ==5 )
{
num = (miao/100)%10;
Display_Seg( SEG_NUM , ~T_NUM); //数码管刷段码和位码
}
else if( Seg_no ==6 )
{
num = (miao/10)%10;
Display_Seg( SEG_NUM , ~T_NUM); //数码管刷段码和位码
}
else if( Seg_no ==7 )
{
num = miao%10;
Display_Seg( SEG_NUM , ~T_NUM); //数码管刷段码和位码
}
else
{
}
Seg_no ++;
if( Seg_no>7 )
Seg_no=0;
}
void TIMECOUNT_Task(void)
{
miao =100;
fen = 800/4095*500; // 这个运算 不知道是什么回事 传不过 void Seg_Task(void)。
}
问题分析
从您提供的代码片段来看,您正在尝试通过74H595芯片驱动数码管显示,但在处理小数除大数的变量时遇到了问题。以下是对代码的分析及可能的问题解决方案。
代码问题
1. 注释格式错误:
在SEGNUM数组中,注释使用了/'和/',这是不正确的C语言注释格式。正确的注释格式应为//或/ ... /。
例如,0x3F, /'0', 0/ 应改为 0x3F, // '0', 0 或 0x3F, / '0', 0 /。
2. Send595函数不完整:
Send595函数的代码不完整,缺少循环体的结束部分。您需要确保在循环中正确地发送数据到74H595芯片。
3. 小数除大数的变量问题:
您提到在处理小数除大数的变量时遇到问题,但代码中并未展示相关部分。通常,处理小数运算时需要注意数据类型的选择,例如使用float或double类型来存储小数。
解决方案
1. 修正注释格式:
将SEGNUM数组中的注释格式修正为标准的C语言注释格式。
c
u8 SEGNUM[]=
{
0x3F, // '0', 0
0x06, // '1', 1
0x5B, // '2', 2
0x4F, // '3', 3
0x66, // '4', 4
0x6D, // '5', 5
0x7D, // '6', 6
0x07, // '7', 7
0x7F, // '8', 8
0x6F, // '9', 9
0x77, // 'A', 10
0x7C, // 'B', 11
0x39, // 'C', 12
0x5E, // 'D', 13
0x79, // 'E', 14
0x71, // 'F', 15
0x40, // '-', 16
0x00, // ' ', 17
0x80, // '.', 18
};
2. 完善Send595函数:
确保Send595函数能够正确地将数据发送到74H595芯片。以下是一个可能的实现:
c
void Send595(u8 dat)
{
u8 i;
for(i = 0; i < 8; i++)
{
HC595SER = (dat >> i) & 0x01; // 将数据的每一位依次发送
HC595SCK = 1; // 产生时钟上升沿
HC595SCK = 0; // 时钟下降沿
}
HC595RCK = 1; // 锁存数据
HC595RCK = 0;
}
3. 处理小数除大数的变量:
如果您需要处理小数运算,建议使用float或double类型来存储变量。例如:
c
float result = (float)smallnumber / largenumber;
如果需要将结果显示在数码管上,可以将结果转换为整数部分和小数部分分别显示。
总结
通过修正注释格式、完善Send595函数以及正确处理小数运算,您应该能够解决当前遇到的问题。如果问题仍然存在,建议进一步检查硬件连接和代码逻辑,确保数据传输和显示的正确性。
[本文内容由国芯人工智能辅助生成,仅供参考] LZ注释使用的是/* */,这在单行注释是允许的,甚至在非连续注释中也是允许的,如:
if((a == b) /*&& (c == d)*/)
{
……
}
等效于
if(a == b)
{
……
}
改成:
void TIMECOUNT_Task(void)
{
miao =100;
fen = 800*500/4095; // 这个运算 不知道是什么回事 传不过 void Seg_Task(void)。
}
或
void TIMECOUNT_Task(void)
{
miao =100;
fen = ((u16)(800.0/4095.0*500.0)); // 这个运算 不知道是什么回事 传不过 void Seg_Task(void)。
}
建议使用第一种,如果参与计算的是变量,计算量小,精度高。
mmxx2024 发表于 2025-4-19 01:04
改成:
void TIMECOUNT_Task(void)
{
第一种不行,第二种可以传过去了,谢谢 爱哭的水瓶座 发表于 2025-4-19 08:19
第一种不行,第二种可以传过去了,谢谢
可能800*500被编译成只取乘积低16位了。
第一种试试改成:
void TIMECOUNT_Task(void)
{
miao =100;
fen = ( (unsigned int)((unsigned long)800* (unsigned long)500/ (unsigned long)4095)); // 这个运算 不知道是什么回事 传不过 void Seg_Task(void)。
}
嫌字多可以改成:
void TIMECOUNT_Task(void)
{
miao =100;
fen = ( (u16)(800UL* 500UL/ 4095UL)); // 这个运算 不知道是什么回事 传不过 void Seg_Task(void)。
}
737 第一次有 双 74H595 驱动8位数码管。感谢STC ,学到很多东西。
页:
[1]