找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请教一个单片机数码管依次显示数字的程序问题

[复制链接]
ID:480306 发表于 2019-5-20 23:13 | 显示全部楼层 |阅读模式
这段程序如果位选数组没有weinum-1,数码管的第一位就不会亮,但是我设置的weinum是从零开始的变量,就是对应的第0位数码管,请问为什么不减一就不亮呢?
#include<reg52.h>  //52系列单片机头文件
typedef unsigned char u8;
typedef unsigned int u16;
sbit dula=P2^6;
sbit wela=P2^7;
u8 a;
u8 duannum,weinum;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //数码管段选值编码
u8 code smgwei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void display()
{
         
         P0=smgduan[duannum];
         dula=1;
         dula=0;
         P0=smgwei[weinum-1];        //位选变量都是从1开始的,weinu这个值是1,但是在烧录时相当于从第0位取
         wela=1;
         wela=0;
}
void main()                    //主函数
{
        TMOD=0x10;    //设置定时器1为工作方式1
        TH1=(65536-50000)/256;  //给定时器1装初值,12M晶振定时时间为50ms
        TL1=(65536-50000)%256;
        EA=1;  //开总中断
        ET1=1; //开定时器1分开关
        TR1=1; //启动定时器1
        while(1)

                   {
                   if(a==10)
                  
                   {a=0;
                  if(duannum==16)
                  {
                  duannum=0;
                  }
                  if(weinum==6)
                  {
                  weinum=0;
                  }
                  duannum++;
                  weinum++;
                  display();
                  }
                  }
                  }

void timer1() interrupt 3  //中断服务程序,其中"3"是定时器1的入口序号
{
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        a++;
}
回复

使用道具 举报

ID:511890 发表于 2019-5-21 04:15 | 显示全部楼层
因为display();在weinum++; 后面,程序执行到display();时,weinum的值为1。所以在display()里面要weinum-1,才能取到0位。
修改方法:
1、把display();放到weinum++;前面。
2、把main里面的weinum++;去掉,display();里面的P0=smgwei[weinum-1]; 改成P0=smgwei[weinum++];
回复

使用道具 举报

ID:149451 发表于 2019-5-21 06:53 | 显示全部楼层
我理解是smgwei[weinum]里应该是16进制的数,而smgwei[weinum-1]里的“-1”是10进制的,所以出错
回复

使用道具 举报

ID:480306 发表于 2019-5-21 13:22 | 显示全部楼层
幻剑心 发表于 2019-5-21 04:15
因为display();在weinum++; 后面,程序执行到display();时,weinum的值为1。所以在display()里面要weinum ...

感谢,问题已经解决
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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