搜索
bottom↓
回复: 10

ST7920LCD - BASCOM-AVR

[复制链接]

出0入0汤圆

发表于 2006-3-8 19:49:46 | 显示全部楼层 |阅读模式
ST7920LCD工作在串行,PC1接LCD的时钟,PC2接LCD的数据



'www.avrdiy.com

'BASCOM-AVR1.11.8.1

'啊艺panxiaoyi

$regfile = "m88def.dat"

$crystal = 1000000

Dim Zf As String * 16

Dim Zf1 As String * 1

Dim A0 As Word

Dim A1 As Byte

Dim Gs As Byte

Dim Rs As Bit

Dim I As Byte

Dim Ac As Byte

Ac = 0



Config Spi = Soft , Dout = Portc.2 , Clock = Portc.1        '模拟SPI协议

Spiinit

Waitms 100



Do

'-------------------RS=0 就是写指令,下面是指示LCD初始化-------------------------

   Rs = 0

   A0 = &B00110000 : Gosub Data_out : Waitms 10

   A0 = &B00001100 : Gosub Data_out : Waitms 10

   A0 = &B00000001 : Gosub Data_out : Waitms 10

   A0 = &B00000110 : Gosub Data_out : Waitms 10



'---------------------------RS=1写数据,RS=0写指令-------------------------------

   Rs = 0 : A0 = &H80 : Gosub Data_out                      '光标复位

   Rs = 1 : Zf = " AVR单片机DIY" : Gosub Zf_out             '显示字符

   Rs = 0 : A0 = &H90 : Gosub Data_out                      '光标定位到第二行

   Rs = 1 : Zf = Str(ac) : Gosub Zf_out                     '显示变量AC

   Ac = Ac + 1

   Waitms 1000

Loop

End



Zf_out:

   Gs = Len(zf)                                             '求字符"Zf"的个数

   For I = 1 To Gs

      Zf1 = Mid(zf , I , 1)                                 '返回某一个字符

      A0 = Asc(zf1)                                         '把字符转变为国标GB标准代码

      Gosub Data_out

   Next

Return





Data_out:                                                   '判断输入的是指令还是数据,并且把它发送给LCD

   If Rs = 1 Then A1 = &B11111010 Else A1 = &B11111000

   Spiout A1 , 1

   A1 = A0 And &B11110000

   Spiout A1 , 1

   A1 = A0 And &B00001111

   A1 = A1 * 16

   Spiout A1 , 1

Return




-----此内容被panxiaoyi于2006-03-08,19:53:15编辑过

出0入0汤圆

 楼主| 发表于 2006-3-8 20:37:36 | 显示全部楼层
移植到89S51,只改动了一点点就可以了



$regfile = "89c51.dat"

$crystal = 12000000



Dim Zf As String * 16

Dim Zf1 As String * 1

Dim A0 As Word

Dim A1 As Byte

Dim Gs As Byte

Dim Rs As Bit

Dim I As Byte

Dim Ac As Byte

Ac = 0



Config Spi = Soft , Dout = P1.2 , Clk = P1.1                  '模拟SPI协议

Spiinit

Waitms 100



Do

'-------------------RS=0 就是写指令,下面是指示LCD初始化-------------------------

   Rs = 0

   A0 = &B00110000 : Gosub Data_out : Waitms 10

   A0 = &B00001100 : Gosub Data_out : Waitms 10

   A0 = &B00000001 : Gosub Data_out : Waitms 10

   A0 = &B00000110 : Gosub Data_out : Waitms 10



'---------------------------RS=1写数据,RS=0写指令-------------------------------

   Rs = 0 : A0 = &H80 : Gosub Data_out                      '光标复位

   Rs = 1 : Zf = " AVR单片机DIY" : Gosub Zf_out             '显示字符

   Rs = 0 : A0 = &H90 : Gosub Data_out                      '光标定位到第二行

   Rs = 1 : Zf = Str(ac) : Gosub Zf_out                     '显示变量AC

   Ac = Ac + 1

   Waitms 1000

