標(biāo)題:
單片機(jī)程序 想要加兩個(gè)按鍵切換流水燈模式,沒加明白,請(qǐng)高人指點(diǎn),謝謝
[打印本頁]
作者:
cxy822
時(shí)間:
2024-4-14 16:03
標(biāo)題:
單片機(jī)程序 想要加兩個(gè)按鍵切換流水燈模式,沒加明白,請(qǐng)高人指點(diǎn),謝謝
新手求助:有兩種流水燈形式,想要在單片機(jī)P1^5和P1^4口加兩個(gè)按鍵切換流水燈模式,按鍵程序搞半天也沒整明白,請(qǐng)高人指點(diǎn),謝謝!第一個(gè):
#include <reg51.h> //包含頭文件
#include <stdlib.h> //庫文件,使用隨機(jī)數(shù)發(fā)生函數(shù)
typedef unsigned char uchar; //無符號(hào)字符型數(shù)據(jù)
typedef unsigned int uint; //無符號(hào)整型數(shù)據(jù)
sbit ST=P3^2; //74HC595寄存器輸入端口
sbit Key1=P1^6; //按鍵開始
sbit Key2=P1^7; //按鍵停止
bit flag=0; //定時(shí)時(shí)間標(biāo)志位
uchar num[5]; //產(chǎn)生的隨機(jī)數(shù)
uchar num1[2];
uchar cnt; //計(jì)數(shù)變量
uchar str[5]= {0xff,0xff,0xff,0xff,0xff}; //定義數(shù)組存放35個(gè)LED數(shù)據(jù)
uchar str1[2]= {0xff,0xff}; //定義數(shù)組存放12個(gè)LED數(shù)據(jù)
void Delay_Us(int i); //延時(shí)函數(shù)
void Timer_Init(void); //定時(shí)器初始化
void UART_Init(void); //串口初始化
void UART_Send(uchar dat); //串口發(fā)送數(shù)據(jù)
//主函數(shù)
void main(void)
{
uchar i,j,k; //定義變量
UART_Init(); //串口初始化
Timer_Init(); //定時(shí)器初始化
for(i=0; i<5; i++) //循環(huán)5次發(fā)送數(shù)據(jù)
{ //35個(gè)LED初始狀態(tài),全部熄滅
UART_Send(str[i]);
}
P1=0xff; //12個(gè)LED初始狀態(tài),全部熄滅
P2=0xff;
while(1)
{
if(flag) //定時(shí)時(shí)間到
{
flag=0; //標(biāo)志位清零
/*----35抽取5個(gè)LED-----*/
for(i=0; i<5; i++) //所有燈熄滅
{
str[i]=0xff;
}
for(i=0; i<5; i++)
{
k=rand()%35; //產(chǎn)生隨機(jī)數(shù)0-34
for(j=0; j<i ; j++)
{
while(num[j]==k) //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
{
k=rand()%35;
}
}
num[i]=k;
str[num[i]/8]&=~(0x01<<(num[i]%8)); //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
}
for(i=0; i<5; i++) //循環(huán)5次發(fā)送數(shù)據(jù)
{
UART_Send(str[i]);
}
/*----12抽取2個(gè)LED-----*/
str1[0]=0xff; //12個(gè)LED全部熄滅
str1[1]=0xff;
for(i=0; i<2; i++)
{
k=rand()%12; //產(chǎn)生隨機(jī)數(shù)0-11
for(j=0; j<i ; j++)
{
while(num1[j]==k) //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
{
k=rand()%12;
}
}
num1[i]=k;
str1[num1[i]/8]&=~(0x01<<(num1[i]%8)); //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
}
P1=str1[1]; //控制12個(gè)LED點(diǎn)亮
P2=str1[0];
}
if(Key1==0) //按鍵開始
{
Delay_Us(1000); //延時(shí)消抖
if(Key1==0)
{
TR0=1;
}
while(Key2==0); //按鍵松手檢測(cè)
}
if(Key2==0) //按鍵停止
{
Delay_Us(1000); //延時(shí)消抖
if(Key2==0)
{
TR0=0;
/*----35抽取5個(gè)LED-----*/
for(i=0; i<5; i++) //所有燈熄滅
{
str[i]=0xff;
}
for(i=0; i<5; i++)
{
k=rand()%35; //產(chǎn)生隨機(jī)數(shù)0-34
for(j=0; j<i ; j++)
{
while(num[j]==k)//如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
{
k=rand()%35;
}
}
num[i]=k;
str[num[i]/8]&=~(0x01<<(num[i]%8)); //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
}
for(i=0; i<5; i++) //循環(huán)5次發(fā)送數(shù)據(jù)
{
UART_Send(str[i]);
}
/*----12抽取2個(gè)LED-----*/
str1[0]=0xff; //12個(gè)LED全部熄滅
str1[1]=0xff;
for(i=0; i<2; i++)
{
k=rand()%12; //產(chǎn)生隨機(jī)數(shù)0-11
for(j=0; j<i ; j++)
{
while(num1[j]==k) //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
{
k=rand()%12;
}
}
num1[i]=k;
str1[num1[i]/8]&=~(0x01<<(num1[i]%8)); //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
}
P1=str1[1]; //控制12個(gè)LED點(diǎn)亮
P2=str1[0];
}
while(Key2==0); //按鍵松手檢測(cè)
}
}
}
//延時(shí)函數(shù)
void Delay_Us(int i)
{
while(i--);
}
//定時(shí)器初始化
void Timer_Init(void)
{
TMOD|=0x01; //打開定時(shí)器0,1,工作方式1。
TH0=0x3c; //給定時(shí)器0賦初值,定時(shí)50ms
TL0=0xb0;
ET0=1; //打開定時(shí)器0中斷允許
TR0=0; //打開定時(shí)器
PS=1;
EA=1; //打開總中斷
}
//串口初始化
void UART_Init(void)
{
SM0=0; //串口模式0:同步移位寄存器方式
SM1=0;
TI=0; //發(fā)送中斷清零
}
//串口發(fā)送數(shù)據(jù),移位寄存器模式
void UART_Send(uchar dat)
{
ST=0;
SBUF=dat; //LED數(shù)據(jù)
while(~TI); //等待發(fā)送完成
TI=0; //標(biāo)志位清零
ST=1;
ST=0;
}
//定時(shí)器0中斷函數(shù)
void Timer0() interrupt 1
{
TH0=0x3c; //定時(shí)50ms
TL0=0xb0;
cnt++; //中斷計(jì)數(shù)
if(cnt==6)
{
cnt=0;
flag=1; //標(biāo)志位置1
}
}
復(fù)制代碼
第二個(gè):
#include <reg51.h> //包含頭文件
#include <stdlib.h> //庫文件,使用隨機(jī)數(shù)發(fā)生函數(shù)
typedef unsigned char uchar; //無符號(hào)字符型數(shù)據(jù)
typedef unsigned int uint; //無符號(hào)整型數(shù)據(jù)
sbit ST=P3^2; //74HC595寄存器輸入端口
sbit Key1=P1^6; //按鍵開始
sbit Key2=P1^7; //按鍵停止
bit flag=0; //定時(shí)時(shí)間標(biāo)志位
uchar num[7]; //產(chǎn)生的隨機(jī)數(shù)
uchar num1[2];
uchar cnt; //計(jì)數(shù)變量
uchar str[5]= {0xff,0xff,0xff,0xff,0xff}; //定義數(shù)組存放35個(gè)LED數(shù)據(jù)
uchar str1[2]= {0xff,0xff}; //定義數(shù)組存放12個(gè)LED數(shù)據(jù)
void Delay_Us(int i); //延時(shí)函數(shù)
void Timer_Init(void); //定時(shí)器初始化
void UART_Init(void); //串口初始化
void UART_Send(uchar dat); //串口發(fā)送數(shù)據(jù)
//主函數(shù)
void main(void)
{
uchar i,j,k; //定義變量
UART_Init(); //串口初始化
Timer_Init(); //定時(shí)器初始化
for(i=0; i<5; i++) //循環(huán)5次發(fā)送數(shù)據(jù)
{ //35個(gè)LED初始狀態(tài),全部熄滅
UART_Send(str[i]);
}
P1=0xff; //12個(gè)LED初始狀態(tài),全部熄滅
P2=0xff;
while(1)
{
if(flag) //定時(shí)時(shí)間到
{
flag=0; //標(biāo)志位清零
/*----35抽取5個(gè)LED-----*/
for(i=0; i<5; i++) //所有燈熄滅
{
str[i]=0xff;
}
for(i=0; i<7; i++)
{
k=rand()%35; //產(chǎn)生隨機(jī)數(shù)0-34
for(j=0; j<i ; j++)
{
while(num[j]==k) //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
{
k=rand()%35;
}
}
num[i]=k;
str[num[i]/8]&=~(0x01<<(num[i]%8)); //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
}
for(i=0; i<5; i++) //循環(huán)5次發(fā)送數(shù)據(jù)
{
UART_Send(str[i]);
}
/*----12抽取2個(gè)LED-----*/
str1[0]=0xff; //12個(gè)LED全部熄滅
str1[1]=0xff;
for(i=0; i<2; i++)
{
k=rand()%12; //產(chǎn)生隨機(jī)數(shù)0-11
for(j=0; j<i ; j++)
{
while(num1[j]==k) //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
{
k=rand()%12;
}
}
num1[i]=k;
str1[num1[i]/8]&=~(0x01<<(num1[i]%8)); //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
}
P1=str1[1]; //控制12個(gè)LED點(diǎn)亮
P2=str1[0];
}
if(Key1==0) //按鍵開始
{
Delay_Us(1000); //延時(shí)消抖
if(Key1==0)
{
TR0=1;
}
while(Key2==0); //按鍵松手檢測(cè)
}
if(Key2==0) //按鍵停止
{
Delay_Us(1000); //延時(shí)消抖
if(Key2==0)
{
TR0=0;
/*----35抽取5個(gè)LED-----*/
for(i=0; i<5; i++) //所有燈熄滅
{
str[i]=0xff;
}
for(i=0; i<7; i++)
{
k=rand()%35; //產(chǎn)生隨機(jī)數(shù)0-34
for(j=0; j<i ; j++)
{
while(num[j]==k)//如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
{
k=rand()%35;
}
}
num[i]=k;
str[num[i]/8]&=~(0x01<<(num[i]%8)); //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
}
for(i=0; i<5; i++) //循環(huán)5次發(fā)送數(shù)據(jù)
{
UART_Send(str[i]);
}
/*----12抽取2個(gè)LED-----*/
str1[0]=0xff; //12個(gè)LED全部熄滅
str1[1]=0xff;
for(i=0; i<2; i++)
{
k=rand()%12; //產(chǎn)生隨機(jī)數(shù)0-11
for(j=0; j<i ; j++)
{
while(num1[j]==k) //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
{
k=rand()%12;
}
}
num1[i]=k;
str1[num1[i]/8]&=~(0x01<<(num1[i]%8)); //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
}
P1=str1[1]; //控制12個(gè)LED點(diǎn)亮
P2=str1[0];
}
while(Key2==0); //按鍵松手檢測(cè)
}
}
}
//延時(shí)函數(shù)
void Delay_Us(int i)
{
while(i--);
}
//定時(shí)器初始化
void Timer_Init(void)
{
TMOD|=0x01; //打開定時(shí)器0,1,工作方式1。
TH0=0x3c; //給定時(shí)器0賦初值,定時(shí)50ms
TL0=0xb0;
ET0=1; //打開定時(shí)器0中斷允許
TR0=0; //打開定時(shí)器
PS=1;
EA=1; //打開總中斷
}
//串口初始化
void UART_Init(void)
{
SM0=0; //串口模式0:同步移位寄存器方式
SM1=0;
TI=0; //發(fā)送中斷清零
}
//串口發(fā)送數(shù)據(jù),移位寄存器模式
void UART_Send(uchar dat)
{
ST=0;
SBUF=dat; //LED數(shù)據(jù)
while(~TI); //等待發(fā)送完成
TI=0; //標(biāo)志位清零
ST=1;
ST=0;
}
//定時(shí)器0中斷函數(shù)
void Timer0() interrupt 1
{
TH0=0x3c; //定時(shí)50ms
TL0=0xb0;
cnt++; //中斷計(jì)數(shù)
if(cnt==6)
{
cnt=0;
flag=1; //標(biāo)志位置1
}
}
復(fù)制代碼
請(qǐng)指點(diǎn),謝謝!
作者:
cxy822
時(shí)間:
2024-4-14 16:07
就是按P1^4口按鍵執(zhí)行第一種流水燈程序,按P1^5口按鍵執(zhí)行第二種流水燈程序,按鍵調(diào)換順序也沒關(guān)系
作者:
cy009
時(shí)間:
2024-4-18 16:59
流水燈是入門級(jí),沒必要搞這么復(fù)雜的程序,思路才是重要的。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1