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