51单片机 用1个按键控制8盏灯,进行花样显示

作者&投稿:巫何 (若有异议请与网页底部的电邮联系)
51单片机 一个按键控制 12盏灯 每按一次 变化一种花样 一共十种 花样~

这个太花费时间,给你一个程序框架吧。
#include
//申明花样灯变化数组
sbit key=P3^2;
unsigned char num=0;
voide delay(int a)
{
unsigned char i;
while(a--)for(i=0;i<120;i++);
}
void ext0() interrupt 0
{
num++;
}
main()
{
while(1)

{
switch(num)

{
case 0:

case 1:

case 2:

.................................
}

}

}

你用中断就可马上执行。还有你如是用的扫描程序编的好也可马上执行的。这你自己 再想想吧。只要查到有键按下,就把那花样寄存器中加一,再用间转指令立即跳到不同的花样号的入口处。

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit key=P2^1;//这里看你把按键设置在哪个引脚上
void delay(uint z)
unit x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void key1()
{
if(key==0)
{
P1=0x00; //灯全亮
}
void key2()
{
if(key==0)
{
P1=0xfe;
P1=P1<<1; //左移或右移,这个自己试一下
delay(1000);
.//继续移动到最后一个灯亮
if(P1=0x80) //判断最后一个灯是否亮了,亮了就全部灭
{
P1=0xff;
}
}
}
void key3()
{
if(key==0)
{
P1=0x00; //全亮
delay(1000);
P1=~P1; //全灭 这里灭亮几次可以用for循环,不过我是直接写的顺序
//亮灭到达三次
P1=0Xff; //最后全都灭了
}
}
void main()
{
while(1)
{
key1();
while(key);
key2();
while(key);
key3();
while(key);
}
}

不知道对不,你自己试下然后修改修改吧

按照你的要求写的,你可以测试一下看看!

/*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
**/
#include "REG52.H"

/*
* 按键
*/
sbit Key_In1 = P2^0;
sbit Key_In2 = P2^1;
sbit Key_In3 = P2^2;

bit Update_Flag1;
bit Update_Flag2;
bit Update_Flag3;

/* LED 0- 7 */
unsigned char const TABLE[] =
{
0xFE,
0xFD,
0xFB,
0xF7,
0xEF,
0xDF,
0xBF,
0x7F
};

/*
* 延时1ms
*/
void Delay_1ms(unsigned int Cnt)
{
unsigned int x, y;

for(x = Cnt; x > 0; x--)
for(y = 110; y > 0; y--);
}

void KeyScang(void)
{
unsigned char i;

/* 按键1 */
if(Key_In1 == 0)
{
Delay_1ms(5);
if(Key_In1 == 0)
{
Update_Flag1 = 1;
}
while(Key_In1 == 0);
}

/* 按键2 */
if(Key_In2 == 0)
{
Delay_1ms(5);
if(Key_In2 == 0)
{
Update_Flag2 = 1;
}
while(Key_In2 == 0);
}

/* 按键3 */
if(Key_In3 == 0)
{
Delay_1ms(5);
if(Key_In3 == 0)
{
Update_Flag3 = 1;
}
while(Key_In3 == 0);
}

//
/* LED全亮 */
if(Update_Flag1)
{
Update_Flag1 = 0;
P1 = 0x00; /* P1口LED全亮 */
}

/* 循环显示最后全灭 */
if(Update_Flag2)
{
Update_Flag2 = 0;
for(i = 0; i < 8; i++)
{
P1 = TABLE[i];
Delay_1ms(500);
}
P1 = 0xFF;
}

/* LED闪烁3次 */
if(Update_Flag3)
{
Update_Flag3 = 0;
P1 = 0x00;
Delay_1ms(500);
P1 = 0xFF;
Delay_1ms(500);
P1 = 0x00;
Delay_1ms(500);
P1 = 0xFF;
Delay_1ms(500);
P1 = 0x00;
Delay_1ms(500);
P1 = 0xFF;
Delay_1ms(500);
}
}

/*
*
*/
int main(void)
{
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;

while(1)
{
KeyScang();
}
}

是需要编程吗?

用什么语言?

还检测按下第四下吗?


武安市19853528756: 在51单片机中用c语言写程序实现用一个按键控制8个灯的亮和灭(按下按键全部灯亮,按下按键全部灯灭) -
帛食牛黄: 你首先要确定你的电路.选择什么单片机和数码管,8个按键最简单8个IO口控制.一般简单的是用三极管驱动数码管.如果你会C语言的话,很容易上手.自己先从控制1个数码管学,在控制2个数码管(2个数码管基本上可以完成上面试验,8个...

武安市19853528756: 51单片机制作一个由一个按钮控制的8盏流水灯程序,要求按下按钮后流水灯先从左到右闪两次 -
帛食牛黄: #include<reg51.h> #define uchar unsigned char sbit key=P1^0; uchar led; void delay(uchar x) {uchar i,j;for(i=0;i<x;i++)for(j=0;j<125;j++); } void disled() {uchar i,j;led=0xfe;for(j=0;j<2;j++){for(i=0;i<8;i++){P0=led;delay(200);P0=0xff;delay(...

武安市19853528756: 在写51单片机程序的时候,对于用独立按键控制led.比如我按下按键1号,8个灯以1方式流动亮,问题 -
帛食牛黄: 解决这个问题,首先你得会检测按键,其次至少会做2种流水灯效果.基于以上基础,那么程序的架构可以这样来实现:1、定义一个全局变量,存放运行状态2、检测按键,如果key1被按下,那么运行状态为1;如果key2被按下,那么运行状态为23、死循环中,判断这个全局运行状态变量,如果为1,那么就执行流水灯程序1;如果为2,那么就执行流水灯程序2.加油!

武安市19853528756: 单片机编程一个键控制八个灯 -
帛食牛黄: LED 接到IO、适当加电阻

武安市19853528756: 51单片机怎么用button开关控制8个led从左往右以及从右往左的转化,要c需要代码,谢谢! -
帛食牛黄: 设:button 开关接在P0.1口,LED灯接P2口,共阳极接法.程序如下: #include <reg51.h> #define uchar unsigned char #define uint unsigned int sbit button=P0^1 ; void delay1ms(uint x) 延时...ms { for(uint s=0;s<x;s++)for(uint m=0;m<113;...

武安市19853528756: 51单片机,按键控制流水灯程序,懂的进!八个LED灯与单片机P1口连,按键key1与单片机P32连.该程序是完成以下工作:单片机上电,流水灯每一秒移一... -
帛食牛黄:[答案] 假如,你的程序在执行key_scan();是触发了两次中断导致num>20,你的显示函数将永远被跳过,你应该写成 if(num>20) { num=0; display(); } 这是一个比较直观的错误,其他的没细看,你在试试

武安市19853528756: 求大神编程一个51单片机的8灯点亮程序. -
帛食牛黄: 使用定时器或者delay延时函数,依次按照你的点灯要求进行亮灭灯. void main() {while(1){P2=0xfe;delay1ms(500); P2=0xfd; delay1ms(500); P2=0xfb;delay1ms(500); P2=0xf7; delay1ms(500); P2=0xef; delay1ms(500); P2=0xdf;delay1ms(500); P2=0xbf; delay1ms(500); P2=0x7f;delay1ms(500);}}

武安市19853528756: 用AT89C51单片机端口P1控制8个LED灯的变化(左移2次,右移2次,闪烁2次,延时的时间1秒 -
帛食牛黄: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38#include<reg51.h> #include<intrins.h> #define uchar unsigned char voiddelay(inta) { uchar i; while(a--)for(i=0;i<120;i++); } main() { uchar i,j,...

武安市19853528756: 单片机如何用8个LED灯按ASCII码表示0~99,用一个按钮控制,按一下就加1. -
帛食牛黄: 8个LED灯代表一个char型数据的8位?如果是 很简单 a=key_scan(); if(a==0) {b++; if(b>99)b=0; P0=b;}

武安市19853528756: 你好,我想问一下,怎么让51单片机开发板控制八个led灯同时闪烁 -
帛食牛黄: while(1) {P1=0xff; //P1全部高电平,点亮LED Delay(200);//延时 P1=0; //P1全部低电平,LED灭 Delay(200);//延时 }

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网