OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3159|回复: 5

刚学C,偷鸡不成蚀把米,求指点

[复制链接]

2

主题

10

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2019-9-24
在线时间
11 小时
发表于 2022-10-17 21:00:51 | 显示全部楼层 |阅读模式
1金钱
const uint8_t DisTab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00,0x6e,0x37,0x50,0x6d,0x1c};

//数码管显示函数
//此函数显示正常
void Display(uint16_t data)
{
  uint8_t i, j;
  uint8_t DisBuff[4];
  DisBuff[3] = data % 10000 / 1000;
  DisBuff[2] = data % 1000 / 100;
  DisBuff[1] = data % 100 / 10;
  DisBuff[0] = data % 10;
  for(i = 4; i > 0; i--)
    SPIWriteByte(DisTab[DisBuff[i-1]]); //送显示数据
}

//改为以下循环模式就异常了

//此函数显示异常
void Display(uint16_t data)
{
  uint8_t i, j;
  for(i = 0; i < 4; i++)
  {
    if(i < 3)
      SPIWriteByte(DisTab[data % (10*(4-i)) / 10*(3-i)]);   //送显示数据
    else
      SPIWriteByte(DisTab[data % (10*(4-i))]);
  }
}


最佳答案

查看完整内容[请看2#楼]

修改后如下: void Display(uint16_t data) { uint8_t i, j; uint16_t Buf=10000; for(i = 0; i < 4; i++) { SPIWriteByte(DisTab[(data % Buf)/ (Buf/10)]); //送显示数据 Buf/=10; } }
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2020-4-14
在线时间
67 小时
发表于 2022-10-17 21:00:52 | 显示全部楼层
修改后如下:
void Display(uint16_t data)
{
  uint8_t i, j;
  uint16_t Buf=10000;
  for(i = 0; i < 4; i++)
  {
      SPIWriteByte(DisTab[(data % Buf)/ (Buf/10)]);   //送显示数据
      Buf/=10;
  }
}
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8184
金钱
8184
注册时间
2020-5-11
在线时间
3697 小时
发表于 2022-10-18 10:26:26 | 显示全部楼层
10*n不是10的n次方
10*(4-i)结果就是40、30、20...... 所以结果不对。
我的建议:
  1. uint8_t i;
  2. uint16_t  j=1000;
  3. for(i = 0; i < 4; i++)
  4.   {   
  5.       SPIWriteByte(DisTab[data / j %10]);   //送显示数据
  6.           j=j/10;          
  7.   }
复制代码
专治疑难杂症
回复

使用道具 举报

17

主题

161

帖子

0

精华

高级会员

Rank: 4

积分
955
金钱
955
注册时间
2022-7-21
在线时间
446 小时
发表于 2022-10-18 10:27:34 | 显示全部楼层
你送显示数据那里算出来跟上面的结果好像不一样
回复

使用道具 举报

0

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2020-4-14
在线时间
67 小时
发表于 2022-10-18 10:28:01 | 显示全部楼层
代码:SPIWriteByte(DisTab[data % (10*(4-i)) / 10*(3-i)]);//送显示数据
这里10*4=40,10*3=30,并不是10的4次方,或者10的3次方。
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2019-9-24
在线时间
11 小时
 楼主| 发表于 2022-10-18 12:30:19 | 显示全部楼层
谢谢各位老师的耐心指导,居然犯了这么低级的错误。不过你们的思路确实不错,预设一个10000,然后在处理,太棒了! 我咋就没想到呢,哈哈
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 10:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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