又来麻烦大家啦,按键切换两个程序,始终没整成功,求大佬们指点,谢谢!
用两个按键切换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
- }
- }
复制代码
|