最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【深圳 IO 攻略】阿瓦隆城第 7 關(guān):鈦反應(yīng)堆狀態(tài)

2022-07-03 18:27 作者:ココアお姉ちゃん  | 我要投稿

本文首發(fā)于 B 站《深圳 IO》文集(https://www.bilibili.com/read/readlist/rl569860)。原創(chuàng)不易,轉(zhuǎn)載請注明出處。

關(guān)卡展示

本關(guān)要求你實(shí)現(xiàn)一個(gè)鈦反應(yīng)堆狀態(tài)顯示器。具體的控制方法參考數(shù)據(jù)手冊:

1~5 對應(yīng)五種錯(cuò)誤信號,10~14 對應(yīng)著能源輸出,20~24 對應(yīng)著溫度輸出,30~34 對應(yīng)著操縱桿。

能源/溫度在 0~19?時(shí)亮一格,20~39 時(shí)亮兩格,40~59 時(shí)亮三格,60~79 時(shí)亮四格,80~100 時(shí)亮五格。

操縱桿信號為 0 時(shí)亮 32、33、34 號方塊,信號為 50 時(shí)亮 31、32、33 號方塊,信號為 100 時(shí)亮 30、31、32 號方塊。

需要點(diǎn)亮某個(gè)部件時(shí),將該部件的編號傳入顯示器即可;需要熄滅某個(gè)部件時(shí),將該部件編號的相反數(shù)傳入顯示器即可。

本關(guān)有【錯(cuò)誤】、【能源】、【溫度】、【操縱桿】四大輸入量。最簡單的辦法就是用四塊芯片依次控制這四種輸入量。電路圖和代碼如下:

左上角的 MC4000X 連接著【錯(cuò)誤】輸入,是 1 號芯片。它的任務(wù)比較簡單,收到【錯(cuò)誤】端口的信號后(slx x0),將對應(yīng)的信號值直接發(fā)給顯示器就 OK 了(mov x0 x3)。當(dāng)然只干這么點(diǎn)活未免沒有充分利用這塊 MC4000X 的代碼容量。我們發(fā)現(xiàn),能源/溫度的最低一格的方塊,還有操縱桿的最中間的方塊是常亮的,因此我們在這塊芯片里額外執(zhí)行三條初始化指令,點(diǎn)亮這三個(gè)常亮的方塊(@ mov 32 x3, @ mov 20 x3, @ mov 10 x3)。

位于正中央的 MC6000 連接著【電源】輸入,是 2 號芯片。第一行的代碼(mov -30 x3)是從下方控制操縱桿的 4 號芯片里挪出來的,我們先無視它。

這塊芯片的邏輯嵌套比較多,但很容易理解。當(dāng)電源值在 80~100 范圍內(nèi)時(shí),我們的代碼看起來是這樣的:

點(diǎn)亮編號為 14、13、12、11 的小方塊

當(dāng)電源值在 60~79 范圍內(nèi)時(shí),我們的代碼看起來是這樣的:

熄滅編號為 14 的小方塊,點(diǎn)亮編號為 13、12、11 的小方塊

當(dāng)電源值在 40~59 范圍內(nèi)時(shí),我們的代碼看起來是這樣的:

熄滅編號為 14、13 的小方塊,點(diǎn)亮編號為 12、11 的小方塊

當(dāng)電源值在 20~39 范圍內(nèi)時(shí),我們的代碼看起來是這樣的:

熄滅編號為 14、13、12 的小方塊,點(diǎn)亮編號為 11 的小方塊

當(dāng)電源值在 0~19 范圍內(nèi)時(shí),我們的代碼看起來是這樣的:

熄滅編號為 14、13、12、11 的小方塊

做完這些后,記得休眠一秒,進(jìn)入下一個(gè)時(shí)鐘周期(slp 1)。

最靠近顯示器的 MC6000 連接著【溫度】輸入,是 3 號芯片。3 號芯片的代碼和 2 號芯片大同小異,只是因?yàn)檫@塊芯片控制的是溫度顯示,不是電源顯示,所以操作數(shù)的十位數(shù)都由 1 變成了 2。同樣的邏輯我不再復(fù)述。

最后是最下方的 MC4000。這塊芯片連接著【控制】輸入,是 4 號芯片。這塊芯片本應(yīng)是 10 行代碼??扇绻褂?MC6000 的話,會把本應(yīng)送到 3 號芯片的【溫度】這路輸入給擋住,無法送到 3 號芯片中。因此,這里我選擇了將其中一行代碼(mov -30 x1)挪到 2 號芯片中。2 號芯片的?x3 口連接著顯示器,因此挪過去的代碼也相應(yīng)地產(chǎn)生了變化(mov -30 x3)。這樣本芯片就只有 9 行代碼了,就能換成 MC4000 了。節(jié)省了成本不說,線路板的占用面積也變少了,【溫度】這路輸入信號就能暢通無阻地送到 3 號芯片中了。

