标题:
单片机程序 想要加两个按键切换流水灯模式,没加明白,请高人指点,谢谢
[打印本页]
作者:
cxy822
时间:
2024-4-14 16:03
标题:
单片机程序 想要加两个按键切换流水灯模式,没加明白,请高人指点,谢谢
新手求助:有两种流水灯形式,想要在单片机P1^5和P1^4口加两个按键切换流水灯模式,按键程序搞半天也没整明白,请高人指点,谢谢!第一个:
#include <reg51.h> //包含头文件
#include <stdlib.h> //库文件,使用随机数发生函数
typedef unsigned char uchar; //无符号字符型数据
typedef unsigned int uint; //无符号整型数据
sbit ST=P3^2; //74HC595寄存器输入端口
sbit Key1=P1^6; //按键开始
sbit Key2=P1^7; //按键停止
bit flag=0; //定时时间标志位
uchar num[5]; //产生的随机数
uchar num1[2];
uchar cnt; //计数变量
uchar str[5]= {0xff,0xff,0xff,0xff,0xff}; //定义数组存放35个LED数据
uchar str1[2]= {0xff,0xff}; //定义数组存放12个LED数据
void Delay_Us(int i); //延时函数
void Timer_Init(void); //定时器初始化
void UART_Init(void); //串口初始化
void UART_Send(uchar dat); //串口发送数据
//主函数
void main(void)
{
uchar i,j,k; //定义变量
UART_Init(); //串口初始化
Timer_Init(); //定时器初始化
for(i=0; i<5; i++) //循环5次发送数据
{ //35个LED初始状态,全部熄灭
UART_Send(str[i]);
}
P1=0xff; //12个LED初始状态,全部熄灭
P2=0xff;
while(1)
{
if(flag) //定时时间到
{
flag=0; //标志位清零
/*----35抽取5个LED-----*/
for(i=0; i<5; i++) //所有灯熄灭
{
str[i]=0xff;
}
for(i=0; i<5; i++)
{
k=rand()%35; //产生随机数0-34
for(j=0; j<i ; j++)
{
while(num[j]==k) //如果产生的随机数与之前的相同,则重新生成
{
k=rand()%35;
}
}
num[i]=k;
str[num[i]/8]&=~(0x01<<(num[i]%8)); //将随机数转换为对应的LED数据
}
for(i=0; i<5; i++) //循环5次发送数据
{
UART_Send(str[i]);
}
/*----12抽取2个LED-----*/
str1[0]=0xff; //12个LED全部熄灭
str1[1]=0xff;
for(i=0; i<2; i++)
{
k=rand()%12; //产生随机数0-11
for(j=0; j<i ; j++)
{
while(num1[j]==k) //如果产生的随机数与之前的相同,则重新生成
{
k=rand()%12;
}
}
num1[i]=k;
str1[num1[i]/8]&=~(0x01<<(num1[i]%8)); //将随机数转换为对应的LED数据
}
P1=str1[1]; //控制12个LED点亮
P2=str1[0];
}
if(Key1==0) //按键开始
{
Delay_Us(1000); //延时消抖
if(Key1==0)
{
TR0=1;
}
while(Key2==0); //按键松手检测
}
if(Key2==0) //按键停止
{
Delay_Us(1000); //延时消抖
if(Key2==0)
{
TR0=0;
/*----35抽取5个LED-----*/
for(i=0; i<5; i++) //所有灯熄灭
{
str[i]=0xff;
}
for(i=0; i<5; i++)
{
k=rand()%35; //产生随机数0-34
for(j=0; j<i ; j++)
{
while(num[j]==k)//如果产生的随机数与之前的相同,则重新生成
{
k=rand()%35;
}
}
num[i]=k;
str[num[i]/8]&=~(0x01<<(num[i]%8)); //将随机数转换为对应的LED数据
}
for(i=0; i<5; i++) //循环5次发送数据
{
UART_Send(str[i]);
}
/*----12抽取2个LED-----*/
str1[0]=0xff; //12个LED全部熄灭
str1[1]=0xff;
for(i=0; i<2; i++)
{
k=rand()%12; //产生随机数0-11
for(j=0; j<i ; j++)
{
while(num1[j]==k) //如果产生的随机数与之前的相同,则重新生成
{
k=rand()%12;
}
}
num1[i]=k;
str1[num1[i]/8]&=~(0x01<<(num1[i]%8)); //将随机数转换为对应的LED数据
}
P1=str1[1]; //控制12个LED点亮
P2=str1[0];
}
while(Key2==0); //按键松手检测
}
}
}
//延时函数
void Delay_Us(int i)
{
while(i--);
}
//定时器初始化
void Timer_Init(void)
{
TMOD|=0x01; //打开定时器0,1,工作方式1。
TH0=0x3c; //给定时器0赋初值,定时50ms
TL0=0xb0;
ET0=1; //打开定时器0中断允许
TR0=0; //打开定时器
PS=1;
EA=1; //打开总中断
}
//串口初始化
void UART_Init(void)
{
SM0=0; //串口模式0:同步移位寄存器方式
SM1=0;
TI=0; //发送中断清零
}
//串口发送数据,移位寄存器模式
void UART_Send(uchar dat)
{
ST=0;
SBUF=dat; //LED数据
while(~TI); //等待发送完成
TI=0; //标志位清零
ST=1;
ST=0;
}
//定时器0中断函数
void Timer0() interrupt 1
{
TH0=0x3c; //定时50ms
TL0=0xb0;
cnt++; //中断计数
if(cnt==6)
{
cnt=0;
flag=1; //标志位置1
}
}
复制代码
第二个:
#include <reg51.h> //包含头文件
#include <stdlib.h> //库文件,使用随机数发生函数
typedef unsigned char uchar; //无符号字符型数据
typedef unsigned int uint; //无符号整型数据
sbit ST=P3^2; //74HC595寄存器输入端口
sbit Key1=P1^6; //按键开始
sbit Key2=P1^7; //按键停止
bit flag=0; //定时时间标志位
uchar num[7]; //产生的随机数
uchar num1[2];
uchar cnt; //计数变量
uchar str[5]= {0xff,0xff,0xff,0xff,0xff}; //定义数组存放35个LED数据
uchar str1[2]= {0xff,0xff}; //定义数组存放12个LED数据
void Delay_Us(int i); //延时函数
void Timer_Init(void); //定时器初始化
void UART_Init(void); //串口初始化
void UART_Send(uchar dat); //串口发送数据
//主函数
void main(void)
{
uchar i,j,k; //定义变量
UART_Init(); //串口初始化
Timer_Init(); //定时器初始化
for(i=0; i<5; i++) //循环5次发送数据
{ //35个LED初始状态,全部熄灭
UART_Send(str[i]);
}
P1=0xff; //12个LED初始状态,全部熄灭
P2=0xff;
while(1)
{
if(flag) //定时时间到
{
flag=0; //标志位清零
/*----35抽取5个LED-----*/
for(i=0; i<5; i++) //所有灯熄灭
{
str[i]=0xff;
}
for(i=0; i<7; i++)
{
k=rand()%35; //产生随机数0-34
for(j=0; j<i ; j++)
{
while(num[j]==k) //如果产生的随机数与之前的相同,则重新生成
{
k=rand()%35;
}
}
num[i]=k;
str[num[i]/8]&=~(0x01<<(num[i]%8)); //将随机数转换为对应的LED数据
}
for(i=0; i<5; i++) //循环5次发送数据
{
UART_Send(str[i]);
}
/*----12抽取2个LED-----*/
str1[0]=0xff; //12个LED全部熄灭
str1[1]=0xff;
for(i=0; i<2; i++)
{
k=rand()%12; //产生随机数0-11
for(j=0; j<i ; j++)
{
while(num1[j]==k) //如果产生的随机数与之前的相同,则重新生成
{
k=rand()%12;
}
}
num1[i]=k;
str1[num1[i]/8]&=~(0x01<<(num1[i]%8)); //将随机数转换为对应的LED数据
}
P1=str1[1]; //控制12个LED点亮
P2=str1[0];
}
if(Key1==0) //按键开始
{
Delay_Us(1000); //延时消抖
if(Key1==0)
{
TR0=1;
}
while(Key2==0); //按键松手检测
}
if(Key2==0) //按键停止
{
Delay_Us(1000); //延时消抖
if(Key2==0)
{
TR0=0;
/*----35抽取5个LED-----*/
for(i=0; i<5; i++) //所有灯熄灭
{
str[i]=0xff;
}
for(i=0; i<7; i++)
{
k=rand()%35; //产生随机数0-34
for(j=0; j<i ; j++)
{
while(num[j]==k)//如果产生的随机数与之前的相同,则重新生成
{
k=rand()%35;
}
}
num[i]=k;
str[num[i]/8]&=~(0x01<<(num[i]%8)); //将随机数转换为对应的LED数据
}
for(i=0; i<5; i++) //循环5次发送数据
{
UART_Send(str[i]);
}
/*----12抽取2个LED-----*/
str1[0]=0xff; //12个LED全部熄灭
str1[1]=0xff;
for(i=0; i<2; i++)
{
k=rand()%12; //产生随机数0-11
for(j=0; j<i ; j++)
{
while(num1[j]==k) //如果产生的随机数与之前的相同,则重新生成
{
k=rand()%12;
}
}
num1[i]=k;
str1[num1[i]/8]&=~(0x01<<(num1[i]%8)); //将随机数转换为对应的LED数据
}
P1=str1[1]; //控制12个LED点亮
P2=str1[0];
}
while(Key2==0); //按键松手检测
}
}
}
//延时函数
void Delay_Us(int i)
{
while(i--);
}
//定时器初始化
void Timer_Init(void)
{
TMOD|=0x01; //打开定时器0,1,工作方式1。
TH0=0x3c; //给定时器0赋初值,定时50ms
TL0=0xb0;
ET0=1; //打开定时器0中断允许
TR0=0; //打开定时器
PS=1;
EA=1; //打开总中断
}
//串口初始化
void UART_Init(void)
{
SM0=0; //串口模式0:同步移位寄存器方式
SM1=0;
TI=0; //发送中断清零
}
//串口发送数据,移位寄存器模式
void UART_Send(uchar dat)
{
ST=0;
SBUF=dat; //LED数据
while(~TI); //等待发送完成
TI=0; //标志位清零
ST=1;
ST=0;
}
//定时器0中断函数
void Timer0() interrupt 1
{
TH0=0x3c; //定时50ms
TL0=0xb0;
cnt++; //中断计数
if(cnt==6)
{
cnt=0;
flag=1; //标志位置1
}
}
复制代码
请指点,谢谢!
作者:
cxy822
时间:
2024-4-14 16:07
就是按P1^4口按键执行第一种流水灯程序,按P1^5口按键执行第二种流水灯程序,按键调换顺序也没关系
作者:
cy009
时间:
2024-4-18 16:59
流水灯是入门级,没必要搞这么复杂的程序,思路才是重要的。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1