欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機程序 想要加兩個按鍵切換流水燈模式,沒加明白,請高人指點,謝謝
[打印本頁]
作者:
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://m.raoushi.com/bbs/)
Powered by Discuz! X3.1