用STC單片機(jī)制作萬(wàn)能的或非門(mén)邏輯處理器-可處理所有的門(mén)電路組合復(fù)雜運(yùn)算-全球首發(fā)!
可將世界上所有的數(shù)字電路轉(zhuǎn)換成或非門(mén)電路線(xiàn)路連接組合使用該模擬器完成。
是目前世界上制作原理最簡(jiǎn)單的,功能最強(qiáng)大的CPU處理器。
只要世界上任意一種編程語(yǔ)言支持?jǐn)?shù)組、循環(huán)、判斷、計(jì)算功能即可100%成功移植。
世界上所有的數(shù)字電路都是由大量的邏輯門(mén) 包括與門(mén)、或門(mén)、非門(mén)3種基本邏輯門(mén)組成。
世界上所有的復(fù)雜運(yùn)算功能都是通過(guò)大量的邏輯門(mén)組合運(yùn)算自動(dòng)完成。
可修改為更高位的地址寬度,但需要容量更大容量的存儲(chǔ)器。
使用純與非門(mén)、或非門(mén)電路即可組成與門(mén)、或門(mén)、非門(mén)。
所有CPU內(nèi)部邏輯門(mén)組合數(shù)據(jù)轉(zhuǎn)換成或非門(mén)組合數(shù)據(jù)即可移植到該模擬器里。
使用或非門(mén)組成的數(shù)字電路對(duì)每一根接線(xiàn)進(jìn)行編號(hào)并且寫(xiě)入ROM即可完成編程功能。
8051指令集單片機(jī)型號(hào)任意直接編譯即可,其余指令集可能需要修改頭文件以及程序源碼或者根據(jù)該CPU指令執(zhí)行過(guò)進(jìn)行移植與編寫(xiě),
支持世界上任何平臺(tái)指令集的CPU模擬,只要容量足夠就可以準(zhǔn)確無(wú)誤的模擬。
與門(mén):全1出1,有0出0 燈座上有個(gè)開(kāi)關(guān),插線(xiàn)板上有另一個(gè)開(kāi)關(guān),兩個(gè)開(kāi)關(guān)必須打開(kāi)燈泡即可點(diǎn)亮,否則無(wú)法點(diǎn)亮。
或門(mén):有1出1,全0出0 兩個(gè)并聯(lián)的開(kāi)關(guān)打開(kāi)其中一個(gè)后燈泡就能點(diǎn)亮,兩個(gè)開(kāi)關(guān)全部關(guān)閉后則無(wú)法點(diǎn)亮。
非門(mén):進(jìn)1出0 進(jìn)0出1 燈泡并聯(lián)開(kāi)關(guān),開(kāi)關(guān)打開(kāi)后由于電源短路的電阻小于燈泡電阻,燈泡熄滅,否則就能點(diǎn)亮。
使用以上三種基本邏輯門(mén)組合即可實(shí)現(xiàn)世界上各種復(fù)雜的運(yùn)算。
異或門(mén):相異出1,相同出0,全0出0,全1出0,否則出1。
同或門(mén):異或門(mén)輸出串聯(lián)非門(mén),相同出1,相異出0,全0出1,全1出1,否則出0。
與非門(mén):與門(mén)輸出串聯(lián)非門(mén),全1出0 有0出1。
或非門(mén):或門(mén)輸出串聯(lián)非門(mén),有1出0 全0出1。
世界上所有的數(shù)據(jù)的計(jì)算、存儲(chǔ)、傳輸、等在數(shù)納秒的時(shí)間內(nèi)自動(dòng)完成的事件都是由無(wú)數(shù)個(gè)基本邏輯門(mén)組合而實(shí)現(xiàn)。
邏輯電路分為兩大類(lèi):分別是組合邏輯電路和時(shí)序邏輯電路。
組合邏輯電路不包含記憶存儲(chǔ)功能,具有固定的真值表。
例如:全加器、全減器、乘法器、除法器、譯碼器、數(shù)據(jù)選擇器、數(shù)據(jù)分配器、數(shù)字大小比較器、BCD代碼轉(zhuǎn)換器等。
時(shí)序邏輯電路是一種具有記憶儲(chǔ)存功能的邏輯電路。
例如:計(jì)數(shù)器、鎖存器、觸發(fā)器、寄存器、存儲(chǔ)器等。
P0~P7口直接與RAM地址0~7(字節(jié))連接。
ROM共768字節(jié),RAM共256位(32字節(jié))。
每條指令共3字節(jié)(共256條指令)。
指令格式:輸入地址1 輸出地址 輸入地址2。
指令執(zhí)行過(guò)程:
從輸入地址1和輸入地址2,送入RAM的地址線(xiàn),根據(jù)地址找到RAM位數(shù)據(jù)。
經(jīng)過(guò)或非比較后將結(jié)果寫(xiě)入輸出地址,結(jié)果1位位值經(jīng)過(guò)該地址寫(xiě)回并覆蓋RAM。
觸發(fā)程序計(jì)數(shù)器加3,繼續(xù)根據(jù)以上方法執(zhí)行下面的指令。
程序計(jì)數(shù)器大于等于768或遇到0xFF指令則清零,從頭執(zhí)行指令。
可改成16位或更高位寬度以支持更大規(guī);蚍情T(mén)運(yùn)算。
1條指令的字節(jié)數(shù)=位數(shù)/8*3
需要的RAM字節(jié)數(shù)=2^位數(shù)/8
需要的ROM字節(jié)數(shù)=1條指令的字節(jié)數(shù)*2^位數(shù)
8位需要32B的RAM和786B的ROM。
16位需要8KB的RAM和384KB的ROM。
24位需要2MB的RAM和144MB的ROM。
32位需要512MB的RAM和48GB的ROM。
48位需要32TB的RAM和4.5PB的ROM。
以此類(lèi)推。
以32位為例,每秒循環(huán)執(zhí)行1次所有指令則為1Hz的指令循環(huán)周期。
每秒執(zhí)行1條指令的時(shí)間為指令周期,指令周期約為4.3Ghz,循環(huán)執(zhí)行所有指令的周期為1Hz。
若循環(huán)周期需要達(dá)到1Mhz,指令周期判斷器,RAM和ROM的響應(yīng)頻率必須達(dá)到4.3Phz左右即可。
ROM門(mén)電路原理:
非門(mén): 0x00 0x01 0x00 0xFF 0xFF 0xFF
0x00與0x00的值進(jìn)行了或非比較,結(jié)果寫(xiě)入0x01 或非門(mén)的兩個(gè)輸入端接在一起就是非門(mén) 地址0x01的輸出與0x00相反。
非門(mén)高頻振蕩器:0x00 0x00 0x00 0xFF 0xFF 0xFF
0x00與0x00的值進(jìn)行了或非比較,結(jié)果放入0x00中,由于原有值與寫(xiě)入的值相反,即可形成高頻振蕩信號(hào),具體輸出頻率與
指令執(zhí)行時(shí)間有關(guān)。
以下所有2進(jìn)1出門(mén)電路全是0x00 和0x01是輸入端,0x02是輸出端 。
或非門(mén):0x00 0x02 0x01 0xFF 0xFF 0xFF
0x00 與0x01的值進(jìn)行或非比較,結(jié)果寫(xiě)入0x02
與門(mén):0x00 0x03 0x00 0x01 0x04 0x01 0x03 0x02 0x04 0xFF 0xFF 0xFF
0x00 的 反向值寫(xiě)入0x03,0x01的反向值寫(xiě)入0x04,0x03與0x04經(jīng)過(guò)或非比較,結(jié)果寫(xiě)入0x02地址。
與門(mén)是或非門(mén)輸入兩端各自串聯(lián)兩個(gè)非門(mén),用兩個(gè)或非門(mén)兩端接在一起代替非門(mén)。
或門(mén):0x00 0x03 0x01 0x03 0x02 0x03 0xFF 0xFF 0xFF
0x00 與0x01 的值進(jìn)行了或非比較,結(jié)果寫(xiě)入0x03,再與0x03和0x03的值進(jìn)行比較,結(jié)果寫(xiě)入0x02地址。
或門(mén)是或非門(mén)輸出端串聯(lián)一個(gè)非門(mén)而組成。
與非門(mén):0x00 0x03 0x00 0x01 0x04 0x01 0x03 0x05 0x04 0x05 0x02 0x05 0xFF 0xFF 0xFF
與非門(mén)是與門(mén)輸出串聯(lián)非門(mén)組成。
異或門(mén):0x00 0x03 0x00 0x01 0x04 0x01 0x03 0x05 0x04
0x05 0x06 0x05 0x06 0x07 0x06 0x00 0x08 0x01
0x08 0x09 0x08 0x09 0x0A 0x09 0x07 0x02 0x0A
0xFF 0xFF 0xFF
異或門(mén)是與非門(mén)和或門(mén)并聯(lián),兩個(gè)輸出端再接入與門(mén)而組成。
同或門(mén):0x00 0x03 0x00 0x01 0x04 0x01 0x03 0x05 0x04
0x05 0x06 0x05 0x06 0x07 0x06 0x00 0x08 0x01
0x08 0x09 0x08 0x09 0x0A 0x09 0x07 0x0B 0x0A
0x0B 0x02 0x0B 0xFF 0xFF 0xFF
同或門(mén)是異或門(mén)輸出端串聯(lián)一個(gè)非門(mén)而組成。
以上0xFF是清零PC指針的指令,一但有指令訪(fǎng)問(wèn)該地址進(jìn)行讀寫(xiě)操作,該地址的數(shù)據(jù)不但不能被寫(xiě)入,而且PC指針就會(huì)清零
重頭執(zhí)行,不會(huì)清除RAM數(shù)據(jù)。
程序加密執(zhí)行方法:
內(nèi)部運(yùn)算數(shù)據(jù)可以寫(xiě)在任何地址,將讀寫(xiě)數(shù)據(jù)的地址全部隨機(jī)交換打亂即可,不包含主要輸入輸出地址以及0xFF,
不影響正常的執(zhí)行。
比如將0x12地址變成0x34,0x34地址變成0x12,0x12與0x34進(jìn)行交換,以此類(lèi)推。
ROM中的原有的0x12變成了0x34,0x34變成了0x12,不能直接替換否則所有0x34會(huì)變成0x12而導(dǎo)致
程序無(wú)法執(zhí)行。
手工執(zhí)行指令方法:
畫(huà)1張16x16的表格并且打印,并且行列標(biāo)上0~F,里面用鉛筆寫(xiě)滿(mǎn)0,表示RAM。
畫(huà)1張ROM圖紙并且標(biāo)注通過(guò)PC指針找到指令的方法。
指令執(zhí)行方法:
比如取到1條指令:0xAB 0xCD 0xEF
在RAM中指定0xAB坐標(biāo)找到數(shù)字0
在RAM中指定0xEF坐標(biāo)找到數(shù)字0
通過(guò)或非門(mén)全0出1,有1出0的判斷后。
將數(shù)字1放回RAM的0xCD的坐標(biāo)地址中,如果值不同則使用橡皮擦除該值并且重新寫(xiě)入新值。
所有指令循環(huán)執(zhí)行多遍后,這張表示RAM的紙會(huì)被橡皮擦除無(wú)數(shù)次。
在特定地址的值是輸入或輸出值,改變這些值,指令執(zhí)行完畢后,輸出的值也會(huì)改變。
其余地址的值不能隨意改變避免計(jì)算出錯(cuò)。
遇到指令中包含0xFF則從頭執(zhí)行指令,不清除RAM數(shù)據(jù)即可。
若軟硬件存在bug以及意見(jiàn)建議請(qǐng)?jiān)跇窍禄貜?fù)謝謝合作!
根據(jù)以上門(mén)電路組合設(shè)計(jì)實(shí)現(xiàn)的8位全加器:
這些地址由ROM數(shù)據(jù)決定,修改地址入口需要修改ROM。
8位全加器 輸入地址入口:
其余地址的值不可修改,否則計(jì)算可能會(huì)出錯(cuò)。
執(zhí)行前先修改以下地址的值:
0x00~0x07 被加數(shù)
0x08~0x0F 加數(shù)
0x19 進(jìn)位輸入
所有指令執(zhí)行完畢后從以下地址讀取計(jì)算結(jié)果:
0x10~0x17 和
0x18 進(jìn)位輸出
程序源碼:
- #include "reg51.h" //定義頭文件reg51.h
- #include "intrins.h" //定義頭文件intrins.h
- sfr P4=0xC0; //定義P4口寄存器
- sfr P5=0xC8; //定義P5口寄存器
- sfr P6=0xE8; //定義P6口寄存器
- sfr P7=0xF8; //定義P7口寄存器
- unsigned char code rom[768] = { //ROM數(shù)據(jù) 8位全加器 帶進(jìn)位輸入輸出 只讀數(shù)組 固定768字節(jié)
- 0x00, 0x31, 0x00, 0x08, 0x33, 0x08, 0x00, 0x34, 0x08, 0x31, 0x35, 0x33, 0x35, 0x36, 0x34, 0x08,
- 0x37, 0x08, 0x00, 0x38, 0x00, 0x37, 0x39, 0x38, 0x19, 0x3B, 0x19, 0x36, 0x3C, 0x36, 0x19, 0x3D,
- 0x36, 0x3B, 0x3E, 0x3C, 0x3E, 0x10, 0x3D, 0x36, 0x40, 0x36, 0x19, 0x41, 0x19, 0x40, 0x42, 0x41,
- 0x39, 0x43, 0x42, 0x43, 0x44, 0x43, 0x01, 0x60, 0x01, 0x09, 0x62, 0x09, 0x01, 0x63, 0x09, 0x60,
- 0x64, 0x62, 0x64, 0x65, 0x63, 0x09, 0x66, 0x09, 0x01, 0x67, 0x01, 0x66, 0x68, 0x67, 0x44, 0x69,
- 0x44, 0x65, 0x6A, 0x65, 0x44, 0x6B, 0x65, 0x69, 0x6C, 0x6A, 0x6C, 0x11, 0x6B, 0x65, 0x6E, 0x65,
- 0x44, 0x6F, 0x44, 0x6E, 0x70, 0x6F, 0x68, 0x71, 0x70, 0x71, 0x72, 0x71, 0x02, 0x74, 0x02, 0x0A,
- 0x76, 0x0A, 0x02, 0x77, 0x0A, 0x74, 0x78, 0x76, 0x78, 0x79, 0x77, 0x0A, 0x7A, 0x0A, 0x02, 0x7B,
- 0x02, 0x7A, 0x7C, 0x7B, 0x72, 0x7D, 0x72, 0x79, 0x7E, 0x79, 0x72, 0x7F, 0x79, 0x7D, 0x80, 0x7E,
- 0x80, 0x12, 0x7F, 0x79, 0x82, 0x79, 0x72, 0x83, 0x72, 0x82, 0x84, 0x83, 0x7C, 0x85, 0x84, 0x85,
- 0x86, 0x85, 0x03, 0x88, 0x03, 0x0B, 0x8A, 0x0B, 0x03, 0x8B, 0x0B, 0x88, 0x8C, 0x8A, 0x8C, 0x8D,
- 0x8B, 0x0B, 0x8E, 0x0B, 0x03, 0x8F, 0x03, 0x8E, 0x90, 0x8F, 0x86, 0x91, 0x86, 0x8D, 0x92, 0x8D,
- 0x86, 0x93, 0x8D, 0x91, 0x94, 0x92, 0x94, 0x13, 0x93, 0x8D, 0x96, 0x8D, 0x86, 0x97, 0x86, 0x96,
- 0x98, 0x97, 0x90, 0x99, 0x98, 0x99, 0x9A, 0x99, 0x04, 0x9C, 0x04, 0x0C, 0x9E, 0x0C, 0x04, 0x9F,
- 0x0C, 0x9C, 0xA0, 0x9E, 0xA0, 0xA1, 0x9F, 0x0C, 0xA2, 0x0C, 0x04, 0xA3, 0x04, 0xA2, 0xA4, 0xA3,
- 0x9A, 0xA5, 0x9A, 0xA1, 0xA6, 0xA1, 0x9A, 0xA7, 0xA1, 0xA5, 0xA8, 0xA6, 0xA8, 0x14, 0xA7, 0xA1,
- 0xAA, 0xA1, 0x9A, 0xAB, 0x9A, 0xAA, 0xAC, 0xAB, 0xA4, 0xAD, 0xAC, 0xAD, 0xAE, 0xAD, 0x05, 0xB0,
- 0x05, 0x0D, 0xB2, 0x0D, 0x05, 0xB3, 0x0D, 0xB0, 0xB4, 0xB2, 0xB4, 0xB5, 0xB3, 0x0D, 0xB6, 0x0D,
- 0x05, 0xB7, 0x05, 0xB6, 0xB8, 0xB7, 0xAE, 0xB9, 0xAE, 0xB5, 0xBA, 0xB5, 0xAE, 0xBB, 0xB5, 0xB9,
- 0xBC, 0xBA, 0xBC, 0x15, 0xBB, 0xB5, 0xBE, 0xB5, 0xAE, 0xBF, 0xAE, 0xBE, 0xC0, 0xBF, 0xB8, 0xC1,
- 0xC0, 0xC1, 0xC2, 0xC1, 0x06, 0xC4, 0x06, 0x0E, 0xC6, 0x0E, 0x06, 0xC7, 0x0E, 0xC4, 0xC8, 0xC6,
- 0xC8, 0xC9, 0xC7, 0x0E, 0xCA, 0x0E, 0x06, 0xCB, 0x06, 0xCA, 0xCC, 0xCB, 0xC2, 0xCD, 0xC2, 0xC9,
- 0xCE, 0xC9, 0xC2, 0xCF, 0xC9, 0xCD, 0xD0, 0xCE, 0xD0, 0x16, 0xCF, 0xC9, 0xD2, 0xC9, 0xC2, 0xD3,
- 0xC2, 0xD2, 0xD4, 0xD3, 0xCC, 0xD5, 0xD4, 0xD5, 0xD6, 0xD5, 0x07, 0xD8, 0x07, 0x0F, 0xDA, 0x0F,
- 0x07, 0xDB, 0x0F, 0xD8, 0xDC, 0xDA, 0xDC, 0xDD, 0xDB, 0x0F, 0xDE, 0x0F, 0x07, 0xDF, 0x07, 0xDE,
- 0xE0, 0xDF, 0xD6, 0xE1, 0xD6, 0xDD, 0xE2, 0xDD, 0xD6, 0xE3, 0xDD, 0xE1, 0xE4, 0xE2, 0xE4, 0x17,
- 0xE3, 0xDD, 0xE6, 0xDD, 0xD6, 0xE7, 0xD6, 0xE6, 0xE8, 0xE7, 0xE0, 0xE9, 0xE8, 0xE9, 0x18, 0xE9,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
- };
- unsigned char ram[32]; //32字節(jié)RAM 共256位
- unsigned int pc=0; //程序指針 取值范圍:0~768
- //由于C51不能直接定義位數(shù)組,所以這里只能通過(guò)移位處理實(shí)現(xiàn)位數(shù)組。
- bit read_ram(unsigned char a){ //RAM讀數(shù)據(jù)
- unsigned char b=a>>3; //獲取該位對(duì)應(yīng)的字節(jié)
- unsigned char c=a&7; //獲取該字節(jié)對(duì)應(yīng)的位
- return (1<<c&ram[b])>>c; //返回位數(shù)據(jù)
-
- }
- void write_ram(unsigned char a,bit d){ //RAM寫(xiě)數(shù)據(jù)
- unsigned char b=a>>3; //獲取該位對(duì)應(yīng)的字節(jié)
- unsigned char c=a&7; //獲取該字節(jié)對(duì)應(yīng)的位
- bit e=(1<<c&ram[b])>>c; //獲取該位數(shù)據(jù)
- if(d == 0){ //要寫(xiě)的位為0
- if(e==1){ //位讀取到1
- ram[b]-=1<<c; //該位數(shù)據(jù)置0
- }
- } else { //要寫(xiě)的位為1
- if(e==0){ //位讀取到0
- ram[b]+=1<<c; //該位數(shù)據(jù)置1
- }
- }
-
- }
- void cpu_reset(){ //cpu復(fù)位
- P0=0;P1=0;P2=0;P3=0; //P0~P3口全置低電平
- P4=0;P5=0;P6=0;P7=0; //P4~P7口全置低電平
- for(pc=0;pc<32;pc++){ //循環(huán)32次清零所有RAM
- ram[pc]=0; //RAM字節(jié)清零
- }
- pc=0; //pc指針清零
- }
- void main(){ //主函數(shù)
- cpu_reset(); //cpu復(fù)位
- while(1){ //死循環(huán)
- //將IO口數(shù)據(jù)寫(xiě)入RAM
- ram[0]=P0;ram[1]=P1;ram[2]=P2;ram[3]=P3; //將P0~P3口數(shù)據(jù)送入RAM地址0~3
- ram[4]=P4;ram[5]=P5;ram[6]=P6;ram[7]=P7; //將P4~P7口數(shù)據(jù)送人RAM地址4~7
- if(rom[pc] == 0xFF || rom[pc+1] == 0xFF || rom[pc+2] == 0xFF){ //指令中遇到0xFF則清零pc指針
- pc=0;
- }
- if(read_ram(rom[pc]) == 0 && read_ram(rom[pc+2]) == 0){ //全0出1
- write_ram(rom[pc+1],1); //將數(shù)值1寫(xiě)入RAM
- } else { //有1出0
- write_ram(rom[pc+1],0); //將數(shù)值0寫(xiě)入RAM
- }
- pc+=3; //pc指針加3
- if(pc%3 != 0){ //pc指針取余3不等于0
- cpu_reset();//cpu復(fù)位,避免出現(xiàn)錯(cuò)誤
- }
- if(pc >= 768){ //pc指針大于等于768
- pc=0; //pc指針清零
- }
- //將RAM數(shù)據(jù)寫(xiě)入IO口
- P0=ram[0];P1=ram[1];P2=ram[2];P3=ram[3]; //將RAM數(shù)據(jù)0~3送入IO口P0~P3
- P4=ram[4];P5=ram[5];P6=ram[6];P7=ram[7]; //將RAM數(shù)據(jù)4~7送入IO口P4~P7
- }
- }
復(fù)制代碼 |