单片机c语言按键扫描程序,51单片机独立按键扫描程序出现问题

最近家里买了一个3节LED等连在一起的手电筒,我想设计一个按下按键1,3个LED以流水灯的样子闪烁,按下按键2,LED1亮,按下按键3,LED2亮,按下按键1,LED3亮,查看了大量资料,尝试着自己写了个,但是在独立按键扫描消抖这一块出现问题了,我是根据矩阵按键的程序重新修改的,出现问题后自己努力了几天,网上也找过资料看,还是不懂,大家帮我看看。#include

sbit SW1 = P1^2;

sbit SW2 = P1^3;

sbit SW3 = P1^4;

sbit SW4 = P1^5;

sbit LED1 = P0^0;

sbit LED2 = P0^1;

sbit LED3 = P0^2;

unsigned char SWSTA[4] = {1,1,1,1};

unsigned char backup[4] = {1,1,1,1};

void main()

{  static unsigned char i=0,j=0;

unsigned char cnt = 0;

EA = 1;

TMOD = 0x01;

TH0 = 0xFC;

TL0 = 0x67;

ET0 = 1;

TR0 = 1;

while (1)

{

for (i=0;i<4;i++)

{

if (backup[i] != SWSTA[i])

{

backup[i] = SWSTA[i];

}

}

}

if ( SWSTA[0] == 0 )

{

P0 = ~(0x01 <

if ( TF0 == 1 )

{

TF0 = 0;

TH0 = 0xFC;

TL0 = 0x67;

cnt++;

}

if (cnt >= 100)

{

cnt = 0;

}

j++        ;

if(j>=3)

{

j = 0;

}

}

if (SWSTA[1] == 0 )

{

LED1 = 0;

}

if (SWSTA[2] == 0 )

{

LED2 = 0;

}

if (SWSTA[3] == 0 )

{

LED3 = 0;

}

}

void interrupTimer()interrupt 1

{static unsigned char i=0;

static unsigned char SWOUT = 0;

TH0 = 0xFC;

TL0 = 0x67;

for ( i=0;i<4;i++ )

{

if(SWSTA[i] & 0x0F == 0x00)

{

SWSTA[i] = 0;

}

else if(SWSTA[i] & 0x0F == 0x0F)

{

SWSTA[i] = 1;

}

}

SWOUT++;

SWOUT = SWOUT & 0x03;

}

还有,我尝试着直接把按键上的状态给LED灯,按键没按下之前是高位状态,按下后是低位状态,把地位状态的值给LED,按说是应该亮的,但就是不亮,我现在也搞不清楚了。

#include

sbit SW1 = P1^2;

sbit SW2 = P1^3;

sbit SW3 = P1^4;

sbit SW4 = P1^5;

sbit LED1 = P0^0;

sbit LED2 = P0^1;

sbit LED3 = P0^2;

void main()

{

while(1)

{      LED1 = SW1;  //按下时为0,对应的LED点亮

LED2 = SW2;

LED3 = SW3;        }

}

这个直接控制按键来控制LED亮灭,假入我把while语句里面的改为

if(SW1==0)

{LED1=0;}

else

{LED1=1;}

这样改过后,按下按键1,LED1就亮,不按就不亮,但是改成第二段程序就不亮。

请教下大家,第一个程序的按键扫描与消抖该如何处理,第二个程序我是哪里出错了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值