找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1141|回复: 3
收起左侧

51单片机驱动TM1637 固定地址 程序能优化吗?

[复制链接]
ID:1010435 发表于 2022-8-29 09:34 | 显示全部楼层 |阅读模式
我是个单片机爱好者,喜欢驱动各类数码管,网上TM1637都是地址+1模式,我改了个固定地址模式,请问我这种代码能优化简写吗?这个代码仿真通过了。不是很懂C语言。
  1. void SmgDisplay(unsigned char Wei,i) //写显示寄存器
  2. {

  3. I2CStart();
  4. I2CWrByte(0x44); // 40H 地址自动加 1 模式,44H 固定地址模式,本程序采用固定地址模式

  5. I2CStop();
  6. I2CStart();
  7.         if(Wei==1)
  8.         {
  9.          I2CWrByte(0xc0); //设置 地址,
  10.          I2CWrByte(Num[i]); //送数据
  11.          I2CStop();
  12.          I2CStart();
  13.          I2CWrByte(0xc1); //设置 地址,
  14.          I2CWrByte(Numoff); //送数据
  15.          I2CStop();
  16.          I2CStart();
  17.          I2CWrByte(0xc2); //设置 地址,
  18.          I2CWrByte(Numoff); //送数据
  19.          I2CStop();
  20.          I2CStart();
  21.          I2CWrByte(0xc3); //设置 地址,
  22.          I2CWrByte(Numoff); //送数据       
  23.          I2CStop();
  24.          I2CStart();
  25.          I2CWrByte(0xc4); //设置 地址,
  26.          I2CWrByte(Numoff); //送数据       
  27.          I2CStop();
  28.          I2CStart();
  29.          I2CWrByte(0xc5); //设置 地址,
  30.          I2CWrByte(Numoff); //送数据       
  31.          I2CStop();
  32.          I2CStart();       
  33.         }
  34.         if(Wei==2)
  35.         {
  36.          I2CWrByte(0xc0); //设置 地址,
  37.          I2CWrByte(Numoff); //送数据
  38.          I2CStop();
  39.          I2CStart();
  40.          I2CWrByte(0xc1); //设置 地址,
  41.          I2CWrByte(Num[i]); //送数据
  42.          I2CStop();
  43.          I2CStart();
  44.          I2CWrByte(0xc2); //设置 地址,
  45.          I2CWrByte(Numoff); //送数据
  46.          I2CStop();
  47.          I2CStart();
  48.          I2CWrByte(0xc3); //设置 地址,
  49.          I2CWrByte(Numoff); //送数据       
  50.          I2CStop();
  51.          I2CStart();
  52.          I2CWrByte(0xc4); //设置 地址,
  53.          I2CWrByte(Numoff); //送数据       
  54.          I2CStop();
  55.          I2CStart();
  56.          I2CWrByte(0xc5); //设置 地址,
  57.          I2CWrByte(Numoff); //送数据       
  58.          I2CStop();
  59.          I2CStart();       
  60.         }
  61.         if(Wei==3)
  62.         {
  63.          I2CWrByte(0xc0); //设置 地址,
  64.          I2CWrByte(Numoff); //送数据
  65.          I2CStop();
  66.          I2CStart();
  67.          I2CWrByte(0xc1); //设置 地址,
  68.          I2CWrByte(Numoff); //送数据
  69.          I2CStop();
  70.          I2CStart();
  71.          I2CWrByte(0xc2); //设置 地址,
  72.          I2CWrByte(Num[i]); //送数据
  73.          I2CStop();
  74.          I2CStart();
  75.          I2CWrByte(0xc3); //设置 地址,
  76.          I2CWrByte(Numoff); //送数据       
  77.          I2CStop();
  78.          I2CStart();
  79.          I2CWrByte(0xc4); //设置 地址,
  80.          I2CWrByte(Numoff); //送数据       
  81.          I2CStop();
  82.          I2CStart();
  83.          I2CWrByte(0xc5); //设置 地址,
  84.          I2CWrByte(Numoff); //送数据       
  85.          I2CStop();
  86.          I2CStart();       
  87.         }
  88.         if(Wei==4)
  89.         {
  90.          I2CWrByte(0xc0); //设置 地址,
  91.          I2CWrByte(Numoff); //送数据
  92.          I2CStop();
  93.          I2CStart();
  94.          I2CWrByte(0xc1); //设置 地址,
  95.          I2CWrByte(Numoff); //送数据
  96.          I2CStop();
  97.          I2CStart();
  98.          I2CWrByte(0xc2); //设置 地址,
  99.          I2CWrByte(Numoff); //送数据
  100.          I2CStop();
  101.          I2CStart();
  102.          I2CWrByte(0xc3); //设置 地址,
  103.          I2CWrByte(Num[i]); //送数据       
  104.          I2CStop();
  105.          I2CStart();
  106.          I2CWrByte(0xc4); //设置 地址,
  107.          I2CWrByte(Numoff); //送数据       
  108.          I2CStop();
  109.          I2CStart();
  110.          I2CWrByte(0xc5); //设置 地址,
  111.          I2CWrByte(Numoff); //送数据       
  112.          I2CStop();
  113.          I2CStart();       
  114.         }
  115.         if(Wei==5)
  116.         {
  117.          I2CWrByte(0xc0); //设置 地址,
  118.          I2CWrByte(Numoff); //送数据
  119.          I2CStop();
  120.          I2CStart();
  121.          I2CWrByte(0xc1); //设置 地址,
  122.          I2CWrByte(Numoff); //送数据
  123.          I2CStop();
  124.          I2CStart();
  125.          I2CWrByte(0xc2); //设置 地址,
  126.          I2CWrByte(Numoff); //送数据
  127.          I2CStop();
  128.          I2CStart();
  129.          I2CWrByte(0xc3); //设置 地址,
  130.          I2CWrByte(Numoff); //送数据       
  131.          I2CStop();
  132.          I2CStart();
  133.          I2CWrByte(0xc4); //设置 地址,
  134.          I2CWrByte(Num[i]); //送数据       
  135.          I2CStop();
  136.          I2CStart();
  137.          I2CWrByte(0xc5); //设置 地址,
  138.          I2CWrByte(Numoff); //送数据       
  139.          I2CStop();
  140.          I2CStart();       
  141.         }
  142.         if(Wei==6)
  143.         {
  144.          I2CWrByte(0xc0); //设置 地址,
  145.          I2CWrByte(Numoff); //送数据
  146.          I2CStop();
  147.          I2CStart();
  148.          I2CWrByte(0xc1); //设置 地址,
  149.          I2CWrByte(Numoff); //送数据
  150.          I2CStop();
  151.          I2CStart();
  152.          I2CWrByte(0xc2); //设置 地址,
  153.          I2CWrByte(Numoff); //送数据
  154.          I2CStop();
  155.          I2CStart();
  156.          I2CWrByte(0xc3); //设置 地址,
  157.          I2CWrByte(Numoff); //送数据       
  158.          I2CStop();
  159.          I2CStart();
  160.          I2CWrByte(0xc4); //设置 地址,
  161.          I2CWrByte(Numoff); //送数据       
  162.          I2CStop();
  163.          I2CStart();
  164.          I2CWrByte(0xc5); //设置 地址,
  165.          I2CWrByte(Num[i]); //送数据       
  166.          I2CStop();
  167.          I2CStart();       
  168.         }       
  169. I2CWrByte(0x8f); //开显示 ,最大亮度

  170. I2CStop();
复制代码




回复

使用道具 举报

ID:404160 发表于 2022-9-6 17:17 | 显示全部楼层
可以用do。。。while循环或for循环语句简化。
回复

使用道具 举报

ID:624769 发表于 2022-9-8 00:07 | 显示全部楼层
要优化的话……
第一步就是 改成 地址+1 模式。
你还想优化么?
回复

使用道具 举报

ID:1010435 发表于 2022-9-23 15:54 | 显示全部楼层
闲来无事,优化了一下,现在好点了。

  1.         for(j=0;j<6;j++)
  2.         {
  3.                 if(Wei==j)
  4.                 {
  5.                  I2CWrByte(0xc0+j); //设置 地址,
  6.                  I2CWrByte(Num[i]); //送数据
  7.                  I2CStop();
  8.                  I2CStart();               
  9.                 }
  10.                 else
  11.                 {
  12.                  I2CWrByte(0xc0+j); //设置 地址,
  13.                  I2CWrByte(Numoff); //送数据
  14.                  I2CStop();
  15.                  I2CStart();                
  16.                 }

  17.         }
复制代码
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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