51单片机1按键切换4种不同状态的灯的c程序可以是正闪,反闪,多种间隔闪。

51单片机1按键切换4种不同状态的灯的c程序可以是正闪,反闪,多种间隔闪。,第1张

以下是一个简单的51单片机程序,通过按下按键可以实现4种不同状态的灯亮灭,包括正闪、反闪、多种间隔闪。程序中使用了定时器来实现闪烁功能。

程序中使用了P10到P13作为控制灯的引脚,P32作为按键的引脚。每当按下按键时,通过判断状态值来切换不同的灯亮灭模式。定时器中断函数用来实现灯的闪烁,可根据需求自行调整闪烁频率。

编程不易,忘采纳

#include "reg52h"

sbit LED=P1^0;//LED锁存器

sbit SEG=P1^1;//数码管段选锁存器

sbit DIG=P1^2;//数码管位选锁存器

unsigned char t;

sbit LCDRS=P2^7;//数据指令控制

sbit LCDRW=P2^6;//读写控制

sbit LCDEN=P2^5;//液晶屏使能控制

//延时函数,延时n1ms

void delay(unsigned char n)

{

int i,j;

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

for (j=0; j<100; j++)

;

}

//写命令

void Write_Cmd(unsigned char C)

{

LCDEN=1;//使能端,由高电平跳变成低电平时,液晶屏模块执行命令

LCDRS=0;//指令寄存器选择

P0=C;

delay(5);

LCDEN=0;

}

//写数据

void Write_Data(unsigned char D)

{

LCDEN=1;//使能端,由高电平跳变成低电平时,液晶屏模块执行命令

LCDRS=1;//选择数据寄存器

P0=D;

delay(5);

LCDEN=0;

}

//LCD初始化

void LCD_Init()

{

LCDRS=0;//指令寄存器选择

Write_Cmd(0x01);//清屏

Write_Cmd(0x38);//功能设置8位双行显示57点阵

Write_Cmd(0x0F);//开关显示设置

Write_Cmd(0x06);//输入方式设置,光标从左向右移动,内容不移动

}

void main()

{

unsigned char Code1[]="I LOVE MCU!";

unsigned char m;

//LED,数码管锁存器片选设置

LED=0;

DUAN=0;

WEI=0;

LCDRW=0;//写选择

LCD_Init();

Write_Cmd(0x80+0x01);//写入显示缓冲区起始地址为1行2列

for(m=0;m<11;m++)

{

Write_Data(Code1[m]);

delay(3);

}

while (1)

;

}//end of main

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

int is_right(int a[],int k)

{

    int jian_ge=a[1]-a[0];

    int count_num=0;

    for(int i=0; i<k-1; i++)

    {

        if(a[i+1]-a[i]==jian_ge)

        {

            count_num++;

        }

    }

    return count_num==k-1true:false;

}

int main()

{

    int i;

    cin>>i;

    vector <char> result;

    vector <char> :: iterator it;

    for(int j=1; j<=i; j++)

    {

        int k;

        cin>>k;

        int a[k];

        for(int m=0; m<k; m++)

        {

            cin>>a[m];

        }

        if(is_right(a,k)==1)

        {

            resultpush_back('Y');

        }

        else

        {

            resultpush_back('N');

        }

    }

//    reverse(resultbegin(),resultend());

    for(it=resultbegin(); it!=resultend(); it++)

    {

        cout<<it<<endl;

    }

    return 0;

}

while(1)

{

a = 0xfe;

for(j=0;j<8;j++) //外循环8次

{

//--------------------------------------------

for(i=0;i<8-j;i++) //内循环8、7、60次

{

P1=a; //第一次,只有右边1个发光

delay(200);

a=_crol_(a,1); //左移一位

}

//以上单个LED发光,移位8、7、6次

//----------------------------------------

a = _crol_(a, j); //左移,第一次,移动0位,以后渐多

//前面的内循环,移位次数逐减,这里逐增,合到一起,仍然是移动8位

P1 = 0xff; //关闭显示

a = a << 1; //左移一位,右边添0,这样,就会有两个发光

} //到前边去循环,显示两个发光;

//再循环,有三个发光;

//……

}

#include<reg51h>

#define uchar unsigned char

uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};  //0到9

uchar num,cnt,disn;

uchar keyval,disk;

uchar led[]={1,2,3,4};

void dealdat(uchar a)

{

led[0]=0;

led[1]=0;

led[2]=0;

led[3]=0;

led[a]=disk;

}

void delay(unsigned int a)

{

unsigned int i,j;

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

for(j=0;j<1000;j++);

}

void t0isr() interrupt 1

{

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

switch(num)

{

case 0:P2=0x01;break;

case 1:P2=0x02;break;

case 2:P2=0x04;break;

case 3:P2=0x08;break;

default:break;

}

P0=~tab[led[num]];

num++;

num&=0x03;

cnt++;

if(cnt>100)

{

cnt=0;

disn++;

disn%=4;

dealdat(disn);

}

}

uchar kbscan(void)

{

unsigned char sccode,recode;

P3=0x0f;  //发0扫描,列线输入

if ((P3 & 0x0f) != 0x0f)  //有键按下

{

// delay(20);   //延时去抖动

if ((P3&0x0f)!= 0x0f)

{

sccode = 0xef;    //逐行扫描初值

while((sccode&0x01)!=0)

{

    P3=sccode;

if((P3&0x0f)!=0x0f)

{

    recode=(P3&0x0f)|0xf0;

return((~sccode)+(~recode));

 }

        else

sccode=(sccode<<1)|0x01;

}

}

}

return 0;  //无键按下,返回0

}

void getkey(void)

{

unsigned char key;

key=kbscan();

if(key==0){keyval=0xff;return;}

switch(key)

{

case 0x11:keyval=7;break;

case 0x12:keyval=4;break;

case 0x14:keyval=1;break;

case 0x18:keyval=10;break;

case 0x21:keyval=8;break;

case 0x22:keyval=5;break;

case 0x24:keyval=2;break;

case 0x28:keyval=0;break;

case 0x41:keyval=9;break;

case 0x42:keyval=6;break;

case 0x44:keyval=3;break;

case 0x48:keyval=11;break;

case 0x81:keyval=12;break;

case 0x82:keyval=13;break;

case 0x84:keyval=14;break;

case 0x88:keyval=15;break;

default:keyval=0xff;break;

}

}

main()

{

TMOD=0x11;

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

TR0=1;

ET0=1;

EA=1;

while(1)

{

getkey();

if(keyval!=0xff)disk=keyval;

delay(10);

}

}

以上就是关于51单片机1按键切换4种不同状态的灯的c程序可以是正闪,反闪,多种间隔闪。全部的内容,包括:51单片机1按键切换4种不同状态的灯的c程序可以是正闪,反闪,多种间隔闪。、51单片机液晶1602的C程序谁有,给个简单的显示一个字符A的、51单片机c语言程序 80分钟倒计时等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存