打印
[51单片机]

求助

[复制链接]
964|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SEU-YANG|  楼主 | 2016-3-11 14:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚开始学单片机,自己写了一个用按键控制模式切换的数码管显示程序,就是按键后数码管就暗了,可是现在按键后数码管是十位和个位数字相同了,求指教。
#include<reg52.h>

sbit ADDR0 = P2^2;
sbit ADDR1 = P2^3;
sbit ADDR2 = P2^4;
sbit ADDR3 = P2^5;
sbit ENLED = P1^4;
sbit key1 = P3^1;

unsigned char  LedChar[16]={
     0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
         0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71
        };
unsigned char LedBuff[2]={
0xFF, 0xFF
        };
void delay(unsigned int xms)  // xms代表需要延时的毫秒数
{
     unsigned int x,y;
     for(x=xms;x>0;x--)
     for(y=110;y>0;y--);
}

void main()
{
        unsigned int cnt = 0;
        unsigned long sec = 0;
        unsigned char i = 0;
        unsigned char j =0;

        ENLED = 0;
        ADDR3 = 1;
        TMOD = 0x01;
        TH0 = 0xFC;
        TL0 = 0x67;
        TR0 = 1;                      //打开定时器T0
        key1 = 1;
    delay(5);

        while(1)
        {
                   if(key1 == 1)
                {
                              if(TF0 == 1)
                            {
                                      TF0 = 0;
                                    TH0 = 0xFC;
                                    TL0 = 0x67;
                                    cnt++;
                                    if(cnt >= 1000)   
                                     {
                                            cnt = 0;
                                            sec++;
                                            LedBuff[0] = LedChar[sec%10];
                                            LedBuff[1] = LedChar[sec/10%10];
                                    }
                                     P0 = 0xFF;
                                switch(i)
                                    {
                                            case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0];break;
                                            case 1: ADDR2=0; ADDR1=0; ADDR0=1; i=0; P0=LedBuff[1];break;
                                            default:break;
                                    }
                        }

            }
        else
        {
            TR0 == 0;
                ADDR2=0; ADDR1=0; ADDR0=0;
                LedBuff[0] = 0xFF;
                ADDR2=0; ADDR1=0; ADDR0=1;
                LedBuff[1] = 0xFF;
        }
  }
}

相关帖子

沙发
SEU-YANG|  楼主 | 2016-3-11 15:15 | 只看该作者
改了一下,是按键1控制模式切换,按键2控制+1,按键3控制-1,可是下载在开发板上,没反应,求解,急急急

使用特权

评论回复
板凳
SEU-YANG|  楼主 | 2016-3-11 15:16 | 只看该作者
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit P20 = P2^0;
sbit P21 = P2^1;
sbit key1 = P1^0;
sbit key2 = P1^1;
sbit key3 = P1^3;

uchar code table[]={
     0x3F,0x06,0x5B,0x4F,0x66,
         0x6D,0x7D,0x07,0x7F,0x6F
};
void keyscan();
void delayms(uint);
void display(uchar,uchar);
uchar num,num1,shi,ge;

void main()
{
    TMOD = 0x01;                        //设定时器0为工作方式1
        TH0 = (65536-45872)/256;
        TH1 = (65536-45872)%256;
        EA = 1;                                        //开总中断
        ET0 = 1;                           // 开定时器0中断
        TR0 = 1;
        while(1)
        {
           if(key1 == 0)
           {
               delayms(5);
               keyscan();
               display(num,num);
           }
        }
}
void display(uchar shi,uchar ge)
{
   shi = num/10;
   ge = num%10;
   P1 = table[shi];
   P21 = 1;
   delayms(5);
   P21 = 0;
   P2 = table[ge];
   P20 = 1;
   delayms(5);
   P20 = 0;
}
void delayms(uint xms)                           //延时函数
{
   uint i,j;
   for(i = xms;i>0;i--);
   for(j = 110;j>0;j--);
}
void T0_time() interrupt 1                         //中断函数
{
    TH0 = (65536-45872)/256;
        TL0 = (65536-45872)%256;
        num1++;
        if(num1 == 20)
        {
            num1 = 0;
                num++;
                if(num == 99)
                num = 0;
                shi = num/10;
                ge = num%10;
        }
}
void keyscan()
{
    if(key1 == 0)                                  //启动或停止定时器0
        {
            delayms(10);
                if(key1 == 0);
                {
                    while(!key1);
                        TR0 =~TR0;
                }
        }
        if(key2 == 0)
        {                                                         //按键后进行+1
           delayms(10);
           if(key2 == 0)
           {
              num++;
                  if(num == 99)
                  num = 0;
                  while(!key2);
           }
        }
        if(key3 == 0)
        {                                                         //按键后进行-1
            delayms(10);
                if(key3 == 0)
                {
                    if(num == 0)
                        num = 99 ;
                        num--;
                        while(!key3);
                }
        }
}

