|
又來麻煩大家啦,按鍵切換兩個(gè)程序,始終沒整成功,求大佬們指點(diǎn),謝謝!
用兩個(gè)按鍵切換disp0和disp1,兩個(gè)程序都可獨(dú)立運(yùn)行,加上按鍵切換就是切換不了,請(qǐng)大佬指點(diǎn)!本人也是剛學(xué),繞不明白啦。感謝
單片機(jī)源程序如下:
- #include <STC8h.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 Key1=P1^6; //按鍵開始
- sbit Key2=P1^7; //按鍵停止
- bit flag=0; //定時(shí)時(shí)間標(biāo)志位
- uchar num[6]; //產(chǎn)生的隨機(jī)數(shù)
- uchar num1[1];
- uchar num2[7]; //產(chǎn)生的隨機(jī)數(shù)
- uchar num3[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 disp0()
- {
- uchar i,j,k; //定義變量
- UART_Init(); //串口初始化
- Timer_Init(); //定時(shí)器初始化
- P7M0=0X00;P7M1=0X00;//設(shè)置P0口為準(zhǔn)雙向口狀態(tài),弱上位
- P2M0=0X00;P2M1=0X00;
- P4M0=0X00;P4M1=0X00;
- P0M0=0X00;P0M1=0X00;
- P1M0=0X00;P1M1=0X00;
- P3M0=0X00;P3M1=0X00;
- P6M0=0X00;P6M1=0X00;
- { //35個(gè)LED初始狀態(tài),全部熄滅
- UART_Send(str[i]);
- }
- P0=0xff; //12個(gè)LED初始狀態(tài),全部熄滅
- P1=0xff;
- P2=0xff; //12個(gè)LED初始狀態(tài),全部熄滅
- P3=0xff;
- P4=0xff; //12個(gè)LED初始狀態(tài),全部熄滅
- P6=0xff;
- P7=0xff;
- while(1)
- {
- if(flag) //定時(shí)時(shí)間到
- {
- flag=0; //標(biāo)志位清零
- /*----33抽取6個(gè)LED-----*/
- for(i=0; i<5; i++) //所有燈熄滅
- {
- str[i]=0xff;
- }
- for(i=0; i<6; i++)
- {
- k=rand()%33; //產(chǎn)生隨機(jī)數(shù)0-32
- for(j=0; j<i ; j++)
- {
- while(num[j]==k) //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
- {
- k=rand()%33;
- }
- }
- num[i]=k;
- str[num[i]/8]&=~(0x01<<(num[i]%8)); //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
- }
- P2=str[0]; //控制35個(gè)LED點(diǎn)亮
- P0=str[1];
- P7=str[2]; //控制35個(gè)LED點(diǎn)亮
- P6=str[3];
- P1=str[4];
- {
- UART_Send(str[i]);
- }
- /*----16抽取1個(gè)LED-----*/
- str1[0]=0xff; //12個(gè)LED全部熄滅
- str1[1]=0xff;
- for(i=0; i<1; i++)
- {
- k=rand()%16; //產(chǎn)生隨機(jī)數(shù)0-15
- for(j=0; j<i ; j++)
- {
- while(num1[j]==k) //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
- {
- k=rand()%16;
- }
- }
- num1[i]=k;
- str1[num1[i]/8]&=~(0x01<<(num1[i]%8)); //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
- }
- P4=str1[0]; //控制16個(gè)LED點(diǎn)亮
- P3=str1[1];
- }
- if(Key1==0)//按鍵開始
- {
- Delay_Us(500);//延時(shí)消抖
- if(Key1==0)
- {
- TR0 =!TR0;
- }
- while(Key1==0); //按鍵松手檢測(cè)
- }
- if(Key1==0) //按鍵停止
- {
- Delay_Us(500); //延時(shí)消抖
- if(Key1==0)
- {
- TR0=0;
- /*----33抽取6個(gè)LED-----*/
- for(i=0; i<5; i++) //所有燈熄滅
- {
- str[i]=0xff;
- }
- for(i=0; i<6; i++)
- {
- k=rand()%33; //產(chǎn)生隨機(jī)數(shù)0-32
- for(j=0; j<i ; j++)
- {
- while(num[j]==k)//如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
- {
- k=rand()%33;
- }
- }
- num[i]=k;
- str[num[i]/8]&=~(0x01<<(num[i]%8)); //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
- }
- P2=str[0]; //控制35個(gè)LED點(diǎn)亮
- P0=str[1];
- P7=str[2]; //控制35個(gè)LED點(diǎn)亮
- P6=str[3];
- P1=str[4];
- {
- UART_Send(str[i]);
- }
- /*----16抽取1個(gè)LED-----*/
- str1[0]=0xff; //12個(gè)LED全部熄滅
- str1[1]=0xff;
- for(i=0; i<1; i++)
- {
- k=rand()%16; //產(chǎn)生隨機(jī)數(shù)0-15
- for(j=0; j<i ; j++)
- {
- while(num1[j]==k) //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
- {
- k=rand()%16;
- }
- }
- num1[i]=k;
- str1[num1[i]/8]&=~(0x01<<(num1[i]%8)); //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
- }
- P4=str1[0]; //控制16個(gè)LED點(diǎn)亮
- P3=str1[1];
- }
- while(Key1==0); //按鍵松手檢測(cè)
- }
- }
- }
- void disp1()
- {
- uchar i,j,k; //定義變量
- UART_Init(); //串口初始化
- Timer_Init(); //定時(shí)器初始化
- P7M0=0X00;P7M1=0X00;//設(shè)置P0口為準(zhǔn)雙向口狀態(tài),弱上位
- P2M0=0X00;P2M1=0X00;
- P4M0=0X00;P4M1=0X00;
- P0M0=0X00;P0M1=0X00;
- P1M0=0X00;P1M1=0X00;
- P3M0=0X00;P3M1=0X00;
- P6M0=0X00;P6M1=0X00;
- { //35個(gè)LED初始狀態(tài),全部熄滅
- UART_Send(str[i]);
- }
- P0=0xff; //12個(gè)LED初始狀態(tài),全部熄滅
- P1=0xff;
- P2=0xff; //12個(gè)LED初始狀態(tài),全部熄滅
- P3=0xff;
- P4=0xff; //12個(gè)LED初始狀態(tài),全部熄滅
- P6=0xff;
- P7=0xff;
- while(2)
- {
- if(flag) //定時(shí)時(shí)間到
- {
- flag=0; //標(biāo)志位清零
- /*----33抽取7個(gè)LED-----*/
- for(i=0; i<5; i++) //所有燈熄滅
- {
- str[i]=0xff;
- }
- for(i=0; i<7; i++)
- {
- k=rand()%33; //產(chǎn)生隨機(jī)數(shù)0-32
- for(j=0; j<i ; j++)
- {
- while(num2[j]==k) //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
- {
- k=rand()%33;
- }
- }
- num2[i]=k;
- str[num2[i]/8]&=~(0x01<<(num2[i]%8)); //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
- }
- P2=str[0]; //控制35個(gè)LED點(diǎn)亮
- P0=str[1];
- P7=str[2]; //控制35個(gè)LED點(diǎn)亮
- P6=str[3];
- P1=str[4];
- {
- UART_Send(str[i]);
- }
- /*----16抽取2個(gè)LED-----*/
- str1[0]=0xff; //12個(gè)LED全部熄滅
- str1[1]=0xff;
- for(i=0; i<2; i++)
- {
- k=rand()%16; //產(chǎn)生隨機(jī)數(shù)0-15
- for(j=0; j<i ; j++)
- {
- while(num3[j]==k) //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
- {
- k=rand()%16;
- }
- }
- num3[i]=k;
- str1[num3[i]/8]&=~(0x01<<(num3[i]%8)); //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
- }
- P4=str1[0]; //控制16個(gè)LED點(diǎn)亮
- P3=str1[1];
- }
- if(Key2==0)//按鍵開始
- {
- Delay_Us(500);//延時(shí)消抖
- if(Key2==0)
- {
- TR0 =!TR0;
- }
- while(Key2==0); //按鍵松手檢測(cè)
- }
- if(Key2==0) //按鍵停止
- {
- Delay_Us(500); //延時(shí)消抖
- if(Key2==0)
- {
- TR0=0;
- /*----33抽取7個(gè)LED-----*/
- for(i=0; i<5; i++) //所有燈熄滅
- {
- str[i]=0xff;
- }
- for(i=0; i<7; i++)
- {
- k=rand()%33; //產(chǎn)生隨機(jī)數(shù)0-32
- for(j=0; j<i ; j++)
- {
- while(num2[j]==k)//如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
- {
- k=rand()%33;
- }
- }
- num2[i]=k;
- str[num2[i]/8]&=~(0x01<<(num2[i]%8)); //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
- }
- P2=str[0]; //控制35個(gè)LED點(diǎn)亮
- P0=str[1];
- P7=str[2]; //控制35個(gè)LED點(diǎn)亮
- P6=str[3];
- P1=str[4];
- {
- UART_Send(str[i]);
- }
- /*----16抽取2個(gè)LED-----*/
- str1[0]=0xff; //12個(gè)LED全部熄滅
- str1[1]=0xff;
- for(i=0; i<2; i++)
- {
- k=rand()%16; //產(chǎn)生隨機(jī)數(shù)0-15
- for(j=0; j<i ; j++)
- {
- while(num3[j]==k) //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
- {
- k=rand()%16;
- }
- }
- num3[i]=k;
- str1[num3[i]/8]&=~(0x01<<(num3[i]%8)); //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
- }
- P4=str1[0]; //控制16個(gè)LED點(diǎn)亮
- P3=str1[1];
- }
- while(Key2==0); //按鍵松手檢測(cè)
- }
- }
- }
- void main()
- {
- while(1)
- {
- if(Key1==0)//按鍵開始
- {
- Delay_Us(500);//延時(shí)消抖
- if(Key1==0)
- {
- disp0(); //12選2
- }
- while(Key1==0);
- }
- if(Key2==0)//按鍵開始
- {
- Delay_Us(500);//延時(shí)消抖
- if(Key2==0)
- {
- disp1(); //12選4
- }
- while(Key2==0);
- }
- }
- }
- //延時(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)
- {
- SBUF=dat; //LED數(shù)據(jù)
- while(~TI); //等待發(fā)送完成
- TI=0; //標(biāo)志位清零
- }
- //定時(shí)器0中斷函數(shù)disp0
- void Timer0() interrupt 1
- {
- TH0=0x3c; //定時(shí)50ms
- TL0=0xb0;
- cnt++; //中斷計(jì)數(shù)
- if(cnt==3)
- {
- cnt=0;
- flag=1; //標(biāo)志位置1
- }
- }
復(fù)制代碼
|
|