找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2041|回复: 12
收起左侧

还是郭天祥的板子,想让数码管显示187732从右到左流过去,但第一个数就可能出范围问题

[复制链接]
ID:245004 发表于 2019-11-15 12:00 | 显示全部楼层
按照6楼朋友的图修改如下:
  1. #include <reg51.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define ulong unsigned long

  6. sbit PinLE_Data = P2 ^ 6;
  7. sbit PinLE_Comm = P2 ^ 7;
  8. uchar code ucTabNumber[16] = {
  9.   0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  10.   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
  11. };

  12. // @12.000MHz
  13. void Delay2ms(void) {
  14.   uchar i, j;

  15.   i = 4;
  16.   j = 225;
  17.   do
  18.   {
  19.     while (--j);
  20.   } while (--i);
  21. }

  22. #define DISPALY_SPEED    60   // 决定显示速度
  23. #define SEG_LENGTH        6   // 数码管位数
  24. #define SET_74HC573(data, le)   {P0 = data; le = 1; _nop_(); le = 0;}
  25. void Display(uchar *p_ucArr) {
  26.   uchar i;
  27.   uchar ucTemp;
  28.   static uchar s_ucPosition;    // [0,11] 定位
  29.   static uint s_uiCount;        // 计数

  30.   for (i = 0; i < SEG_LENGTH; i++) {
  31.     if ((s_ucPosition + i) < (SEG_LENGTH - 1)) {
  32.       ucTemp = 0x00;
  33.     } else if ((s_ucPosition + i) > ((SEG_LENGTH << 1) - 2)) {
  34.       ucTemp = 0x00;
  35.     } else {
  36.       // 有效内容
  37.       ucTemp = ucTabNumber[*(p_ucArr + ((s_ucPosition + i) - (SEG_LENGTH - 1)))], PinLE_Data;
  38.     }
  39.     SET_74HC573(0xff, PinLE_Comm);            // 先关闭公共端
  40.     SET_74HC573(ucTemp, PinLE_Data);            // 赋值
  41.     SET_74HC573(~(0x01 << i), PinLE_Comm);        // 打开公共端
  42.     Delay2ms();   // 显示
  43.   }
  44.   // 计数控制速度
  45.   s_uiCount++;
  46.   if(s_uiCount >= DISPALY_SPEED) {
  47.     s_uiCount = 0;
  48.     // 控制有效定位
  49.     s_ucPosition++;
  50.     if(s_ucPosition >= ((SEG_LENGTH << 1) - 1)) {
  51.       s_ucPosition = 0;
  52.     }
  53.   }

  54. }

  55. /*
  56. * 将数字按位转换成数组
  57. * ulNumber:原数字
  58. * *p_ucArr:数组地址
  59. */
  60. void Transformation(ulong ulNumber, uchar *p_ucArr) {
  61.   *p_ucArr = ulNumber / 100000;
  62.   p_ucArr++;
  63.   *p_ucArr = ulNumber % 100000 / 10000;
  64.   p_ucArr++;
  65.   *p_ucArr = ulNumber % 10000 / 1000;
  66.   p_ucArr++;
  67.   *p_ucArr = ulNumber % 1000 / 100;
  68.   p_ucArr++;
  69.   *p_ucArr = ulNumber % 100 / 10;
  70.   p_ucArr++;
  71.   *p_ucArr = ulNumber % 10;
  72. }

  73. void main(void) {
  74.   uchar ucArr[6] = {0};
  75.   ulong ulNumber = 187732;
  76.   // 初始化数码管-关闭显示
  77.   SET_74HC573(0xff, PinLE_Comm);
  78.   SET_74HC573(0x00, PinLE_Data);
  79.   // 将数字按位转换成数组
  80.   Transformation(ulNumber, ucArr);
  81.   while (1) {
  82.     // 显示数组中的数字
  83.     Display(ucArr);
  84.   }
  85. }
复制代码



回复

使用道具 举报

ID:245004 发表于 2019-11-22 22:33 | 显示全部楼层
man1234567 发表于 2019-11-22 19:10
重写一遍罢。提示:各个位的算法要调整精确,这个不是关键;关键的是共阴或共阳的数码管没可能一次亮几位 ...

没明白你的意思,你不给个图,我只能按照上面朋友的图写代码了。你的意思可能是不用573,动态数码管?
回复

使用道具 举报

ID:245004 发表于 2019-11-22 22:50 | 显示全部楼层
刚刚看到你的pdf文件,下载看了也是用的573,你可以把我的程序用keil5或4编译一下,然后把代码试一试,再然后有什么问题再提出来,我们共师兄习。
我还是传个hex吧: munber.zip (1.35 KB, 下载次数: 4)
回复

使用道具 举报

ID:245004 发表于 2019-11-22 22:57 | 显示全部楼层
man1234567 发表于 2019-11-22 19:10
重写一遍罢。提示:各个位的算法要调整精确,这个不是关键;关键的是共阴或共阳的数码管没可能一次亮几位 ...

我的程序就如你说的一次点亮一位,是ms级的延时,视觉上就是点亮了6位,从”000001“”000018“”000187“...”187732“”877320“”773200“...这样,看起来就是从右向左滚动。而不是只点亮了个位。你的意思是这样吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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