求助 数码管和点阵怎么同时工作

[复制链接]
2219|11
 楼主| 未央未央 发表于 2018-11-17 22:06 | 显示全部楼层 |阅读模式
大佬们,我是想让数码管显示2018,点阵显示0--9,请大佬们指教我该怎么改正
  1. #include<reg51.h>[img][/img]
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. //uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  6. uchar code DSY_CODE[]={0xa4,0xc0,0xf9,0x80};
  7. uchar code wei[]={0x80,0x40,0x20,0x10};
  8. unsigned char const xuehao[]={
  9. 0x00,0x00,0xFE,0x82,0x82,0x82,0xFE,0x00, //0
  10. 0x00,0x00,0x84,0x82,0xFF,0x80,0x80,0x00, //1
  11. 0x00,0x00,0xF2,0x92,0x92,0x92,0x9E,0x00, //2
  12. 0x00,0x00,0x92,0x92,0x92,0xFE,0x00,0x00, //3
  13. 0x00,0x20,0x30,0x28,0x24,0xFE,0x20,0x00, //4
  14. 0x00,0x00,0x9E,0x92,0x92,0x92,0xF2,0x00, //5
  15. 0x00,0x00,0xFE,0x92,0x92,0x92,0xF2,0x00, //6
  16. 0x00,0x00,0x00,0x02,0x02,0x02,0xFE,0x00, //7
  17. 0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, //8
  18. 0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00  //9
  19.                                     };
  20. unsigned char code lie[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  21. void DelayMS(uint x)
  22. {
  23.         uchar t;
  24.         while(x--) for(t=0;t<120;t++);
  25. }

  26. void Timer1Init()
  27. {
  28.         TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。

  29.         TH1=0XFC;        //给定时器赋初值,定时1ms
  30.         TL1=0X18;       
  31.         ET1=1;//打开定时器1中断允许
  32.         EA=1;//打开总中断
  33.         TR1=1;//打开定时器                       
  34. }
  35. void main()
  36. {
  37.        
  38.         uchar i;
  39.         while(1)
  40.                 {
  41.                         for(i=0;i<4;i++)
  42.                 {
  43.                         P3=0x00; //关闭显示
  44.                   P1=DSY_CODE[i]; //发送数字段码
  45.                         P3=wei[i];
  46.             DelayMS(10);
  47.                  }
  48.                 Timer1Init();  //定时器1初始化
  49.           }
  50.           


  51. }
  52. void Timer1() interrupt 3
  53. {
  54.   uchar t,j,k;
  55.         TH1=0XFC;        //给定时器赋初值,定时1ms
  56.         TL1=0X18;
  57.           for(t=0;t<10;t++)
  58.     {
  59.        for(j=0;j<30;j++)
  60.         {
  61.           for(k=0;k<8;k++)
  62.            {
  63.             P2=lie[k];
  64.             P0=~xuehao[t*8+k];
  65.                                                  DelayMS(2);
  66.                                          }
  67.                                  }
  68.     }
  69.                
  70. }
 楼主| 未央未央 发表于 2018-11-17 22:08 | 显示全部楼层
本帖最后由 未央未央 于 2018-11-17 22:15 编辑

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 未央未央 发表于 2018-11-17 22:08 | 显示全部楼层
本帖最后由 未央未央 于 2018-11-17 22:17 编辑

请大神指教
一事无成就是我 发表于 2018-11-18 00:17 | 显示全部楼层
IO口分开的,同时刷新就是,看你程序结构就是学习的,工程上一班在主程序里刷新,点阵刷新加快一倍,不然会感觉到闪烁
gx_huang 发表于 2018-11-18 09:01 | 显示全部楼层
主程序里刷新显示的,基本上是书呆子的教程,只适合简单的场合,显示效果很差,容易闪烁。
高级的,一般是定时器里定时刷新,主程序只更新需要显示的内容即可。
一事无成就是我 发表于 2018-11-19 00:01 | 显示全部楼层
谁给你说的高级的在定时器里执行,做过工程没有,中断里执行会严重的影响事件时事性,难道你没有听说过有限状态机吗

评论

在中断里驱动LED几条IO口的赋值指令就完成了,怎么会影响中断的响应速度了? 一般程序架构肯定都是上层逻辑层,底层驱动层。  发表于 2018-11-19 08:21
1261867136 发表于 2018-11-20 10:25 | 显示全部楼层
我能推荐鸿哥的状态机思维吗?~
一事无成就是我 发表于 2018-11-21 11:35 | 显示全部楼层
在中断里执行才是书呆子的教程模式,还是自己多去看看操作系统原理,搞清楚时间分片对你有好处的,裸奔也是操作系统,只不过是你自己编写的专用操作系统,要从宏观的系统去安排,别动不动就那么偏激,有利有弊,选择是中断中还是主程序中是看系统的复杂程度确定的,一般多进程都是在主程序里循环扫描执行的,记住不是教学立场里的那种独占资源
q977389872 发表于 2018-12-11 11:22 | 显示全部楼层
看帖留言学习
无语画眉 发表于 2019-3-27 10:02 | 显示全部楼层
看帖留言学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

14

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部