爱哭的水瓶座 发表于 2025-4-19 00:31:34

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)。
      
}


国芯人工智能 发表于 2025-4-19 00:33:00

问题分析

从您提供的代码片段来看,您正在尝试通过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函数以及正确处理小数运算,您应该能够解决当前遇到的问题。如果问题仍然存在,建议进一步检查硬件连接和代码逻辑,确保数据传输和显示的正确性。

[本文内容由国芯人工智能辅助生成,仅供参考]

mmxx2024 发表于 2025-4-19 01:00:38

LZ注释使用的是/* */,这在单行注释是允许的,甚至在非连续注释中也是允许的,如:
if((a == b) /*&& (c == d)*/)
{
      ……
}

等效于

if(a == b)
{
      ……
}



mmxx2024 发表于 2025-4-19 01:04:42

改成:
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)。
      
}

建议使用第一种,如果参与计算的是变量,计算量小,精度高。

爱哭的水瓶座 发表于 2025-4-19 08:19:29

mmxx2024 发表于 2025-4-19 01:04
改成:
void TIMECOUNT_Task(void)
{

第一种不行,第二种可以传过去了,谢谢

mmxx2024 发表于 2025-4-19 21:46:09

爱哭的水瓶座 发表于 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)。
      
}

爱哭的水瓶座 发表于 2025-4-21 23:31:35

737    第一次有 双 74H595 驱动8位数码管。感谢STC ,学到很多东西。
页: [1]
查看完整版本: 74H595 数码驱动为何传不了 小数除大数的变量 | 可以了