|
|
bascom-avr程序
'===========================================================
' 程序名稱:圖形LCD測試及電壓表
' 單片機型號:ATmega8
' 時鐘頻率:8MHz
' 功能:演示EADOGS102圖形LCD的顯示功能并實現(xiàn)0-5V電壓表(ADC0通道)
'===========================================================
' ----- 編譯器設(shè)置 -----
$regfile = "m8def.dat" ' 指定使用的AVR單片機型號,此文件包含ATmega8的寄存器定義
$crystal = 8000000 ' 設(shè)置系統(tǒng)時鐘頻率(8MHz),用于定時、延時等函數(shù)
$hwstack = 32 ' 硬件堆棧大小(字節(jié)),用于中斷和函數(shù)調(diào)用
$swstack = 32 ' 軟件堆棧大小(字節(jié)),用于BASIC語言的GOSUB等
$framesize = 24 ' 幀緩沖區(qū)大小(字節(jié)),用于字符串轉(zhuǎn)換等臨時存儲
' ----- 圖形LCD配置 -----
$lib "glcdEADOGS102.LIB" ' 引入針對EADOGS102(或兼容)圖形LCD的驅(qū)動庫
Const Eadogs_rotate = 0 ' 選擇LCD的顛倒布局方式。當(dāng)控制針腳在下方時使用 [Const Eadogs_rotate = 1]
' 配置圖形LCD的引腳連接和分辨率
' 參數(shù)含義:
' 128 * 64eadogm → 分辨率128x64,驅(qū)動類型為EADOGM系列
' Cs1 = Portd.4 → 片選信號(CS1)接PORTD的第4腳
' A0 = Portd.5 → 數(shù)據(jù)/命令選擇(A0,即D/I)接PORTD的第5腳
' Si = Portd.7 → 串行數(shù)據(jù)輸入(SI,即MOSI)接PORTD的第7腳
' Sclk = Portd.6 → 串行時鐘(SCLK)接PORTD的第6腳
' Rst = Portc.6 → 復(fù)位信號(RST)接PORTC的第6腳(RESET)
Config Graphlcd = 128 * 64eadogm , Cs1 = Portd.4 , A0 = Portd.5 , Si = Portd.7 , Sclk = Portd.6 , Rst = Portc.6
' 設(shè)置LCD對比度
' Glcdcmd &H81 → 擴展命令,進(jìn)入對比度設(shè)置模式(根據(jù)EADOGS102指令集)
' Glcdcmd 14 → 設(shè)置對比度值為14(范圍0~63,14為適中值)
Glcdcmd &H81 : Glcdcmd 14
' ----- 模數(shù)轉(zhuǎn)換器(ADC)配置 -----
' Config Adc:
' Single → 單次轉(zhuǎn)換模式(每次觸發(fā)采樣一次)
' Prescaler = Auto → 自動選擇預(yù)分頻器以滿足ADC時鐘要求(通常50kHz~200kHz)
' Reference = Avcc → 使用AVcc引腳作為參考電壓(測量范圍0~AVcc,此處AVcc=5V)
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc ' 啟動ADC模塊(使能ADC電源)
' ----- 變量聲明 -----
Dim V_adc As Word ' 存儲10位的ADC原始值(0~1023)
Dim V_float As Single ' 存儲轉(zhuǎn)換后的電壓值(浮點數(shù),單位:伏特)
Dim V_str As String * 10 ' 用于存儲格式化的電壓字符串,最大10個字符
Dim Prog As Word ' 用于條形圖繪制的進(jìn)度值(0~1023對應(yīng)LCD寬度)
Dim i as byte
' ----- 初始演示:顯示圖片 -----
Cls ' 清除整個LCD屏幕(所有像素點置0)
Showpic 0 , 0 , Plaatje ' 顯示圖片
wait 1
cls
' ----- 初始演示:顯示LCD測試信息 -----
Setfont my12_16 ' 切換到自定義的12x16像素字體
Lcdat 4 , 10 , " "; Chr(128) ; Chr(129) ; Chr(132) ; Chr(133) ; Chr(134);" " , 1
' 在行4列10(以字符為單位)顯示特殊符號(ASCII 128~134為自定義圖形文字"圖形屏測試")和"LCD"字符串
Lcdat 2 , 36 , "LED"
Wait 2 ' 延時2秒(單位:秒)
Cls ' 清除屏幕
Setfont Font8x8tt ' 切換到8x8像素等寬字體
Lcdat 1 , 1 , "DOGS102N-6 Test" ' 第1行第1列顯示測試標(biāo)題
Lcdat 2 , 1 , " 102x64dot 3.3V" ' 第2行顯示分辨率和工作電壓
' 繪制1到5的標(biāo)尺
Cls 7, 0, 101, &H8 '繪制條形圖寬度線
For i = 0 To 5
Cls 7, i * 20, i * 20, &H7 '標(biāo)注1~5v的分割線
Lcdat 8, i * 20, i '分段標(biāo)注1~5字符
Next i
Setfont my12_16 ' 切換到12x16像素大字體文件
'Lcdat 3 , 2 , " EADOGS" ' 第3行顯示產(chǎn)品系列名稱
'Lcdat 5 , 2 , " 102N-6" ' 被注釋掉的另一行文字(可忽略)
' ----- 主循環(huán):電壓表功能(ADC0通道)-----
Do
' 讀取ADC通道0(對應(yīng)ATmega8的PC0引腳)
V_adc = Getadc(0) ' 執(zhí)行AD轉(zhuǎn)換并返回10位結(jié)果(0~1023)
Prog = V_adc / 10 ' 將ADC值縮放到0~102范圍
' 注:用于條形圖寬度,代碼后續(xù)用Cls 8繪制,Prog代表繪制的寬度值
' 將ADC原始值轉(zhuǎn)換為對應(yīng)電壓(假設(shè)參考電壓為5.00V)
V_float = V_adc * 5.0 ' 先乘以參考電壓(擴大為整數(shù)倍)
V_float = V_float / 1023.0 ' 再除以最大分辨率(1023),得到實際電壓(0~5.000V)
' 格式化電壓字符串,保留兩位小數(shù)(例如 "4.56")
V_str = Fusing(v_float , "#0.00")
Setfont my12_16 ' 切換到12x16像素大字體文件
' 在屏幕指定位置顯示電壓值
' Lcdat參數(shù):行5,列2,顯示內(nèi)容(電壓+":"+電壓值+"V"),最后參數(shù)1表示反白顯示
Lcdat 3 , 2 , " "; ; V_str ; "V " ', 1
' 這里Chr(132), Chr(133)是自定義的中文符號"電壓"
Waitms 100 ' 延時100毫秒,控制采樣頻率(約10次/秒)
' 繪制條形圖:
' 語法形式:CLS Y, X1, X2 [, CHAR]
'作用:清除第 Y 行上從 X1 到 X2 的像素/字符段,可選填充字符 CHAR(默認(rèn) 0,反色時用 255)
' 第一條:從X=0到Prog位置填充0xFF(通常代表黑色像素)
Cls 6 , 0 , Prog , &HF
' 第二條:從X=102開始向左邊清除(填充0x00,亮白像素)
Cls 6 , Prog , 102 , &H00
' 這兩行配合實現(xiàn)一個類似"進(jìn)度條"的刷新效果
' 從而用條形長度表示電壓高低(Prog值從0~102)。由于之前Prog = V_adc/10,故滿量程時Prog=102。
Loop ' 無限循環(huán)
End ' 程序結(jié)束(實際上不會執(zhí)行到這里)
' ----- 字體數(shù)據(jù)文件包含(必須放在程序末尾)-----
$include "../font8x8TT.font" ' 8x8像素英文字體文件,路徑相對于源文件
$include "../my12_16.font" ' 12x16像素大字體文件
Plaatje: ' 圖片數(shù)據(jù)標(biāo)簽
'包含圖片數(shù)據(jù)
$bgf "../ks108.bgf" ' 導(dǎo)入背景圖片文件
|
評分
-
查看全部評分
|