找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2458|回复: 13
收起左侧

按键控制流水灯 仿真可以 板子上就不行了 请教各位大神

[复制链接]
ID:425336 发表于 2018-11-15 11:34 | 显示全部楼层 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P1^6;
sbit key2=P1^7;
char k;
char tt;

void delay(uint m)
{
        char i,j;
        for(i=m;i>0;i--)
                for(j=1000;j>0;j--);       
}

void led1(void)//ÕyÏòμãááá÷Ë®μÆ
{
        P3=0XFE;
        delay(100);
        P3=0XFD;
        delay(100);
        P3=0XFB;
        delay(100);
        P3=0XF7;
        delay(100);
        P3=0XEF;
        delay(100);
        P3=0XDF;
        delay(100);
        P3=0XBF;
        delay(100);
        P3=0X7F;
        delay(100);

}  

void led2(void)//·′Ïòμãááá÷Ë®μÆ
{
    P3=0X7F;
        delay(100);
        P3=0XBF;
        delay(100);
        P3=0XDF;
        delay(100);
        P3=0XEF;
        delay(100);
    P3=0XF7;
        delay(100);
        P3=0XFB;
        delay(100);
        P3=0XFD;
        delay(100);
        P3=0XFE;
        delay(100);
}


void main (void)//Ö÷oˉêy
{
    TMOD=0X01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;//¿aÆô×üÖD¶Ï
        ET0=1;
        TR0=1;
        P1=0XFF;

        while(1)
        {
    switch(k)
                {
                        case 0:P1=0Xff;        break;
            case 1:led1();        break;
                        case 2:led2();        break;
        }       
     }
}
       
void time(void) interrupt 1
{
TL0=(65536-50000)%256;
TH0=(65536-50000)/256;


if((0xF0&P1)!=0XF0)
  {
        delay(100);
        if(key1==0)
                k=1;
        if(key2==0)
                k=2;

  }       
}       

       

回复

使用道具 举报

ID:295874 发表于 2018-11-15 14:43 | 显示全部楼层
晕死,定时器中断里面还有delay(100),这不是开玩笑嘛。
回复

使用道具 举报

ID:381277 发表于 2018-11-15 17:41 | 显示全部楼层
两个问题:1)key1 ,key2 的互锁问题
                2)如楼上所说,定时器中断里面还有delay(100)
改了就没问题了
回复

使用道具 举报

ID:427238 发表于 2018-11-15 18:20 | 显示全部楼层
中断里面根据key1和key2的状态分别给k赋值1和2,跟while循环内的switch判断k等于0和1的情况明显不相符,楼主还请细心点。
回复

使用道具 举报

ID:427298 发表于 2018-11-15 20:06 | 显示全部楼层
代码很有可能有问题
回复

使用道具 举报

ID:427297 发表于 2018-11-15 23:09 | 显示全部楼层
你这个中断,是外部中断,还是定时中断?
回复

使用道具 举报

ID:425336 发表于 2018-11-16 13:54 | 显示全部楼层
liyongan_1985 发表于 2018-11-15 14:43
晕死,定时器中断里面还有delay(100),这不是开玩笑嘛。

按键防抖用的  延迟函数会影响定时器中断吗?
回复

使用道具 举报

ID:427689 发表于 2018-11-16 13:58 | 显示全部楼层
定时器里的延时不要
回复

使用道具 举报

ID:425336 发表于 2018-11-16 14:00 | 显示全部楼层
LiaoCJ 发表于 2018-11-15 18:20
中断里面根据key1和key2的状态分别给k赋值1和2,跟while循环内的switch判断k等于0和1的情况明显不相符,楼 ...

等于0 代表灯全不亮   一开始就给k赋值0了;
回复

使用道具 举报

ID:425336 发表于 2018-11-16 14:01 | 显示全部楼层
huozhe0930 发表于 2018-11-15 23:09
你这个中断,是外部中断,还是定时中断?

定时器中断呢
回复

使用道具 举报

ID:427689 发表于 2018-11-16 14:01 | 显示全部楼层
定时器里的延时不要
while里的判断换到中断服务函数里
while里面只要执行程序 if(k)
回复

使用道具 举报

ID:425336 发表于 2018-11-16 14:02 | 显示全部楼层
ljx8940 发表于 2018-11-15 17:41
两个问题:1)key1 ,key2 的互锁问题
                2)如楼上所说,定时器中断里面还有delay(100)
改 ...

谢谢  互锁问题怎么解决呢、  定时器中断里为啥不能有延迟函数呢?  那个不是可以用作按键防抖吗?
回复

使用道具 举报

ID:425336 发表于 2018-11-17 08:59 | 显示全部楼层
nhmvvv 发表于 2018-11-16 14:01
定时器里的延时不要
while里的判断换到中断服务函数里
while里面只要执行程序 if(k)

是这样吗?也不行啊
void main (void)
{
    TMOD=0X01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        P1=0XFF;
        k=0;

        while(1)
        {
   if(k)
                 ;
     }
}
       
void time(void) interrupt 1
{
TL0=(65536-50000)%256;
TH0=(65536-50000)/256;

        if(key1==0)
                k=1;
        if(key2==0)
                k=2;
switch(k)
                {
                        case 0:P1=0Xff;        break;
      case 1:led1();        break;
                        case 2:led2();        break;
        }       
       
}       

       
回复

使用道具 举报

ID:427689 发表于 2018-11-17 14:33 | 显示全部楼层
xf是个小萌新 发表于 2018-11-17 08:59
是这样吗?也不行啊
void main (void)
{

if(k)里面写东西没?  我只是举个例子 你自己把led1什么的和判断加上
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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