找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 200|回复: 17
打印 上一主题 下一主题
收起左侧

静态数码管0~10间隔一秒测试

[复制链接]
跳转到指定楼层
楼主
ID:1150380 发表于 2025-5-13 18:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "reg52.h"


typedef unsigned char u8;
typedef unsigned int u16;

#define SMG_A_DP_PORT        P0//数码管P0端口

u8 gsmg_code[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x6f,0x77,0x7c,
                                0x39,0x5e,0x79,0x71};//共阴0-F
u8 a=0;//给a赋值0
void ZD0_init(void)
{
          TMOD|=0X01;//选择为定时器0模式,工作方式1
          TH0=0XFC;//给定时器赋初值,定时10ms
          TL0=0X18;
          ET0=1; //打开定时器0中断
          EA=1;        //打开总中断
          TR0=1;//打开定时器
}


void main()
{         

        ZD0_init();//定时器中断0
       
        while(1)
        {
           switch(a)
                  {
                          case 0:        SMG_A_DP_PORT=~gsmg_code[0];break;
                        case 1:        SMG_A_DP_PORT=~gsmg_code[1];break;
                        case 2:        SMG_A_DP_PORT=~gsmg_code[2];break;
                        case 3:        SMG_A_DP_PORT=~gsmg_code[3];break;
                        case 4:        SMG_A_DP_PORT=~gsmg_code[4];break;
                        case 5:        SMG_A_DP_PORT=~gsmg_code[5];break;
                        case 6:        SMG_A_DP_PORT=~gsmg_code[6];break;
                        case 7:        SMG_A_DP_PORT=~gsmg_code[7];break;
                        case 8:        SMG_A_DP_PORT=~gsmg_code[8];break;
                        case 9:        SMG_A_DP_PORT=~gsmg_code[9];break;
                        case 10:SMG_A_DP_PORT=~gsmg_code[10];break;

                  }

        }
}
       
