久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
單片機程序 想要加兩個按鍵切換流水燈模式,沒加明白,請高人指點,謝謝
[打印本頁]
作者:
cxy822
時間:
2024-4-14 16:03
標(biāo)題:
單片機程序 想要加兩個按鍵切換流水燈模式,沒加明白,請高人指點,謝謝
新手求助:有兩種流水燈形式,想要在單片機P1^5和P1^4口加兩個按鍵切換流水燈模式,按鍵程序搞半天也沒整明白,請高人指點,謝謝!第一個:
#include <reg51.h> //包含頭文件
#include <stdlib.h> //庫文件,使用隨機數(shù)發(fā)生函數(shù)
typedef unsigned char uchar; //無符號字符型數(shù)據(jù)
typedef unsigned int uint; //無符號整型數(shù)據(jù)
sbit ST=P3^2; //74HC595寄存器輸入端口
sbit Key1=P1^6; //按鍵開始
sbit Key2=P1^7; //按鍵停止
bit flag=0; //定時時間標(biāo)志位
uchar num[5]; //產(chǎn)生的隨機數(shù)
uchar num1[2];
uchar cnt; //計數(shù)變量
uchar str[5]= {0xff,0xff,0xff,0xff,0xff}; //定義數(shù)組存放35個LED數(shù)據(jù)
uchar str1[2]= {0xff,0xff}; //定義數(shù)組存放12個LED數(shù)據(jù)
void Delay_Us(int i); //延時函數(shù)
void Timer_Init(void); //定時器初始化
void UART_Init(void); //串口初始化
void UART_Send(uchar dat); //串口發(fā)送數(shù)據(jù)
//主函數(shù)
void main(void)
{
uchar i,j,k; //定義變量
UART_Init(); //串口初始化
Timer_Init(); //定時器初始化
for(i=0; i<5; i++) //循環(huán)5次發(fā)送數(shù)據(jù)
{ //35個LED初始狀態(tài),全部熄滅
UART_Send(str[i]);
}
P1=0xff; //12個LED初始狀態(tài),全部熄滅
P2=0xff;
while(1)
{
if(flag) //定時時間到
{
flag=0; //標(biāo)志位清零
/*----35抽取5個LED-----*/
for(i=0; i<5; i++) //所有燈熄滅
{
str[i]=0xff;
}
for(i=0; i<5; i++)
{
k=rand()%35; //產(chǎn)生隨機數(shù)0-34
for(j=0; j<i ; j++)
{
while(num[j]==k) //如果產(chǎn)生的隨機數(shù)與之前的相同,則重新生成
{
k=rand()%35;
}
}
num[i]=k;
str[num[i]/8]&=~(0x01<<(num[i]%8)); //將隨機數(shù)轉(zhuǎn)換為對應(yīng)的LED數(shù)據(jù)
}
for(i=0; i<5; i++) //循環(huán)5次發(fā)送數(shù)據(jù)
{
UART_Send(str[i]);
}
/*----12抽取2個LED-----*/
str1[0]=0xff; //12個LED全部熄滅
str1[1]=0xff;
for(i=0; i<2; i++)
{
k=rand()%12; //產(chǎn)生隨機數(shù)0-11
for(j=0; j<i ; j++)
{
while(num1[j]==k) //如果產(chǎn)生的隨機數(shù)與之前的相同,則重新生成
{
k=rand()%12;
}
}
num1[i]=k;
str1[num1[i]/8]&=~(0x01<<(num1[i]%8)); //將隨機數(shù)轉(zhuǎn)換為對應(yīng)的LED數(shù)據(jù)
}
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; //產(chǎn)生隨機數(shù)0-34
for(j=0; j<i ; j++)
{
while(num[j]==k)//如果產(chǎn)生的隨機數(shù)與之前的相同,則重新生成
{
k=rand()%35;
}
}
num[i]=k;
str[num[i]/8]&=~(0x01<<(num[i]%8)); //將隨機數(shù)轉(zhuǎn)換為對應(yīng)的LED數(shù)據(jù)
}
for(i=0; i<5; i++) //循環(huán)5次發(fā)送數(shù)據(jù)
{
UART_Send(str[i]);
}
/*----12抽取2個LED-----*/
str1[0]=0xff; //12個LED全部熄滅
str1[1]=0xff;
for(i=0; i<2; i++)
{
k=rand()%12; //產(chǎn)生隨機數(shù)0-11
for(j=0; j<i ; j++)
{
while(num1[j]==k) //如果產(chǎn)生的隨機數(shù)與之前的相同,則重新生成
{
k=rand()%12;
}
}
num1[i]=k;
str1[num1[i]/8]&=~(0x01<<(num1[i]%8)); //將隨機數(shù)轉(zhuǎn)換為對應(yīng)的LED數(shù)據(jù)
}
P1=str1[1]; //控制12個LED點亮
P2=str1[0];
}
while(Key2==0); //按鍵松手檢測
}
}
}
//延時函數(shù)
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; //發(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;
}
//定時器0中斷函數(shù)
void Timer0() interrupt 1
{
TH0=0x3c; //定時50ms
TL0=0xb0;
cnt++; //中斷計數(shù)
if(cnt==6)
{
cnt=0;
flag=1; //標(biāo)志位置1
}
}
復(fù)制代碼
第二個:
#include <reg51.h> //包含頭文件
#include <stdlib.h> //庫文件,使用隨機數(shù)發(fā)生函數(shù)
typedef unsigned char uchar; //無符號字符型數(shù)據(jù)
typedef unsigned int uint; //無符號整型數(shù)據(jù)
sbit ST=P3^2; //74HC595寄存器輸入端口
sbit Key1=P1^6; //按鍵開始
sbit Key2=P1^7; //按鍵停止
bit flag=0; //定時時間標(biāo)志位
uchar num[7]; //產(chǎn)生的隨機數(shù)
uchar num1[2];
uchar cnt; //計數(shù)變量
uchar str[5]= {0xff,0xff,0xff,0xff,0xff}; //定義數(shù)組存放35個LED數(shù)據(jù)
uchar str1[2]= {0xff,0xff}; //定義數(shù)組存放12個LED數(shù)據(jù)
void Delay_Us(int i); //延時函數(shù)
void Timer_Init(void); //定時器初始化
void UART_Init(void); //串口初始化
void UART_Send(uchar dat); //串口發(fā)送數(shù)據(jù)
//主函數(shù)
void main(void)
{
uchar i,j,k; //定義變量
UART_Init(); //串口初始化
Timer_Init(); //定時器初始化
for(i=0; i<5; i++) //循環(huán)5次發(fā)送數(shù)據(jù)
{ //35個LED初始狀態(tài),全部熄滅
UART_Send(str[i]);
}
P1=0xff; //12個LED初始狀態(tài),全部熄滅
P2=0xff;
while(1)
{
if(flag) //定時時間到
{
flag=0; //標(biāo)志位清零
/*----35抽取5個LED-----*/
for(i=0; i<5; i++) //所有燈熄滅
{
str[i]=0xff;
}
for(i=0; i<7; i++)
{
k=rand()%35; //產(chǎn)生隨機數(shù)0-34
for(j=0; j<i ; j++)
{
while(num[j]==k) //如果產(chǎn)生的隨機數(shù)與之前的相同,則重新生成
{
k=rand()%35;
}
}
num[i]=k;
str[num[i]/8]&=~(0x01<<(num[i]%8)); //將隨機數(shù)轉(zhuǎn)換為對應(yīng)的LED數(shù)據(jù)
}
for(i=0; i<5; i++) //循環(huán)5次發(fā)送數(shù)據(jù)
{
UART_Send(str[i]);
}
/*----12抽取2個LED-----*/
str1[0]=0xff; //12個LED全部熄滅
str1[1]=0xff;
for(i=0; i<2; i++)
{
k=rand()%12; //產(chǎn)生隨機數(shù)0-11
for(j=0; j<i ; j++)
{
while(num1[j]==k) //如果產(chǎn)生的隨機數(shù)與之前的相同,則重新生成
{
k=rand()%12;
}
}
num1[i]=k;
str1[num1[i]/8]&=~(0x01<<(num1[i]%8)); //將隨機數(shù)轉(zhuǎn)換為對應(yīng)的LED數(shù)據(jù)
}
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; //產(chǎn)生隨機數(shù)0-34
for(j=0; j<i ; j++)
{
while(num[j]==k)//如果產(chǎn)生的隨機數(shù)與之前的相同,則重新生成
{
k=rand()%35;
}
}
num[i]=k;
str[num[i]/8]&=~(0x01<<(num[i]%8)); //將隨機數(shù)轉(zhuǎn)換為對應(yīng)的LED數(shù)據(jù)
}
for(i=0; i<5; i++) //循環(huán)5次發(fā)送數(shù)據(jù)
{
UART_Send(str[i]);
}
/*----12抽取2個LED-----*/
str1[0]=0xff; //12個LED全部熄滅
str1[1]=0xff;
for(i=0; i<2; i++)
{
k=rand()%12; //產(chǎn)生隨機數(shù)0-11
for(j=0; j<i ; j++)
{
while(num1[j]==k) //如果產(chǎn)生的隨機數(shù)與之前的相同,則重新生成
{
k=rand()%12;
}
}
num1[i]=k;
str1[num1[i]/8]&=~(0x01<<(num1[i]%8)); //將隨機數(shù)轉(zhuǎn)換為對應(yīng)的LED數(shù)據(jù)
}
P1=str1[1]; //控制12個LED點亮
P2=str1[0];
}
while(Key2==0); //按鍵松手檢測
}
}
}
//延時函數(shù)
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; //發(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;
}
//定時器0中斷函數(shù)
void Timer0() interrupt 1
{
TH0=0x3c; //定時50ms
TL0=0xb0;
cnt++; //中斷計數(shù)
if(cnt==6)
{
cnt=0;
flag=1; //標(biāo)志位置1
}
}
復(fù)制代碼
請指點,謝謝!
作者:
cxy822
時間:
2024-4-14 16:07
就是按P1^4口按鍵執(zhí)行第一種流水燈程序,按P1^5口按鍵執(zhí)行第二種流水燈程序,按鍵調(diào)換順序也沒關(guān)系
作者:
cy009
時間:
2024-4-18 16:59
流水燈是入門級,沒必要搞這么復(fù)雜的程序,思路才是重要的。
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
一区二区三区网站
|
精品精品
|
黄色片视频免费
|
国产一级黄色大片
|
69精品视频
|
91久久国产综合久久91精品网站
|
日韩小视频
|
欧美成人三级在线观看
|
成人动漫在线看
|
亚洲欧美网站
|
成人在线国产
|
五月在线视频
|
精品福利一区
|
日本久久综合
|
美女免费网站
|
九九视频在线免费观看
|
免费网站av
|
国产精品久久久久久久久久久久午夜片
|
国产草草
|
青青久久
|
性生活毛片
|
亚洲视频在线免费观看
|
日本黄网站
|
亚洲一区在线视频
|
国产精品一二三区
|
操出白浆视频
|
亚洲一区二区免费看
|
久久激情视频
|
毛片视频网站
|
亚洲精品久
|
国产三级在线播放
|
日韩一级在线观看
|
黑森林av
|
日韩视频网
|
亚洲国产成人精品女人久久久
|
久久精品一区二区三区四区
|
午夜aaa
|
久久伊人网站
|
黄色av毛片
|
毛片视频免费观看
|
亚洲国产精品一区
|