使用特权

评论回复
地板
luofeng2g| | 2016-3-11 15:21 | 只看该作者
“按键后数码管就暗了” 这是什么意思?  是不显示了?如果是不显示了
ADDR2=0; ADDR1=0; ADDR0=0; ADDR2=0; ADDR1=0; ADDR0=1;这两个片选就不该使能!
你现在的程序肯定两个数码管显示的是相同的,即是0xff对应的 “码”!

使用特权

评论回复
5
SEU-YANG|  楼主 | 2016-3-11 15:36 | 只看该作者
luofeng2g 发表于 2016-3-11 15:21
“按键后数码管就暗了” 这是什么意思?  是不显示了?如果是不显示了
ADDR2=0; ADDR1=0; ADDR0=0; ADDR2=0 ...

哦,那第二个程序的错误在哪里呢,它现在是下载到开发板上只有第一个数码管亮了,而且并没有变化。指点一二吧

使用特权

评论回复
6
luofeng2g| | 2016-3-11 16:21 | 只看该作者
SEU-YANG 发表于 2016-3-11 15:36
哦,那第二个程序的错误在哪里呢,它现在是下载到开发板上只有第一个数码管亮了,而且并没有变化。指点一 ...

你确定你的数码管能亮
if(key1 == 0)
           {
               delayms(5);
               keyscan();
               display(num,num);
           }只有当按键1按下才执行?你这里的数码管是动态显示,也就是要不停得刷才会显示,你这效果不是一闪而过?

使用特权

评论回复
7
SEU-YANG|  楼主 | 2016-3-11 22:14 | 只看该作者
luofeng2g 发表于 2016-3-11 16:21
你确定你的数码管能亮
if(key1 == 0)
           {

那要怎么改。。。。。。

使用特权

评论回复
8
SEU-YANG|  楼主 | 2016-3-11 23:17 | 只看该作者
luofeng2g 发表于 2016-3-11 16:21
你确定你的数码管能亮
if(key1 == 0)
           {

if(key1 == 1)
           {
               keyscan();
               display(num/10,num%10);
           }

使用特权

评论回复
9
luofeng2g| | 2016-3-14 08:40 | 只看该作者
SEU-YANG 发表于 2016-3-11 23:17
if(key1 == 1)
           {
               keyscan();

if 判段去掉

使用特权

评论回复
10
SEU-YANG|  楼主 | 2016-3-14 23:23 | 只看该作者
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit P20 = P0^4;
sbit P21 = P0^5;
sbit key1 = P0^0;
sbit key2 = P0^1;
sbit key3 = P0^2;
int key=0;
uchar code table[]={
         0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90             
};
void keyscan();
void delayms(uint);
void display(uchar,uchar);
uchar num,num1,shi,ge;

void main()
{                  
    TMOD = 0x01;                        //设定时器0为工作方式1
        TH0 = (65536-45872)/256;
        TH1 = (65536-45872)%256;
        EA = 1;                                        //开总中断
        ET0 = 1;                           // 开定时器0中断
        TR0 = 1;                           //定时器0启动或停止位
        while(1)
        {
         
               keyscan();
               display(num/10,num%10);

                if(key1==0)
           {          
                           key=1;
                        key1=1;                          //IO口电平不确定,需重新抬高
           }
           if(key==1)
           {
                           TR0 =~TR0;
                        key=0;
           }

        }
}
void display(uchar shi,uchar ge)
{
   shi = num/10;
   ge = num%10;
   P20 = 0;
   P1=0xff;
   P21=1;
   P1= table[shi];
   
  delayms(5);
   P20 = 1;
   P1=0xff;
   P21 = 0;
   P1 = table[ge];
   delayms(5);

}
void delayms(uint xms)                           //延时函数
{
   uint i,j;
   for(i = xms;i>0;i--);
   {
       for(j = 110;j>0;j--);
   }
  
}
void T0_time() interrupt 1                         //中断函数
{
    TH0 = (65536-45872)/256;                  //赋初值
        TL0 = (65536-45872)%256;
        num1++;
        if(num1 == 20)                                         //20次才是一秒
        {
            num1 = 0;
                num++;
                if(num == 99)
                num = 0;
                shi = num/10;
                ge = num%10;
        }
}
void keyscan()
{
        if(key2 == 0)
        {                                                         //按键后进行+1
           delayms(10);
           if(key2 == 0)
           {
              num++;
                  if(num == 99)
                  num = 0;
                  delayms(5);
                  while(!key2);
                  
           }
        }
        if(key3 == 0)
        {                                                         //按键后进行-1
            delayms(10);
                if(key3 == 0)
                {       
                   num--;
                    if(num == 0)
                    num = 99 ;               
                        delayms(5);
                        while(!key3);

                }
        }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

粉丝