以下是一个简单的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分钟倒计时等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)