bascom-avr程序
'===========================================================
' 程序名称:图形LCD测试及电压表
' 单片机型号:ATmega8
' 时钟频率:8MHz
' 功能:演示EADOGS102图形LCD的显示功能并实现0-5V电压表(ADC0通道)
'===========================================================
' ----- 编译器设置 -----
$regfile = "m8def.dat" ' 指定使用的AVR单片机型号,此文件包含ATmega8的寄存器定义
$crystal = 8000000 ' 设置系统时钟频率(8MHz),用于定时、延时等函数
$hwstack = 32 ' 硬件堆栈大小(字节),用于中断和函数调用
$swstack = 32 ' 软件堆栈大小(字节),用于BASIC语言的GOSUB等
$framesize = 24 ' 帧缓冲区大小(字节),用于字符串转换等临时存储
' ----- 图形LCD配置 -----
$lib "glcdEADOGS102.LIB" ' 引入针对EADOGS102(或兼容)图形LCD的驱动库
Const Eadogs_rotate = 0 ' 选择LCD的颠倒布局方式。当控制针脚在下方时使用 [Const Eadogs_rotate = 1]
' 配置图形LCD的引脚连接和分辨率
' 参数含义:
' 128 * 64eadogm → 分辨率128x64,驱动类型为EADOGM系列
' Cs1 = Portd.4 → 片选信号(CS1)接PORTD的第4脚
' A0 = Portd.5 → 数据/命令选择(A0,即D/I)接PORTD的第5脚
' Si = Portd.7 → 串行数据输入(SI,即MOSI)接PORTD的第7脚
' Sclk = Portd.6 → 串行时钟(SCLK)接PORTD的第6脚
' Rst = Portc.6 → 复位信号(RST)接PORTC的第6脚(RESET)
Config Graphlcd = 128 * 64eadogm , Cs1 = Portd.4 , A0 = Portd.5 , Si = Portd.7 , Sclk = Portd.6 , Rst = Portc.6
' 设置LCD对比度
' Glcdcmd &H81 → 扩展命令,进入对比度设置模式(根据EADOGS102指令集)
' Glcdcmd 14 → 设置对比度值为14(范围0~63,14为适中值)
Glcdcmd &H81 : Glcdcmd 14
' ----- 模数转换器(ADC)配置 -----
' Config Adc:
' Single → 单次转换模式(每次触发采样一次)
' Prescaler = Auto → 自动选择预分频器以满足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 ' 存储转换后的电压值(浮点数,单位:伏特)
Dim V_str As String * 10 ' 用于存储格式化的电压字符串,最大10个字符
Dim Prog As Word ' 用于条形图绘制的进度值(0~1023对应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列显示测试标题
Lcdat 2 , 1 , " 102x64dot 3.3V" ' 第2行显示分辨率和工作电压
' 绘制1到5的标尺
Cls 7, 0, 101, &H8 '绘制条形图宽度线
For i = 0 To 5
Cls 7, i * 20, i * 20, &H7 '标注1~5v的分割线
Lcdat 8, i * 20, i '分段标注1~5字符
Next i
Setfont my12_16 ' 切换到12x16像素大字体文件
'Lcdat 3 , 2 , " EADOGS" ' 第3行显示产品系列名称
'Lcdat 5 , 2 , " 102N-6" ' 被注释掉的另一行文字(可忽略)
' ----- 主循环:电压表功能(ADC0通道)-----
Do
' 读取ADC通道0(对应ATmega8的PC0引脚)
V_adc = Getadc(0) ' 执行AD转换并返回10位结果(0~1023)
Prog = V_adc / 10 ' 将ADC值缩放到0~102范围
' 注:用于条形图宽度,代码后续用Cls 8绘制,Prog代表绘制的宽度值
' 将ADC原始值转换为对应电压(假设参考电压为5.00V)
V_float = V_adc * 5.0 ' 先乘以参考电压(扩大为整数倍)
V_float = V_float / 1023.0 ' 再除以最大分辨率(1023),得到实际电压(0~5.000V)
' 格式化电压字符串,保留两位小数(例如 "4.56")
V_str = Fusing(v_float , "#0.00")
Setfont my12_16 ' 切换到12x16像素大字体文件
' 在屏幕指定位置显示电压值
' Lcdat参数:行5,列2,显示内容(电压+":"+电压值+"V"),最后参数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(默认 0,反色时用 255)
' 第一条:从X=0到Prog位置填充0xFF(通常代表黑色像素)
Cls 6 , 0 , Prog , &HF
' 第二条:从X=102开始向左边清除(填充0x00,亮白像素)
Cls 6 , Prog , 102 , &H00
' 这两行配合实现一个类似"进度条"的刷新效果
' 从而用条形长度表示电压高低(Prog值从0~102)。由于之前Prog = V_adc/10,故满量程时Prog=102。
Loop ' 无限循环
End ' 程序结束(实际上不会执行到这里)
' ----- 字体数据文件包含(必须放在程序末尾)-----
$include "../font8x8TT.font" ' 8x8像素英文字体文件,路径相对于源文件
$include "../my12_16.font" ' 12x16像素大字体文件
Plaatje: ' 图片数据标签
'包含图片数据
$bgf "../ks108.bgf" ' 导入背景图片文件
|