資料介紹
描述
最初的想法
Steve Wozniak 曾說(shuō)過(guò),創(chuàng)建 Apple 1 整數(shù)基本解釋器是他一生中最大的職業(yè)挑戰(zhàn)。我試著做史蒂夫所做的事情,從頭開(kāi)始編寫(xiě)一個(gè) BASIC 解釋器,而不使用任何其他人的任何代碼。我想要在一臺(tái)非常小的計(jì)算機(jī)上有用的東西。事實(shí)證明,它可能是 Arduino 的一個(gè)不錯(cuò)的工具。對(duì) I/O 功能的交互式訪問(wèn)使測(cè)試電子設(shè)備變得容易。可以使用 BASIC 命令控制所有引腳。程序和數(shù)據(jù)可以存儲(chǔ)在 EEPROM 中。我實(shí)現(xiàn)了大部分標(biāo)準(zhǔn) BASIC 語(yǔ)言,包括字符串、浮點(diǎn)數(shù)和大部分 Dartmouth 語(yǔ)言集。
查看我的 github 頁(yè)面以找到代碼https://github.com/slviajero/tinybasic
下載并編譯 BASIC 解釋器
下載 TinybasicArduino 中的代碼并將其與 hardware-arduino.h 和 basic.h 一起導(dǎo)入您的 Arduino IDE。打開(kāi)代碼并查看代碼最開(kāi)頭的設(shè)置部分。對(duì)于像上面提到的那些標(biāo)準(zhǔn)的 8 位 AVR 系統(tǒng),初始部分需要看起來(lái)像這樣
#undef MINGW
#undef MSDOS
#undef
除非您想為 MSDOS 或 Windows 編譯,否則不要更改此設(shè)置。作為下面的語(yǔ)言功能部分,這些設(shè)置可以是
#undef BASICFULL
#undef BASICINTEGER
#define BASICSIMPLE
#undef BASICMINIMAL
#undef BASICTINYWITHFLOAT
如果您使用 Arduino UNO 為 am Integer BASIC 定義 BASICSIMPLE 宏,并使用包含字符串、數(shù)組和全套 BASIC 控制結(jié)構(gòu)的合理語(yǔ)言集。
對(duì)于閃存較大的 Arduino,可以使用 BASICFULL。這將在 MEGA 或 NANO Every 等 8 位平臺(tái)上生成 36 kB 的可執(zhí)行文件。
打開(kāi)硬件-arduino.h。在硬件定義部分,除了
#define ARDUINOEEPROM
使用這些設(shè)置編譯代碼并查看內(nèi)存消耗。對(duì)于 UNO,這應(yīng)該是一個(gè) 24 kB 的可執(zhí)行文件,并且在編譯后應(yīng)該有 1.4 kB 的可用 RAM 報(bào)告。上傳代碼。
試試看!
使用具有以下設(shè)置的 Arduino IDE 的串行監(jiān)視器 * 波特率 9600 * 換行
解釋器應(yīng)該顯示一條啟動(dòng)行,如
Stefan的基礎(chǔ)1.2內(nèi)存1024 1024
然后提示輸入。
第一個(gè)數(shù)字是 BASIC 可用的 RAM,第二個(gè)數(shù)字是可用的 EEPROM。可用 RAM 可能因語(yǔ)言功能而異。1KB 大約是一個(gè)人得到的數(shù)量,因?yàn)?BASIC 的內(nèi)部變量需要其余的。
輸入您的第一個(gè) BASIC 程序
10 打印“你好世界”
并運(yùn)行它。
RUN 應(yīng)顯示“HELLO WORLD”并返回輸入提示。
鍵入 SAVE 會(huì)將程序存儲(chǔ)到 EEPROM 中。您可以通過(guò)重置您的 Arduino 來(lái)嘗試這一點(diǎn),然后使用 LOAD 重新加載程序。鍵入 LIST 進(jìn)行檢查。
眨眼程序
與 Arduinos 上的“Hello World”等價(jià)的是 blink 程序。
在 BASIC 中它看起來(lái)像這樣
10 PINM 13,1
20 DELAY 1000
30 DWRITE 13,1
40 DELAY 1000
50 DWRITE 13,0
60 GOTO 20
輸入它并使用 RUN 命令啟動(dòng)它。Arduino 上的小 LED 現(xiàn)在應(yīng)該每隔 1 秒閃爍一次。發(fā)送字符 '#' 將中斷程序并使解釋器返回到命令提示符。
你可以在這里下載blink程序blink.bas 。
'#' 中斷程序。所有其他輸入都被忽略。鍵入除“#”之外的任何其他字符都將淹沒(méi)串行緩沖區(qū),并且將不再識(shí)別中斷字符。
Arduino 函數(shù)的工作原理與 C++ 中的差不多。有關(guān)移植的命令,請(qǐng)參見(jiàn)此處。您可以在交互模式下嘗試它們。這是在 Arduino 上運(yùn)行 BASIC 的優(yōu)勢(shì)之一。同樣,您可以通過(guò)鍵入 SAVE 將您的工作保存到 EEPROM,并在以后使用 LOAD 重新加載程序。
從 EEPROM 自動(dòng)運(yùn)行
如果您已將程序保存到 EEPROM,您可以通過(guò)鍵入 SET 1, 1 來(lái)激活自動(dòng)運(yùn)行標(biāo)志
如果您現(xiàn)在使用重置按鈕或斷開(kāi)并連接電源來(lái)重置 Arduino,程序?qū)⒆詣?dòng)啟動(dòng)。不會(huì)出現(xiàn)命令提示符。
從串行控制臺(tái)發(fā)送“#”會(huì)中斷程序。
如果您現(xiàn)在鍵入 LIST,則不會(huì)顯示任何程序。自動(dòng)運(yùn)行程序不加載到 RAM 中,而是直接從 EEPROM 中執(zhí)行。這樣,整個(gè) RAM 在自動(dòng)運(yùn)行模式下可用。可以通過(guò)命令 SET 1, 0 刪除自動(dòng)運(yùn)行標(biāo)志。
重置后會(huì)出現(xiàn)命令提示符。
這里有更多關(guān)于這整組命令的內(nèi)容“ SD 卡、文件命令、EEPROM 和相關(guān)內(nèi)容”。
讀取數(shù)據(jù)
此項(xiàng)目需要任何模擬傳感器和電纜。一個(gè)很好的例子是圖片中顯示的光電傳感器。它在絕對(duì)黑暗時(shí)返回模擬值 1023,在最大亮度時(shí)返回 0。
將傳感器的模擬輸出引腳連接到模擬端口 A0,將數(shù)字輸出連接到 Arduino 的數(shù)字端口 D2。然后輸入 BASIC 程序
10 PINM AZERO ,0
20 M0=1024:M1=0
30 FOR I=1 TO 10
40 L=AREAD (AZERO )
50 IF M0>L THEN M0=L
60 IF M1THEN M1=L
70 DELAY 1000
80 NEXT I
90 PRINT "Minimum ",M0
100 PRINT "Maximum ",M1
并使用 SAVE 將其保存到 EEPROM。運(yùn)行程序?qū)⒂涗泜鞲衅髅棵胱x取的值 10 次,并計(jì)算最小值和最大值。AZERO 是一個(gè)常數(shù),包含最低的模擬引腳 A0。A1 將是 AZERO+1。
存儲(chǔ)數(shù)據(jù)
Arduino 的 EEPROM 可用于存儲(chǔ)測(cè)量數(shù)據(jù)。接下來(lái)測(cè)量一分鐘的平均光強(qiáng)度并將結(jié)果存儲(chǔ)在 EEPROM 中:
10 PRINT "Previous measurement ",@E(1)
20 PRINT "Starting new measurement"
30 L=0
40 FOR I=1 TO 60
50 L=L+AREAD(AZERO)/10
60 DELAY 1000
70 NEXT
80 @E(1)=L/60
90 PRINT "Average = ",@E(1)
使用 SET 1, 1 激活自動(dòng)運(yùn)行功能后,無(wú)需計(jì)算機(jī)即可使用 Arduino 測(cè)量數(shù)據(jù)。下次 Arduino 連接到計(jì)算機(jī)時(shí)可以讀取該值。
終端程序
Arduino IDE 有一個(gè)簡(jiǎn)單的串行監(jiān)視器,但不能下載和上傳數(shù)據(jù)。存在許多解決方案。我推薦并使用 Roger Meier 的CoolTerm 。
存在適用于 Windows、Linux 和 Mac 的二進(jìn)制文件。該程序是一個(gè)功能齊全的串行終端。我從MacUpdate下載了我的 Mac 二進(jìn)制文件。
在連接到 Arduino 之前,必須在選項(xiàng)菜單中配置終端程序:
將端口設(shè)置為您的串行端口(與使用的 Arduino IDE 相同),波特率設(shè)置為 9600,數(shù)據(jù)設(shè)置為 8,奇偶校驗(yàn)設(shè)置為無(wú),停止設(shè)置為 1。這些是 Arduino 串行和 Stefan 的 BASIC 的默認(rèn)設(shè)置。在終端配置頁(yè)面中選擇了這些選項(xiàng):
原始模式傳輸每個(gè)按鍵,按鍵模擬必須是 Unix 風(fēng)格的 LF。除此之外,“Handle DEL and BS”需要?jiǎng)h除一行中的數(shù)據(jù),“Handle FF”可以從 BASIC 清除屏幕。這些是標(biāo)準(zhǔn) BASIC 語(yǔ)言集中的最小終端功能。
在 Arduino 上使用 Stefan 的 BASIC 的終端設(shè)置可以在這里下載:CoolTerm 設(shè)置。該程序不是一個(gè)功能齊全的 vt52/100 兼容終端程序。
上傳或下載程序
對(duì)于文件上傳,轉(zhuǎn)到 CoolTerm 中的連接菜單,然后選擇發(fā)送文本/二進(jìn)制文件。
一個(gè)很好的例子是 101 BASIC 游戲中的字母猜謎游戲。它適合 1k Arduino BASIC 內(nèi)存。上傳程序,享受 1975 年的游戲樂(lè)趣。
CoolTerm 的當(dāng)前設(shè)置沒(méi)有流量控制。時(shí)序問(wèn)題可能導(dǎo)致上傳失敗,因?yàn)?Arduino 上的 BASIC 接收字符的速度不夠快。一個(gè)簡(jiǎn)單的解決方法是在 CoolTerm 的配置菜單的 Transmit 頁(yè)面中添加小的延遲。3ms 的線路延遲就可以完成這項(xiàng)工作。
可以使用捕獲文本/二進(jìn)制文件功能從 Arduino 下載程序。啟動(dòng)捕獲類型 LIST 后,再停止捕獲。編輯計(jì)算機(jī)上的文件以刪除最后一行和第一行。或者,您可以使用非常基本的 python 串行監(jiān)視器連接到 Arduino。串行端口必須在程序的第一行中進(jìn)行編輯。Control L 和 Control S 用于上傳和下載。
基于 LCD 屏蔽的 BASIC 系統(tǒng)
Arduino 最好的小型硬件擴(kuò)展之一是帶有 4 個(gè)按鈕的 16x2 LCD 擴(kuò)展板。它們可以很容易地從 BASIC 程序中使用。像以前一樣編譯解釋器,但使用附加設(shè)置
#define LCDSHIELD
#define DISPLAYCANSCROLL
在硬件 arduino.h 中。
這將激活 LCD 屏的顯示驅(qū)動(dòng)程序和硬件代碼。編譯并上傳腳本。使用串行監(jiān)視器或 CoolTerm 連接到 Arduino。進(jìn)入
打印 &2, "你好世界"
并查看顯示屏。它應(yīng)該在顯示屏的左上角顯示字符串。
修飾符 &2 將打印命令的輸出重定向到顯示器。通過(guò)上面的設(shè)置,可以作為一個(gè)迷你終端訪問(wèn),能夠滾動(dòng)和一些終端命令。鍵入 PUT &2, 12 以清除顯示屏幕。12 是 Form Feed 的 ASCII 碼,用于清屏。
液晶屏的鍵盤功能
輸入代碼
10 PUT &2, 12
20 PRINT &2,"LCD shield test"
30 PRINT &2,"Key code: ";
40 @X=8:@Y=1
50 GET &2,A
60 IF A<>0 THEN PRINT &2,A;
70 DELAY 10
80 GOTO 30
或使用shield.bas將其上傳到帶有 CoolTerm 的 Arduino 。鍵入 RUN 啟動(dòng)程序,然后按其中一個(gè)屏蔽鍵。密鑰代碼顯示在第二行。
鍵映射到單個(gè)字符的 ASCII 值 - 選擇 = LF、右 = 2、左 = 1、上 = 3 和下 = 4。
GET &2, A 將這些值返回到變量 A 中,無(wú)論何時(shí)按下鍵,如果沒(méi)有按下鍵,則返回 0。此代碼使用特殊變量@X 和@Y 來(lái)定位光標(biāo)。它們包含從 0 開(kāi)始的光標(biāo)的水平和垂直位置,可以由程序讀取或分配。
顯示緩沖區(qū)數(shù)組
鍵入以下代碼,然后鍵入 RUN。
10 PUT &2, 12
20 X=0: Y=0
30 P=X+16*Y+1
40 @D(P)="X"
50 GET &2, A : IF A=0 THEN 50
60 A$=A
70 @D(P)=" "
80 IF A$="3" AND Y>0 THEN Y=Y-1
90 IF A$="4" AND Y<1 THEN Y=Y+1
100 IF A$="1" AND X>0 THEN X=X-1
110 IF A$="2" AND X<15 THEN X=X+1
120 IF A=10 GOSUB 200
130 DELAY 300
140 GOTO 30
200 PRINT "Selected", X, Y
210 DELAY 500
220 RETURN
您可以使用按鍵在“X”符號(hào)周圍移動(dòng)。按選擇輸出屏幕上符號(hào)的位置。
該代碼使用顯示緩沖區(qū)數(shù)組@D()。寫(xiě)入它會(huì)直接在屏幕上顯示一個(gè)字符。@D() 從數(shù)組下標(biāo) 1 開(kāi)始,從左到右、從上到下計(jì)算單元格。請(qǐng)注意程序如何在第 40 行和第 60 行將字符串轉(zhuǎn)換為整數(shù)。在賦值中,字符串將第一個(gè)字符的 ASCII 碼作為其整數(shù)值。這僅適用于賦值或整數(shù)表達(dá)式的右側(cè)。該程序具有 Arduino 草圖的典型結(jié)構(gòu)——第 10 行和第 20 行是 setup(),第 30 到 140 行是循環(huán),第 200 到 220 行是函數(shù)。
秒表
一個(gè)獨(dú)立程序的例子是秒表。
100 REM "A little stopwatch using the 16*2 shield"
200 REM "The setup()"
210 D=0:T=0:U=0:S=0:C=0
220 PUT &2,12 : PRINT &2;"Time = ";
230 GOSUB 600
300 REM "The loop()"
320 GET &2,A
330 IF A=10
340 IF C=10
350 IF A="l" THEN 500
360 DELAY 10
370 IF S=1 THEN T=MILLIS (10)-D
380 IF T<>U THEN U=T:GOSUB 600
390 GOTO 300
400 S=(S+1)%2:IF S=1 THEN D=MILLIS (10)
499 GOTO 300
500 END
600 @Y=0:@X=8:PRINT &2;" ";
605 @Y=0:@X=8:PRINT &2;T;
610 RETURN
輸入程序或使用 Coolterm 上傳程序。然后鍵入 SAVE : SET 1, 1 從 EEPROM 激活自動(dòng)運(yùn)行。從外部電源(如小電源條)為 Arduino 供電,使其成為獨(dú)立的秒表。
下一步是什么?
BASIC 的發(fā)展遠(yuǎn)遠(yuǎn)超出了本項(xiàng)目中描述的功能。與此同時(shí),它擁有 Wire、許多不同的顯示器、網(wǎng)絡(luò),并且可以為更大的計(jì)算機(jī)供電。我還為它移植了大部分 Arduino 示例庫(kù)。
如果您對(duì)此感興趣,請(qǐng)點(diǎn)擊這些鏈接中的任何一個(gè)
Arduino 庫(kù)中的所有標(biāo)準(zhǔn)示例都在我的倉(cāng)庫(kù)中。
- 基于ESP32和FabGL的 BASIC 解釋器代碼實(shí)現(xiàn)
- Arduinos上的BASIC解釋器
- 3568編譯環(huán)境搭建
- 基于C++編譯器的節(jié)點(diǎn)融合優(yōu)化方法 19次下載
- SoMachine Basic軟件操作指南電子版 0次下載
- C語(yǔ)言編譯器常見(jiàn)的預(yù)編譯指令詳細(xì)資料說(shuō)明
- 如何解決proteus的c編譯器問(wèn)題的方法 26次下載
- MPLAB C18編譯器到MPLAB XC8 C編譯器的移植過(guò)程詳細(xì)中文資料概述
- 如何將C源代碼從MPLAB C18編譯器移植到MPLAB XC8C編譯器的詳細(xì)概述
- 計(jì)算機(jī)測(cè)控系統(tǒng)——面向?qū)ο笳Z(yǔ)言Visual Basic課件下載.PPT 0次下載
- TMS320C6000最優(yōu)編譯器 4次下載
- Code Composer Studio(CCS) 集成開(kāi)發(fā)環(huán)境( IDE )入門指導(dǎo)書(shū) 78次下載
- PICC編譯器的庫(kù)函數(shù)詳解 0次下載
- MCS-51程序空間擴(kuò)展原理及編譯器優(yōu)化
- 基于Visual Basic.net的顯微金相圖像檢測(cè)
- 如何安裝Python解釋器 5202次閱讀
- KUKA使用SUBMIT解釋器 3666次閱讀
- 泰凌微電子Zephyr硬件平臺(tái)及編譯步驟 2128次閱讀
- 領(lǐng)域編譯器發(fā)展的前世今生 1473次閱讀
- 交叉編譯器安裝教程 3273次閱讀
- 用10行 BASIC 語(yǔ)言創(chuàng)建很棒的游戲 1767次閱讀
- 腳本在嵌入式系統(tǒng)的應(yīng)用 1210次閱讀
- 如何選擇PIC單片機(jī)的C編譯器 5245次閱讀
- 深入編程語(yǔ)言和編譯器是怎樣工作的 4214次閱讀
- 編譯器原理到底是怎樣的帶你簡(jiǎn)單的了解編譯器原理 1.1w次閱讀
- verilog編譯指令_verilog編譯器指示語(yǔ)句(數(shù)字IC) 1.4w次閱讀
- 命令解釋程序工作流程 5091次閱讀
- Java程序編譯和運(yùn)行的過(guò)程 8808次閱讀
- 編譯器是如何工作的_編譯器的工作過(guò)程詳解 1.5w次閱讀
- 編譯器跟編輯器有什么區(qū)別 2.9w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開(kāi)發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多