那么我們分析的時(shí)候,還是按照完整的 10 行代碼來分析。完整的 10 行代碼是這個(gè)樣子的:

一個(gè)典型的“三態(tài)判定”?!究刂啤枯斎胫挥?0、50、100 三種值,先假設(shè)是中間狀態(tài),點(diǎn)亮 31、33 號小方塊,熄滅 30、34 號小方塊(tcp p0 50, mov -30 x1, mov +31 x1, mov +33 x1, mov -34 x1)。此時(shí)的狀態(tài)是 30、34 熄滅,31、32、33 點(diǎn)亮。

當(dāng)控制輸入是 0 時(shí),在以上操作的基礎(chǔ)上,熄滅 31 號小方塊,點(diǎn)亮 34 號小方塊(- mov -31 x1, - mov +34 x1),最終狀態(tài)變?yōu)?30、31 熄滅,32、33、34 點(diǎn)亮。

當(dāng)控制輸入是 100 時(shí),在以上操作的基礎(chǔ)上,熄滅 33 號小方塊,點(diǎn)亮 30 號小方塊(+ mov -33 x1, +?mov +30 x1),最終狀態(tài)變?yōu)?30、31、32 點(diǎn)亮,33、34 熄滅。

做完以上操作后,休眠一秒,進(jìn)入下一個(gè)時(shí)鐘周期(slp 1)。

點(diǎn)擊左下角的【模擬】,可以看到顯示屏已經(jīng)能顯示出實(shí)時(shí)的反應(yīng)堆狀態(tài)了,非常漂亮:

稍等片刻,便會彈出結(jié)算界面:

優(yōu)化電量

我們的第一版設(shè)計(jì)方案里,耗電量達(dá)到了 1.5K。這是因?yàn)槲覀兠棵腌姸荚谒⑿嘛@示屏。實(shí)際上我們并不需要這么頻繁地刷新,只需要在輸入量產(chǎn)生變化時(shí)刷新即可。輸入量未產(chǎn)生變化時(shí)對顯示屏的一切操作都是【空操作】。

除連接【錯(cuò)誤】輸入信號的 1 號芯片外,其余芯片都可以用 acc 寄存器記錄前一秒的狀態(tài)。僅當(dāng)本秒的狀態(tài)和前一秒不一致時(shí),才需要刷新顯示屏。本方案較上一版方案的改動(dòng)較大,我需要從頭開始重新分析一遍所有的邏輯。電路圖和代碼如下:

此時(shí),為了布線上的方便,1 號芯片從左上角的位置挪到了上方居中的位置,芯片型號由原先的 MC4000X 換成了 MC4000,和顯示器連接的端口變成了 x1。因此該芯片上一版代碼中的 x3 全部替換成 x1。同時(shí),這塊芯片的初始化部分還增加了兩條指令(@ mov 34 x1, @ mov 33 x1),將操縱桿部分初始化為了【控制】輸入為 0?時(shí)的狀態(tài)。任何芯片的 acc 寄存器的初始值都是 0,這里等于是假設(shè)第 0 秒前的第 -1 秒,【控制】輸入是 0。

這里我們先看連接著【控制】輸入的 4 號芯片。這次,因?yàn)榇a量的增加,這塊芯片換成了 MC6000,這樣我們就能把原先挪到 2 號芯片的那行代碼(mov -30 x1)挪回來了。到達(dá)新的一秒后,首先檢查【控制】輸入的值是否和上一秒一致(teq p0 acc)。一致時(shí),直接跳到最后睡覺,無需刷新這部分的顯示(+ jmp d)。不一致時(shí),先將本秒的【控制】值寫入 acc,供下一秒使用。接下來是和上一版方案完全一致的“三態(tài)判定”的過程。這里要注意,芯片換成 MC6000 后,和顯示器通訊的端口變成了 x3,因此這塊芯片上一版代碼中的 x1 要全部替換成 x3。

最復(fù)雜的部分在于控制【電源】和【溫度】顯示的 2 號、3 號芯片。上一版方案里,2 號、3 號芯片已經(jīng)占用掉了 14 和 13 行代碼,已經(jīng)無法再容納“將本秒的狀態(tài)值和 acc 做比較”、“按需跳過刷新過程”以及“將本秒狀態(tài)存入 acc 供下一秒使用”這樣三行代碼了。本方案里,我們使用了循環(huán)結(jié)構(gòu)來刷新【電源】和【溫度】的顯示,且聽我詳細(xì)道來。

電源值和要點(diǎn)亮的小方塊呈如下的映射關(guān)系:

