TA的每日心情 | 开心 2025-3-27 15:54 |
---|
签到天数: 18 天 [LV.4]偶尔看看III
|
本帖最后由 pigdragon 于 2022-12-9 17:49 编辑 ( o: q6 [7 G9 J M3 p- z8 n. i
$ `- u( P m$ w! T( p' x9 v- s/ y你程序几个错误. }: m( H8 z+ b2 N
-----------------, S' Q# `4 G& {
你的亮灯全部亮错了,你说好歹有一次灯亮对了,是不是?不,你的第一次是第二个灯亮(D1灯),而不是引脚0的第一个灯亮.我们分析如下:
/ Q5 A0 w3 x! N你的语句是P0=P0<<1;该语句在循环体中实际执行效果写下来应当是:5 h+ b* a. O; o$ q
-- u& q5 C/ |2 K( L8 {$ @9 s8 @1 W4 _) [
第1次,索引i是0:原来的P0是1111 1110,新的P0赋值:1111 1100 9 x1 m- s+ v& w" }1 f! {( }7 C. i
第2次,索引i是1:原来的P0是1111 1100,新的P0赋值:1111 1000, q4 C1 K) C6 Y$ V' k2 X: ]5 j; Y1 U
第3次,索引i是2:原来的P0是1111 1000,新的P0赋值:1111 00001 ^4 W% O1 x5 h' e1 M
....5 |# a% X4 o3 `
第6次,索引i是5:原来的P0是1100 0000,新的P0赋值:1000 0000/ o h$ H& {) r. t5 z
第7次,索引i是6:原来的P0是1000 0000,新的P0赋值:0000 0000
5 T2 i( m6 u: o( m-你这里有错误,索引应该是7,不应该开始下一个for循环(是i<=7哦,不是i<7)
q- G6 d( o/ \& O! V& n1 W0 y+ T第8次,索引i是7:原来的P0是0000 0000,新的P0赋值:0000 0000
: x2 n+ m0 ~! {- @6 D' A-正常的话下面是新的循环开始,但是,因为代码的while(1)内部P0在for循环后再执行for循环的时候P0没有被改变过,所以P0以后一直是0x0了.
) ^* ]3 M6 F. P$ w# V- m第9次,索引i是0:原来的P0是0000 0000,不在改变,新的P0赋值:0000 0000也不再改变.
6 B* R6 ]/ [$ |6 w3 J, i! g# ~.......
7 L0 v# P; x# @% ^) P/ j O所有灯全亮,不再改变.
, Z# D# r9 v% T" t& @7 q------
( C1 T" h8 I% |/ b S/ J
% j# N" I( B$ X) u5 Q% _( Y) ?-怎么修改呢?: }7 q) A, R/ @! j
---------------------' a4 U v4 a0 e2 ]" K
搞不明白怎么做的话,就像我上面的写的分析,要用笨办法,当然笨办法是最可靠的办法.就是手动写出过程,我们应当这样做:
! t( Q9 O/ D6 u7 [ A原理图属于低电平亮的电路,这样每次让一个引脚为低电平即可点亮,下一次让下一个引脚为低电平,其它为高电平.
% M* i- U( _* h2 y6 Q9 s" v4 x第1次,索引i应为0,P0输出应该为 1111 1110)b = 0xFE,D7亮# c6 Y, [/ O( |" W P& O/ A
第2次,索引i应为1,P0输出应该为 1111 1101)b = 0xFD,D1亮 ......奇怪,灯的编号??$ ^2 R% W* a, n
第3次,索引i应为2,P0输出应该为 1111 1011)b = 0xFB,D2亮: e0 P) ~3 N2 ~; }! F
....
, {, P4 o% S Y第8次,索引i应为7,P0输出应该为:(0111 1111)b =0xEF,D8亮.
* ]9 H8 U& G2 s% B$ E) w第9次,,索引i应为8?不,应该重新开始点亮第一个灯D7,此时所以i应该置为0,当然也有别的方法不管它继续执行,也可以满足要求.
% K! X0 r( m0 N+ Y其中:
( x5 b; U$ n& A* \0 Q/ l第1次很重要,第8次很重要,第9次也很重要,为什么呢?
9 X9 x, \& g, [1 U# c第1次是起始状态,你应该满足它的工作条件; , X; [. Y; X% |; [# R0 C* g* n) o* ~
第8次是结束状态,你应该满足它的工作条件;3 }4 Z/ e/ l4 x! ~9 r
学习微积分这些高等数学的时候,我们一天到晚确认边界条件,因为边界条件很重要,我们做一些事情的时候,需要根据情况,一会儿这么干,一会儿那么干,所有的事归类为开始条件,干法,结束条件,它们是一个整体,任何一个条件错,整体都是错的.如果第一次条件和干法与循环体内的条件,不一致的时候,单独列出单独完成;同样,结束时的条件和干法也如此.' f V0 l1 |/ O& V K; D* D; A
第9次是重新开始循环的状态,你应该重新返回初始边界,要执行"重设初始条件"的动作,满足它的工作条件,所有的程序员都犯过在跳回重新开始循环的时候漏了执行循环所需要的初始条件的事,造成错误. ! p/ i6 Q) R @" y( u+ j3 V
--------------------------------------------------------------
' G, N1 T3 @) { O, r3 c |
|