Loop

End



Zf_out:

   Gs = Len(zf)                                             '求字符"Zf"的个数

   For I = 1 To Gs

      Zf1 = Mid(zf , I , 1)                                 '返回某一个字符

      A0 = Asc(zf1)                                         '把字符转变为国标GB标准代码

      Gosub Data_out

   Next

Return





Data_out:                                                   '判断输入的是指令还是数据,并且把它发送给LCD

   If Rs = 1 Then A1 = &B11111010 Else A1 = &B11111000

   Spiout A1 , 1

   A1 = A0 And &B11110000

   Spiout A1 , 1

   A1 = A0 And &B00001111

   A1 = A1 * 16

   Spiout A1 , 1

Return



改动了2个部分



$regfile = "89c51.dat"



Config Spi = Soft , Dout = P1.2 , Clk = P1.1

出0入0汤圆

发表于 2006-3-9 00:15:43 | 显示全部楼层
现在的感觉就象Basic了,原来在你网站挂的倒象汇编。



再改改:

1、把读/写寄存器,清屏,置光标,光标开/关,光标归位等ST7920指令定义成常量,如:

Const Lcd_ctl_wcmd = &HF8                                   '&B1111_1000

Const Lcd_ctl_wdata = &HFA                                  '&B1111_1100

Const Lcd_ctl_rdata = &B1111_1110



Const Cursor_on = 1

Const Cursor_off = 0



Const Lcd_cmd_display = 48                                  '显示内容

Const Lcd_cmd_clear = 49                                    '清除屏幕



Const Cr = 13

……



2、除初始化使用 Gosub 外,其他改用Function/Sub,清屏,光标定位,向LCD写内容等,例如:

Declare Sub Lcdout()                                        '把内容发到LCD

Declare Sub Clear()                                         '清屏

Declare Sub Moveto(byval X As Byte , Byval Y As Byte)       '把光标移到 x,y

不用过程很难写程序的,Gosub虽然占资源少,但结构不好,程序很难扩展。



3、把名字改得更有意义一些,例如:

Const Lcd_ctl_wcmd = &HF8

Const Lcd_cmd_clear = 52

这很重要,当你把程序写大了以后就发现名字的重要性了,你很难记住&HF8是干吗的,但Lcd_ctl_wcmd 就很容易知道这是设置LCD为写命令状态。



4、使用硬SPI。软SPI虽然可用,但当你的系统用中断处理其他事情,系统比较忙时就不行了。



这样你会发现和以前不一样了——不仅仅好看。

试试看?

出0入0汤圆

发表于 2006-3-9 01:02:38 | 显示全部楼层
谢谢二位指点,受教了!

出0入0汤圆

发表于 2006-3-9 08:34:39 | 显示全部楼层
啊艺,您好!能否告知一下您用的所谓“ ST7920LCD ”的型号及供应商和价格?

先谢谢!

出0入0汤圆

 楼主| 发表于 2006-3-9 09:26:24 | 显示全部楼层
favr说的好,不过我的Qbasic底子还很薄,学习学习



我的lcd是在这里买的

http://www.waveshare.net/

出0入0汤圆

发表于 2006-3-9 10:02:59 | 显示全部楼层
楼主的LCD 带硬件字库的吗?

出0入0汤圆

发表于 2006-3-9 12:01:46 | 显示全部楼层
ST7920带2级字库,好象还是简繁体都有的,最大支持128*64点的LCD,你可以到ST下最新的中文文档。

出0入0汤圆

 楼主| 发表于 2006-3-9 12:30:56 | 显示全部楼层
ST7920带字库,简体、繁体只能其中一个

这里有官方文档  http://www.avrdiy.com/工具资料.htm

出0入0汤圆

发表于 2006-3-28 19:28:16 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2006-4-4 19:49:29 | 显示全部楼层
看来瞒不错的,定要抽的时间搞搞!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-10 18:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表