155灯灭(1)163(2)170(3)176(4)182(5)189(6)195(7)201(8)207(9)

五阶点亮所有灯攻略
本文提供了一种解决五阶点亮所有灯问题的有效策略。通过特定的操作步骤,仅需点击少数几个格子即可完成任务。文章详细记录了从初始状态到最终成功点亮所有灯的具体过程。

点亮所有的灯的五阶场景。

155灯灭(1)

依次进行行操作

x1=1,x2=1,x3=0

根据上面的结果求得a=1,b=0,c=0,d=0,e=1

所以依次点击第一行的每个格子的次数是1,0,0,0,1,变成下图

然后依次进行行操作

163(2)

一样的操作,实际上只点了4个格子就过关了

170(3)

为了对称,把手机旋转90度

依次进行行操作得到下图

发现和155灯灭(1)是一样的

176(4)

依次进行行操作,发现和155灯灭(1)还是一样的

182(5)

方法和170(3)一样,旋转90度,得到的结果也和170(3)一样

189(6)

依次进行行操作,发现和155灯灭(1)还是一样的

195(7)

依次进行行操作,得到下图

x1=1,x2=0,x3=0

所以a=b=c=0,d=e=1

所以依次点击第一行的每个格子的次数是0,0,0,1,1,变成下图

依次进行行操作

201(8)

依次进行行操作,得到下图

x1=0,x2=1,x3=0

所以a=d=1,b=c=e=0

依次进行行操作即可

207(9)

依次进行行操作即可

86 void wendu display()8788 char str[20]={0};// int int digital[10]={0};//小数前整数部分 89 90 int dec_digital[10]={0};//小数后面部分 91 int int count=0;//整数位数 92 int dec count=0;//小数位数 93 int dot pos,i,j,k,h=0; 94 sprintf(str,"%.2f",sht20_data.temperature);//转为字符串 95 for(h=0;h<strlen(str);h++) 96 97 if (str[h] == &#39;.&#39;) 9899 dot pos=h;//分割小数和整数部分 100 break; 101102 103 for(j=0;j<dot_pos;j++) 104105 int_digital [int_count++]=str[j]-&#39;0&#39;; 106 107 for (k=dot pos+l;k<strlen (str);k++) 108109 dec digital[dec count++]=str[k]-&#39;0&#39;; 110 111 动态扫描显示4位数码管,利用视觉暂留避免闪烁 112日 for (i = 0;i<4; i++){ 113 uint8 t show data = 0; //根据当前位选,确定要显示的数字 114 uint8 t with dot=0; //是否显示小数点 115日 switch (i)[ 116 case 0: 117 // 显示十位 118白 if (int count>= 2) { 119 show_data = int_digital[0]; 120 121 else{ 122 show data =0; 123 124 break; 125 126 case 1: 127 // 显示个位,带小数点 128 if (int count>=1){ 129 show data = int_digital[int_count-1]; 130 with_dot = 1; // 个位后显示小数点 131 132 break; 133 case 2: // 十分位 134 show_data = (dec_count>= 1) ? dec_digital[0]:0; 135 break; 136 137 case 3: // 百分位 138 show_data = (dec_count >= 2) ? dec_digital[1]:0; 139 break; 140 141 // 叠加小数点段码 142白 if (with dot){ 143 show_data = seg_code[show_data] | seg code[10]; 144 145白 else { 146 show_data = seg_code[show_data]; 147 } 148 // 驱动对应位的数码管显示数字(这里假设 drv seg_display按位选和段选正确驱动 149 drv seg display(i,show data); 150 // 短暂延时,保证显示稳定,利用视觉暂留形成完整显示 151 systick us(500); 152 } 153} 154//定时器 155 void time6 shu init(void)156日{ 157 TIM_TimeBaseInitTypeDefTIM TimeBaseInitstruct; 158 NVIC_InitTypeDef NVIC_Initstruct; 159 RCCPB1PeriphClockCmd(RCCAPB1Periph TIM6,ENABLE); 160 TIM TimeBaseInitStruct.TIM ClockDivision = TIM CKD DIVI; 161 TIM TimeBaseInitstruct.TIM CounterMode = TIM CounterMode Up; 162 TIM TimeBaseInitStruct.TIM Period = 1000-1; 163 TIM TimeBaseInitstruct.TIM Prescaler =84-1; 164 TIM TimeBaseInit(TIM6,&TIM TimeBaseInitstruct); 165 TIM ITConfig(TIM6,TIM_IT_Update, ENABLE); 166 167 NVIC Initstruct.NVIC IRQChannel= TIM6 DAC IRQN; 168 NVIC_Initstruct.NVIC_IRQChannelCmd = ENABLE; 169 NVIC Initstruct.NVIC IRQChannelPreemptionPriority =1; 170 NVIC Initstruct.NVIC IRQChannelSubPriority =0; 171 NVIC Init(&NVIC Initstruct); 172 TIM Cmd(TIM6,ENABLE); 173 174//服务中断函数 175 void TIM6 DAC IRQHandler(void)176日{ 177 if(TIM GetITstatus(TIM6, TIM IT Update)) 178 179 //wendu_display(); // 每次中断执行显示扫描 180 TIM_ClearITPendingBit(TIM6, TIM_IT_Update);//清除中断标志 为什么数码管不显示数据?
07-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值