void ZD0() interrupt 1 //定时器0中断函数
{
        static u16 i;//定义静态变量
        TH0=0XFC;//给定时器赋初值,定时1ms
        TL0=0X18;
        i++;
        if(i==1000)
        {
                i=0;
           a++;
          
        }
        if(a==10)//a累加到10

        {
          a=0;//当a累加到10时,a就等于0
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:69038 发表于 2025-5-13 22:20 | 只看该作者
为什么要switch?直接 SMG_A_DP_PORT=~gsmg_code[a]不就行了?
为什么要 if(a==10)?直接a=a%11,不一样能达到要求?
回复

使用道具 举报

板凳
ID:1109793 发表于 2025-5-14 07:27 | 只看该作者
switch的确没有必要。if还是可以有的。
回复

使用道具 举报

地板
ID:744809 发表于 2025-5-14 10:18 | 只看该作者
zhuls 发表于 2025-5-13 22:20
为什么要switch?直接 SMG_A_DP_PORT=~gsmg_code[a]不就行了?
为什么要 if(a==10)?直接a=a%11,不一样能达 ...

取余的计算速度好像比等于慢很多
回复

使用道具 举报

5#
ID:1150380 发表于 2025-5-14 10:24 | 只看该作者
xiaobendan001 发表于 2025-5-14 07:27
switch的确没有必要。if还是可以有的。

多谢  我一个初学者 自己研究的
回复

使用道具 举报

6#
ID:1150380 发表于 2025-5-14 10:25 | 只看该作者
zhuls 发表于 2025-5-13 22:20
为什么要switch?直接 SMG_A_DP_PORT=~gsmg_code[a]不就行了?
为什么要 if(a==10)?直接a=a%11,不一样能达 ...

多谢提醒  刚开始学
回复

使用道具 举报

7#
ID:619259 发表于 2025-5-14 10:54 | 只看该作者
zhuls 发表于 2025-5-13 22:20
为什么要switch?直接 SMG_A_DP_PORT=~gsmg_code[a]不就行了?
为什么要 if(a==10)?直接a=a%11,不一样能达 ...

确定 "a=a%11" 可以满足要求?
回复

使用道具 举报

8#
ID:712493 发表于 2025-5-14 10:57 | 只看该作者
zhuls 发表于 2025-5-13 22:20
为什么要switch?直接 SMG_A_DP_PORT=~gsmg_code[a]不就行了?
为什么要 if(a==10)?直接a=a%11,不一样能达 ...

if(a==10)?直接a=a%11 这个怎么理解?
回复

使用道具 举报

9#
ID:712493 发表于 2025-5-14 11:00 | 只看该作者
    case 10:SMG_A_DP_PORT=~gsmg_code[10];break;  你这程序这语句实际能被执行?
回复

使用道具 举报

10#
ID:326998 发表于 2025-5-14 11:40 | 只看该作者
zhuls 发表于 2025-5-13 22:20
为什么要switch?直接 SMG_A_DP_PORT=~gsmg_code[a]不就行了?
为什么要 if(a==10)?直接a=a%11,不一样能达 ...

if占4-5个周期,%占4+div周期,一个周期短,一个代码简洁
回复

使用道具 举报

11#
ID:712493 发表于 2025-5-14 13:53 | 只看该作者
gzhdssj 发表于 2025-5-14 11:40
if占4-5个周期,%占4+div周期,一个周期短,一个代码简洁

代码是简洁,但不相关理解困难
回复

使用道具 举报

12#
ID:1109793 发表于 2025-5-14 16:40 | 只看该作者
fj51hei 发表于 2025-5-14 10:57
if(a==10)?直接a=a%11 这个怎么理解?

不是if(a==10)和a=a%10对等,而是if(a==10)a=0;和a=a%10基本上算对等。
实际上if里面是可以增加一些别的代码的。取余操作显然是不行的。
回复

使用道具 举报

13#
ID:69038 发表于 2025-5-14 17:40 | 只看该作者
cy009 发表于 2025-5-14 10:54
确定 "a=a%11" 可以满足要求?

嗯呐,,是错了
回复

使用道具 举报

14#
ID:69038 发表于 2025-5-14 17:42 | 只看该作者
fj51hei 发表于 2025-5-14 10:57
if(a==10)?直接a=a%11 这个怎么理解?

数值错了,应该是a=a%10
回复

使用道具 举报

15#
ID:69038 发表于 2025-5-14 17:44 | 只看该作者
gzhdssj 发表于 2025-5-14 11:40
if占4-5个周期,%占4+div周期,一个周期短,一个代码简洁

没验证过,找时间验证一下
回复

使用道具 举报

16#
ID:69038 发表于 2025-5-14 23:29 | 只看该作者
xiaobendan001 发表于 2025-5-14 16:40
不是if(a==10)和a=a%10对等,而是if(a==10)a=0;和a=a%10基本上算对等。
实际上if里面是可以增加一些别的 ...

没有什么行不行的,各有优缺点。
if(a==10)a=0适合于循序渐进的计数方式,仅适用于a==10,或突发a>10,则此判断无效,对于a=0来说,约束性不强; 比如异步操作,受到干扰之类的操作。。
a=a%10 ,则是强制性的让a都在0~9之间。
在C51中,两者均编译后,a=a%10 比if(a==10)a=0;多了一个字节,运行时间也长了些。
个人觉得:若MCU没有硬件除法,则运行效率低于前者;如果是有硬件除法的MCU比如STM32xxx,2者相差无几,这时a=a%10 代码强度的明显强于if(a==10)。。还有个前提,2者的a均为unsigned型的数据。

欢迎探讨。
回复

使用道具 举报

17#
ID:1109793 发表于 2025-5-15 07:26 | 只看该作者
zhuls 发表于 2025-5-14 23:29
没有什么行不行的,各有优缺点。
if(a==10)a=0适合于循序渐进的计数方式,仅适用于a==10,或突发a>10,则 ...

您说的对。
只是大部分书籍上面都没有讲解取余的这种用法吧。
例如我要在a=0的同时,做其他操作,比如b++;out = !out;P1 = table;呢
回复

使用道具 举报

18#
ID:619259 发表于 2025-5-15 11:35 | 只看该作者
1.数码管代码表有错
2.定时器初值注释有错
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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