找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数码管有显示按键就没作用的问题

[复制链接]
跳转到指定楼层
楼主
ID:348282 发表于 2019-5-17 16:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下的程序功能,当取消数码管显示后,按键就有作用了LED1会亮和灭,如一起执行按键就没作用,本来想用按键调数码管数字加减变化的。现在请各位高手指点下,看那里出问题了。thanks!

单片机源程序如下:
include"STC15W.H"
#include"intrins.h"
#define uchar unsigned char  
#define uint unsigned int
void digplay(uint hig);
void key();
sbit PWM=P1^7;
sbit LED1=P5^5;
sbit up=P1^4;
sbit down=P1^5;
sbit ba=P1^1;
sbit sh=P1^0;
sbit ge=P1^2;
sbit dn=P1^3;
uint hig=250;
uchar code LED[]={0xCF,0x81,0xEA,0xE3,0xA5,0x67,0x6F,0xC1,0xEF,0xE7,0x5e};
/************延时子程序*************/
void delayxms(uint z)
{
uint y,x;
for(y=z;x>0;x--)
   for(y=110;y>0;y--);
   }
void KeyScan(void)//按键扫描
{
  static uchar key1_lock=0;//自锁标志
  static uint count1=0;//计数延时
  static uchar key2_lock=0;//
  static uint count2=0;//
if(up==0)
  {
   if((count1++>=5)&&(key1_lock==0))
     {
     key1_lock=1;
          LED1=~LED1;
        }
         }
  else
      {
           key1_lock=0;
           count1=0;
           }
        if(down==0)
        {
          if((count2++>=5)&&(key2_lock==0))
          {
            key2_lock=1;
                LED1=~LED1;
}
        }
        else
           {
            key2_lock=0;
                count2=0;
                }
          }
void Init2()//定时器2初始化
{
AUXR&=0x04;        //12T
   T2L=0x78;        //延时5MS
   T2H=0xec;        //
   
   IE2|=0x04;
   AUXR|=0x10;        //开始计时
   EA=1;
   }        

void digplay(uint hig)//数码管动态扫描
{
  
          static uchar i=0;
         
          P3=0x00;
         switch(i)
         {
          case 0:
                P3=LED[hig/100];
                        P1=0x02;
                        P1=0x00;
                        i++;
                        break;
          case 1:
                P3=LED[hig/10%10];
                        P1=0x01;
                        P1=0x00;
                        i++;
                        break;
          case 2:
                P3=LED[hig%10];
                        P1=0x04;
                        P1=0x00;
                        i++;
                        break;
                case 3:
                    P3=0x5e;
                        P1=0x08;
                        P1=0x00;
                        i=0;
                        break;
                        }
                        delayxms(5);
             }
void main()//主程序
{
Init2();
P5M0=0xff;
  P5M1=0x00;
  P3M0=0xff;
  P3M1=0x00;
  P1M0=0xff;
  P1M1=0xf0;
while(1)
  {

    digplay(hig);
   }
}
void t2int() interrupt 12
{
   KeyScan();
}


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

使用道具 举报

沙发
ID:348282 发表于 2019-5-17 16:36 | 只看该作者
用最古老的按键程序(if(........==0)delay(10),都试过,还是没作用。搞到头晕了。
回复

使用道具 举报

板凳
ID:123289 发表于 2019-5-18 08:27 | 只看该作者
把你的程序画成框图,看看框图上的逻辑是否混乱,你就明白了。
回复

使用道具 举报

地板
ID:348282 发表于 2019-5-18 09:31 | 只看该作者
多谢,已经找到原因了。
回复

使用道具 举报

5#
ID:213173 发表于 2019-5-18 09:56 | 只看该作者
law110 发表于 2019-5-17 16:36
用最古老的按键程序(if(........==0)delay(10),都试过,还是没作用。搞到头晕了。

楼主定时器初始化设置不当
void Init2()                //5毫秒@12.000MHz
{
        AUXR &= 0xFB;        //12T模式16位自动重载
        T2L = 0x78;                //设置定时初值
        T2H = 0xEC;                //设置定时初值
//        IE2|=0x04;
        AUXR |= 0x10;               //定时器2开始计时
        EA=1;                        //开总中断
        ET2=1;                        //开T2中断
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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