找回密码
 立即注册
查看: 112|回复: 7

74H595 数码驱动为何传不了 小数除大数的变量 | 可以了

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-04-30 21:21:30
已绑定手机

1

主题

29

回帖

245

积分

中级会员

积分
245
发表于 2025-4-19 00:31:34 | 显示全部楼层 |阅读模式
#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[8] =
{
        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[num] , ~T_NUM[0]);                //数码管刷段码和位码
        }
        else if( Seg_no ==1 )                                                        //小时的个位
        {
                num =(fen/10)%10;
                Display_Seg( SEG_NUM[num] , ~T_NUM[1]);                //数码管刷段码和位码
        }        
        else if( Seg_no ==2 )                                                        //第一个横杠
        {
                num =(fen/1)%10;
                Display_Seg( SEG_NUM[num] , ~T_NUM[2]);                //数码管刷段码和位码
        }        
        else if( Seg_no ==3 )                                                        //分钟的十位
        {
                num = fen%10;
                Display_Seg( SEG_NUM[num] , ~T_NUM[3]);                //数码管刷段码和位码
        }
        else if( Seg_no ==4 )
        {
                num = (miao/1000)%10;
                Display_Seg( SEG_NUM[num] , ~T_NUM[4]);                //数码管刷段码和位码
        }        
        else if( Seg_no ==5 )
        {
                num = (miao/100)%10;
                Display_Seg( SEG_NUM[num] , ~T_NUM[5]);                //数码管刷段码和位码
        }        
        else if( Seg_no ==6 )
        {
                num = (miao/10)%10;
                Display_Seg( SEG_NUM[num] , ~T_NUM[6]);                //数码管刷段码和位码
        }
        else if( Seg_no ==7 )
        {
                num = miao%10;
                Display_Seg( SEG_NUM[num] , ~T_NUM[7]);                //数码管刷段码和位码
        }        
        else
        {
               
        }
        Seg_no ++;
        if( Seg_no>7 )
                Seg_no=0;
}

void TIMECOUNT_Task(void)
{
        miao =100;
        fen = 800/4095*500; // 这个运算 不知道是什么回事 传不过        void Seg_Task(void)。
        
}


回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 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语言注释格式。

  
  1. c
  2.    u8 SEGNUM[]=
  3.    {
  4.        0x3F,       // '0', 0
  5.        0x06,       // '1', 1
  6.        0x5B,       // '2', 2
  7.        0x4F,       // '3', 3
  8.        0x66,       // '4', 4
  9.        0x6D,       // '5', 5
  10.        0x7D,       // '6', 6
  11.        0x07,       // '7', 7
  12.        0x7F,       // '8', 8
  13.        0x6F,       // '9', 9
  14.        0x77,       // 'A', 10
  15.        0x7C,       // 'B', 11
  16.        0x39,       // 'C', 12
  17.        0x5E,       // 'D', 13
  18.        0x79,       // 'E', 14
  19.        0x71,       // 'F', 15
  20.        0x40,       // '-', 16
  21.        0x00,       // ' ', 17
  22.        0x80,       // '.', 18
  23.    };
复制代码

2. 完善Send595函数:
确保Send595函数能够正确地将数据发送到74H595芯片。以下是一个可能的实现:

  
  1. c
  2.    void Send595(u8 dat)
  3.    {
  4.        u8 i;
  5.        for(i = 0; i < 8; i++)
  6.        {
  7.            HC595SER = (dat >> i) & 0x01; // 将数据的每一位依次发送
  8.            HC595SCK = 1; // 产生时钟上升沿
  9.            HC595SCK = 0; // 时钟下降沿
  10.        }
  11.        HC595RCK = 1; // 锁存数据
  12.        HC595RCK = 0;
  13.    }
复制代码

3. 处理小数除大数的变量:
如果您需要处理小数运算,建议使用float或double类型来存储变量。例如:

  
  1. c
  2.    float result = (float)smallnumber / largenumber;
复制代码
如果需要将结果显示在数码管上,可以将结果转换为整数部分和小数部分分别显示。

总结

通过修正注释格式、完善Send595函数以及正确处理小数运算,您应该能够解决当前遇到的问题。如果问题仍然存在,建议进一步检查硬件连接和代码逻辑,确保数据传输和显示的正确性。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:39
  • 最近打卡:2025-05-01 00:02:30

1

主题

4

回帖

215

积分

中级会员

积分
215
发表于 2025-4-19 01:00:38 | 显示全部楼层
LZ注释使用的是/* */,这在单行注释是允许的,甚至在非连续注释中也是允许的,如:
if((a == b) /*&& (c == d)*/)
{
        ……
}

等效于

if(a == b)
{
        ……
}



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:39
  • 最近打卡:2025-05-01 00:02:30

1

主题

4

回帖

215

积分

中级会员

积分
215
发表于 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)。
        
}

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-04-30 21:21:30
已绑定手机

1

主题

29

回帖

245

积分

中级会员

积分
245
发表于 2025-4-19 08:19:29 | 显示全部楼层
mmxx*** 发表于 2025-4-19 01:04
改成:
void TIMECOUNT_Task(void)
{

第一种不行,第二种可以传过去了,谢谢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:39
  • 最近打卡:2025-05-01 00:02:30

1

主题

4

回帖

215

积分

中级会员

积分
215
发表于 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:17
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-04-30 21:21:30
已绑定手机

1

主题

29

回帖

245

积分

中级会员

积分
245
发表于 2025-4-21 23:31:35 | 显示全部楼层
    第一次有 双 74H595 驱动  8位数码管。感谢STC ,学到很多东西。

74H595.rar

156.46 KB, 下载次数: 2

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 20:08 , Processed in 0.609837 second(s), 91 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表