我們可以看到,電源值和要點(diǎn)亮的小方塊的最大編號間的關(guān)系滿足如下數(shù)學(xué)公式:

這里面僅當(dāng) power 為 100 時(shí)是例外情況。當(dāng) power 為 100 時(shí),max = 15。然而我們的顯示器上并沒有編號為 15 的方塊,向顯示器傳入 15 相當(dāng)于【空操作】,不會產(chǎn)生足以影響結(jié)果的 bug。

我們的 2 號、3 號芯片正是圍繞著這個(gè)公式做循環(huán)的?,F(xiàn)在我們來看 2 號芯片的代碼。

首先檢查本秒的狀態(tài)值和上一秒是否一致(teq p0 acc)。一致時(shí),關(guān)閉所有的 - 號指令,直接跳到最后睡覺。不一致時(shí),則將本秒的狀態(tài)值 ×5 后取百位,相當(dāng)于除以 20 后向下取整(- mov p0 acc, - mul 5, - dgt 2),并加上 11 后發(fā)給右邊的 5 號芯片(- add 11, - mov acc x1),然后再發(fā)一個(gè) -15 給右邊的 5 號芯片(- mov -15 x1)。做完這些后,為了方便下一秒鐘和本秒鐘的狀態(tài)做比較,將本秒的狀態(tài)值放入 acc(- mov p0 acc)。然后,我們就可以安心休眠了(slp 1)。

3 號芯片的邏輯和 2 號芯片大同小異,只是所有操作數(shù)的十位數(shù)都由 1 變成了 2。

2 號、3 號芯片的代碼里,向右邊的 5 號芯片發(fā)送了 max+1,以及 -15/-25 這兩個(gè)值,其實(shí)是委托右邊的芯片用循環(huán)的方式,將【11/21 ≤ 編號 < max+1】的燈點(diǎn)亮,將【max+1 ≤ 編號 < 15/25】的燈熄滅。這就是 max+1 及 -15/-25 兩個(gè)數(shù)的意義。我們來分析一下右側(cè) 5 號芯片的代碼:

首先等待左側(cè)的芯片將自己喚醒(slx x1)。喚醒后,我們將收到的 max+1 放入 dat(mov x1 dat),然后將該值復(fù)制一份放入 acc,并將個(gè)位置 1(mov dat acc, dst 0 1),準(zhǔn)備完成“將【11/21?≤?編號 < max+1】的燈點(diǎn)亮”這部分任務(wù)。當(dāng) acc < max+1 時(shí)(tcp acc dat),我們將對應(yīng)的燈點(diǎn)亮(- mov acc x3),然后令 acc +1 以切換到下一個(gè)燈繼續(xù)判斷,直到 acc = max+1 為止(- add 1, - jmp 5)。

此時(shí)我們要注意一下,熄滅一個(gè)燈要傳入對應(yīng)燈編號的相反數(shù)。所以“將【max+1?≤?編號 < 15/25】的燈熄滅”這樣的任務(wù)其實(shí)要做的是“循環(huán)給顯示屏傳送 -max-1 ~ -14/-24 范圍內(nèi)的值”。這里,我們將 max+1 乘以 -1,變成 -max-1(mul -1),并從 x1 口接收第二個(gè)數(shù) -15/-25(mov x1 dat),準(zhǔn)備完成“將【max+1?≤?編號 < 15/25】的燈熄滅”這部分任務(wù)。當(dāng) acc > -15/-25 時(shí)(tcp acc dat),我們將對應(yīng)的燈熄滅(+ mov acc x3),然后令 acc -1(絕對值 +1)以切換到下一個(gè)燈繼續(xù)判斷,直到 acc = -15/-25 為止(+ sub 1, + jmp b)。

點(diǎn)擊左下角的【模擬】,稍等片刻,便會彈出結(jié)算界面:

電量由之前的 1.5K 驟降到 761,效率幾乎提升了一倍!

【深圳 IO 攻略】阿瓦隆城第 7 關(guān):鈦反應(yīng)堆狀態(tài)的評論 (共 條)

分享到微博請遵守國家法律
沾益县| 台北县| 进贤县| 天水市| 阿克陶县| 鄂托克前旗| 房产| 璧山县| 石狮市| 禄劝| 江油市| 南丰县| 固阳县| 海原县| 惠来县| 海伦市| 比如县| 抚州市| 绥宁县| 射阳县| 册亨县| 保德县| 襄樊市| 西乌| 平阳县| 贵州省| 朔州市| 连平县| 青河县| 静安区| 益阳市| 宝鸡市| 应用必备| 邹平县| 清涧县| 班戈县| 陆河县| 乡城县| 东乡族自治县| 高密市| 公安县|