求一个单个按键控制两种模式的流水灯程序,#include<reg51.h>开头的

求一个单个按键控制两种模式的流水灯程序,#include<reg51.h>开头的,第1张

#include<reg51h>

#include<intrinsh>

#define uchar unsigned char

sbit key=P3^2;

uchar keyval;

void delay(uchar ms)

{

    uchar i;

    while(ms--)for(i=0;i<120;i++);

}

void ext0() interrupt 0

{

    keyval++;

    keyval%=2;

}

main()

{

    EX0=1;

    IT0=1;

    EA=1;

    P1=0xfe;

    while(1)

    {

        switch(keyval)

        {

        case 0:

            P1=_crol_(P1,1);

            delay(200);

            break;

        case 1:

            P1=_cror_(P1,1)

            delay(200);

            break;

        }

    }

}

while(1)//把while放到你的主函数里

{

if(key==0) //定义到自己的按键

{

run++; //全局变量

if(run==4)

{

run=1;

}

}

P0=0xff; //这个程序控制的是P0口

switch(run)

{

case 1:

P0=0xfe;

P0=0xfd;

P0=0xfb;

P0=0xf7;

P0=0xef;

P0=0xdf;

P0=0xbf;

P0=0x7f;

break;

case 2:

P0=0x7f;

P0=0xbf;

P0=0xdf;

P0=0xef;

P0=0xf7;

P0=0xfb;

P0=0xfd;

P0=0xfe;

P0=0xff;

break;

case 3:

P0=0xff;

break;

}

}

怎么个控制法,按一下,流水灯停下,再按一下开始,

还是按一下对应亮一个或亮下一个

还是想知道怎么用按键

教你用按键的方法,功能你自己去实现。把io口拉高电平后,接按键,如果按键按下,会接地,读出的io口电平会变为低,这样就可以判断说法按下按键,但要一直重复读取io口数据,而且要防抖动。

   unsigned int temp,k=9;

P2=0xff;//用P2检测键盘

temp=P2;

temp=temp&0xff;

   if (temp!=0xff)//接地了,有按下

   {

     delayxms(10);//等键盘稳定,以确认不是误按、抖动

 temp=P2;//再次检测

 temp=temp&0xff; //防抖 ,确认是按下

 if (temp!=0xff)//确认不是误按、抖动

 {

   switch (temp)

   {

     case 0xfe:k=0;break;

 case 0xfd:k=1;break;//不同情况做出不同处理,变为0的是按下的键

 case 0xfb:k=2;break;

 case 0xf7:k=3;break;

 case 0xef:k=4;break;

 case 0xdf:k=5;break;

 case 0xbf:k=6;break;

 case 0x7f:k=7;break;

   }

 }

     }

   }

用的什么单片机

给你个问号STM8S单片机参考

PB端口接LED灯,高电平点亮

PA口接按键,按下去出现低电平,key1 接PA3,key2接PA4

#include“stm8s105c6h”

void delay_1ms(unsogned int a)

{

int b;

while(a--)

{

b=150;

while(b--);

}

}

void main()

{

char model=2;//声明此变量,记录灯工作模式

char i,x,y;//i记录流水次数

PB_DDR=0XFF;//PB端口设置为输出模式

PB_CR1=0XFF;//PB端口设置为推挽输出

PA_DDR=0X00;//PA设置端口设置为输入模式

PA_CR1=0XFF;//PA端口设置为上拉输入

while(1)

{

if(PA_IDR&0B00001000==0)//key1被按下

{

model=0;

}

if(PA_IDR&0B00010000==0)//key2被按下

{

model=1;

}

if(model==0)//下面写流水灯代码

{

x=1;

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

{

PB_ODR=x;

delay_1ms(200);

x<<=1;

}

}

if(model==1)//下面写交替闪烁代码

{

PB_ODR=0B10101;//点亮1,3,5

delay_1ms(200);

PB_ODR=0B101010;//点亮2,4,6

delay_1ms(200);

}

}

}

现在一般不用2051了,呵呵,不过仿真也没事。

这程序可以这样写:设一个变量作为按键的键值,按下为1,再次按下为0;首先写一个流水灯的子程序,然后再主函数里去识别之前设置的键值,=1--->去执行流水灯;=0--->直接把P1口赋值0(也就是全亮)。这样就可以实现了。

51汇编程序如下:

KEY EQU P32

LED EQU P1

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN:

CLR 00H

MOV A,#0FEH

LOOP:

JB P32,LOOP1

JNB P32,$

CPL 00H

LOOP1:

JB 00H,LOOP2

MOV LED,#0FFH

SJMP LOOP

LOOP2:

MOV P1,A

RL A

LCALL DELAY

SJMP LOOP

DELAY:

MOV R2,#200

DLY1:

MOV R3,#250

DJNZ R3,$

DJNZ R2,DLY1

RET

END

以上就是关于求一个单个按键控制两种模式的流水灯程序,#include<reg51.h>开头的全部的内容,包括:求一个单个按键控制两种模式的流水灯程序,#include<reg51.h>开头的、一个独立按键控制八只流水灯、52单片机独立按键控制LED流水灯等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9364988.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存