微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 数码管的位选

数码管的位选

时间:10-02 整理:3721RD 点击:
想要通过独立键盘控制数码管每按一次加1,警告说没有位选,烧到单片机上没有数码管亮,按键也没有反应,程序如下。
如何正确的位选?谢谢
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,                               //êy??1ü±à??
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xcb,0xa1,0x86,0x8e};
unsigned char code seg[]={
0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe};
void delayms(uint);
void display(uchar);
uchar num,num0;
uchar shi,ge;

void delayms(uint xms)
{
    uint i,j;
    for(i=xms;i>0;i--)
        for(j=110;j>0;j--);
}
void display(uchar num)
{
    shi=num/10;
    ge=num%10;
    P2=0x7f;
    P0=table[shi];
    delayms(5);
    P2=0xff;
    delayms(8);
    P2=0xbf;
    P0=table[ge];
    delayms(5);
    P2=0xff;
    delayms(8);
}

void keyscan()
{
    if(!key1)
       delayms(10);
    if(!key1)
       num++;
       if(num==60)
          num=0;
}
void main()
{
    while(1);
    display(num);
    keyscan();
}

你主函数死在while(1);这里了  然后你keyscan();这里面并没有消抖。
void keyscan()
{
    if(!key1)
   {
       delayms(10);
       if(!key1)
            {
             num++;
             }
   }
       if(num==60)
          num=0;
}

是你的显示函数有问题,你百度一下消影,应该是P2=0xff,之后的延时去掉。如果闪烁的话,吧delayms(数字变小)
    P2=0xbf;
    P0=table[ge];
    delayms(5);
    P2=0xff;
    delayms(8);

学习了 谢谢

谢谢!增加消影,去掉延时之后,数码管位选中的那两位亮了,但是一直是0,按下对应的按键,有反应,但是不会加1,只是暗了一下,放开按键又变成0了。其他按键没反应,不清楚还有哪里有问题?

嗯,果然把while(1)去掉好多了,但是还是不能实现按一下按键加1的功能。

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,                               //数码管编码
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xcb,0xa1,0x86,0x8e};
unsigned char code seg[]={
0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe};
void delayms(uint);
void display(uchar);
uchar num,num0;
uchar shi,ge;

void delayms(uint xms)
{
    uint i,j;
    for(i=xms;i>0;i--)
        for(j=110;j>0;j--);
}
void display(uchar num)
{
    shi=num/10;
    ge=num%10;
    P2=0x7f;
    P0=table[shi];
    delayms(5);
    P2=0xff;
   
    P2=0xbf;
    P0=table[ge];
    delayms(5);
    P2=0xff;
}
void keyscan()
{
    if(!key1)
       delayms(10);
    if(!key1)
       num++;
       if(num==60)
          num=0;
      while(!key1);
}
void main()
{
    display(num);
    keyscan();
//    while(1);

把按键检测放到死循环里面去才会不断检测了不然是只执行检测一遍后就不会再有动作的了。

你到底有没有仔细看一下你的程序,main函数里面就循环一次,怎么来执行你按键完增加后的数据并显示呢。

嗯,修改了,把while(1);的;去掉了,程序可以正常运行了!多谢各位的指教!

资料很好,谢谢。

看看,好好学习

看看,好好学习
大家多多指教

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top