搜索
bottom↓
回复: 5

KS0108 兼容的 12864 或 19268 的 BASIC 语言驱动

[复制链接]

出0入0汤圆

发表于 2012-7-19 12:07:01 | 显示全部楼层 |阅读模式
其实基本上所有 BASIC 编译器都内置了这种屏的驱动的,我真的是很蛋疼
*心里话:这天杀的编译器就那么蠢,只认得 12864 不认得 19264,害得我要自己写一个驱动




'/////////////////////////////////////////////////////////
'///   HD61202/KS0108 Compatible 12864/19264 Drive     ///
'///   By Lilith.Washu
'/////////////////////////////////////////////////////////
$Device= m16                        ' 使用的单片机名称
$Stack = 32                               
$Clock = 8                            ' 使用的单片机主频


Dim i As Byte                        ' 测试用变量

Dim Ft1 As Flash Byte        ' 软字体码表
Dim Charat As String *33' 要显示的字符缓冲区

Declare Function WriteKS(Code As Byte, Channel As Byte) As Byte                                ' 向显示屏写数据的函数
Declare Function SetKS(Code As Byte, Channel As Byte) As Byte                                ' 向显示屏写指令的函数
Declare Function InitKS() As Byte                                                                                        ' 初始化显示屏
Declare Function ResetKS() As Byte                                                                                        ' 显示屏上电函数,可用硬件电路代替
Declare Function ClsKS(GRAM As Byte) As Byte                                                                ' 清屏函数
Declare Function DrawPix(x As Byte, y As Byte) As Byte                                                ' 在显示屏上画一个点
Declare Function DrawPage(x As Byte, Page As Byte, Code As Byte) As Byte        ' 在显示屏上画一个页
Declare Function DrawChr(x As Byte, Page As Byte) As Byte                                        ' 显示一行标准 ASCII 字符

DDRA = &b11111111                ' 显示屏的控制端接在 PortA,因此设置几个端口为输出
DDRC = &b11111111                ' 显示屏的数据总线接在 PortC,设置整个 PortC 为输出
                                                ' En 接在 PA0
                                                ' RW 接在 PA1
                                                ' DI 接在 PA2
                                                ' C1 接在 PA3
                                                ' C2 接在 PA4
                                               
InitKS()                                ' 初始化显示屏
ClsKS(0)                                ' 清屏

' 显示测试的字符
Charat = "0123456789:;<=>?@ABCDEFGHIJKLMNO"
DrawChr(1,0)

Charat = "PQRSTUVWXYZ[/]^-,abcdefghijklmno"
DrawChr(1,1)

Charat = "pqrstuvwxyz{|}\~!'#$%&()*+-."
DrawChr(1,2)

Wait 1

' 显示一个不断增大的数字
i = 0
Do
  Charat = "              "
  DrawChr(1,4)
  Charat = Str(i)
  DrawChr(1,4)  
  i=i+1
  WaitMs 250
Loop


Function SetKS(Code As Byte, Channel As Byte) As Byte        ' 写指令函数
PORTC = Code
Select Case Channel                                                                                ' PA3 和 PA4 组合决定使用屏的区域,19264 有三个 64x64 区域
       Case 1 : PORTA.3 = 0 : PORTA.4 = 0
       Case 2 : PORTA.3 = 1 : PORTA.4 = 0
       Case 3 : PORTA.3 = 0 : PORTA.4 = 1
End Select
PORTA.1 = 0                                                                                                ' 设置为写状态 (0=Write,1=Read)
PORTA.2 = 0                                                                                                ' 设置为指令状态 (0=指令,1=数据)
PORTA.0 = 1 : WaitUs 1 : PORTA.0 = 0 : WaitUs 1                        ' 在 En 的上升沿,指令或数据进入屏幕
Return 0
End Function

Function WriteKS(Code As Byte, Channel As Byte) As Byte        ' 写指令函数
PORTC = Code
Select Case Channel
       Case 1 : PORTA.3 = 0 : PORTA.4 = 0
       Case 2 : PORTA.3 = 1 : PORTA.4 = 0
       Case 3 : PORTA.3 = 0 : PORTA.4 = 1
End Select
PORTA.1 = 0
PORTA.2 = 1                                                                                                ' 设置为数据状态 (0=指令,1=数据)
PORTA.0 = 1 : WaitUs 1 : PORTA.0 = 0 : WaitUs 1
Return 0
End Function

Function InitKS() As Byte
Local iC As Byte
ResetKS()
For iC = 1 To 3
    SetKS(&hc0, iC)                                                                                ' 向屏幕的三个控制 IC 写入初始化和开显示的指令
    SetKS(&h3f, iC)
Next iC
Return 0
End Function

Function ResetKS() As Byte                                                                ' 给屏幕完成上电脉冲,可用一个硬件电路来完成
PORTA.5 = 0
WaitMs 200
PORTA.5 = 1
End Function

Function ClsKS(GRAM As Byte) As Byte                                        ' 清屏函数,给整个屏幕清除显示
Local iP As Byte
Local iQ As Byte
Local iC As Byte

For iC = 1 To 3
    For iP = 0 To 7
        For iQ = 0 To 63
            SetKS(&hB8 + iP, iC)                                                ' 设置显存开始写数据的页地址
            SetKS(&h40 + iQ, iC)                                                ' 设置显存开始写数据的行地址
            WriteKS(GRAM, iC)                                                        ' 写入一个 8bit 的显存数据
        Next iQ
    Next iP
Next iC
Return 0        
End Function

Function DrawPix(x As Byte, y As Byte) As Byte                        ' 在屏幕上绘制一个点
Local xAdd As Byte
Local xChip As Byte
Local yAdd As Byte
Local yCode As Byte
Local yPage As Byte
Local iStep As Byte
yCode = 1

xChip = ((x-1)/64)+1                                                                        ' 因为屏幕是3个 64pix 区域,所以需要根据横坐标决定实际上位于哪个控制 IC 的显存的行地址
xAdd = x mod 64
If xAdd = 0 Then
   xAdd = 63
Else
   xAdd = xAdd - 1
End If

yPage = (y-1)/8                                                                                        ' KS0108 的纵坐标是 8 页每页 8 个点,据此找到页地址
yAdd = y mod 8
If yAdd = 0 Then yAdd = 8
For iStep = 1 To yAdd - 1
    yCode = yCode * 2
Next iStep
If yAdd = 1 Then yCode = 1

SetKS(&hB8 + yPage, xChip)                                                                ' 设置显存开始写数据的页地址
SetKS(&h40 + xAdd, xChip)                                                                ' 设置显存开始写数据的行地址
WriteKS(yCode, xChip)
Return 0
End Function

Function DrawPage(x As Byte, Page As Byte, Code As Byte) As Byte
Local xAdd As Byte                                                                                ' 显存一次写入整页的函数
Local xChip As Byte
xChip = ((x-1)/64)+1
xAdd = x mod 64
If xAdd = 0 Then
   xAdd = 63
Else
   xAdd = xAdd - 1
End If
SetKS(&hB8 + Page, xChip)
SetKS(&h40 + xAdd, xChip)
WriteKS(Code, xChip)
Return 0
End Function

Function DrawChr(x As Byte, Page As Byte) As Byte                ' 显示一行字符,必须是码表中存在的标准 ASCII 字符
Local is As Byte
Local iLs As Byte
Local iFn As Byte
Local iChn As Byte
Local bChr As Byte
Local xAdd As Byte

xAdd = 0
iLs = Len(Charat)

For is = 1 To iLs
    bChr = Asc(Mid(Charat,is,1)) - 32                                        ' 根据每一个字符的 ASCII 马,在码表数组中找到对应的数据,一个字符是 5x8 点的 5 个 Byte 数据
    For iFn = 0 To 4
        iChn = Ft1(bChr * 5 + iFn)
        DrawPage(x+xAdd,Page,iChn)                                                ' 将每一个字符对应的这 5 个 Byte 写到显存
        xAdd = xAdd + 1
    Next iFn
    xAdd = xAdd + 1
Next is
Return 0
End Function

'标准 ASCII 字符码表
Ft1 = &h00,&h00,&h00,&h00,&h00,&h00,
&h00,&h5F,&h00,&h00,&h00,&h03,
&h00,&h03,&h00,&h14,&h7F,&h14,
&h7F,&h14,&h44,&h4A,&hFF,&h52,
&h22,&h23,&h13,&h08,&h64,&h62,
&h36,&h49,&h55,&h22,&h50,&h00,
&h00,&h05,&h03,&h00,&h00,&h1C,
&h22,&h41,&h00,&h00,&h00,&h41,
&h22,&h1C,&h14,&h08,&h3E,&h08,
&h14,&h08,&h08,&h3E,&h08,&h08,
&h00,&hA0,&h60,&h00,&h00,&h08,
&h08,&h08,&h08,&h08,&h00,&h60,
&h60,&h00,&h00,&h20,&h10,&h08,
&h04,&h02,&h3E,&h51,&h49,&h45,
&h3E,&h00,&h42,&h7F,&h40,&h00,
&h42,&h61,&h51,&h49,&h46,&h21,
&h41,&h45,&h4B,&h31,&h18,&h14,
&h12,&h7F,&h10,&h27,&h45,&h45,
&h45,&h39,&h3C,&h4A,&h49,&h49,
&h30,&h01,&h71,&h09,&h05,&h03,
&h36,&h49,&h49,&h49,&h36,&h06,
&h49,&h49,&h29,&h1E,&h00,&h36,
&h36,&h00,&h00,&h00,&hA6,&h66,
&h00,&h00,&h08,&h14,&h22,&h41,
&h00,&h14,&h14,&h14,&h14,&h14,
&h41,&h22,&h14,&h08,&h00,&h02,
&h01,&h51,&h09,&h06,&h42,&h63,
&h52,&h4B,&h46,&h7E,&h11,&h11,
&h11,&h7E,&h7F,&h49,&h49,&h49,
&h36,&h3E,&h41,&h41,&h41,&h22,
&h7F,&h41,&h41,&h22,&h1C,&h7F,
&h49,&h49,&h49,&h41,&h7F,&h09,
&h09,&h09,&h01,&h3E,&h41,&h49,
&h49,&h7A,&h7F,&h08,&h08,&h08,
&h7F,&h00,&h41,&h7F,&h41,&h00,
&h20,&h40,&h41,&h3F,&h01,&h7F,
&h08,&h14,&h22,&h41,&h7F,&h40,
&h40,&h40,&h40,&h7F,&h02,&h0C,
&h02,&h7F,&h7F,&h04,&h08,&h10,
&h7F,&h3E,&h41,&h41,&h41,&h3E,
&h7F,&h09,&h09,&h09,&h06,&h3E,
&h41,&h51,&h21,&h5E,&h7F,&h09,
&h19,&h29,&h46,&h26,&h49,&h49,
&h49,&h32,&h01,&h01,&h7F,&h01,
&h01,&h3F,&h40,&h40,&h40,&h3F,
&h1F,&h20,&h40,&h20,&h1F,&h3F,
&h40,&h38,&h40,&h3F,&h63,&h14,
&h08,&h14,&h63,&h07,&h08,&h70,
&h08,&h07,&h61,&h51,&h49,&h45,
&h43,&h48,&h56,&h54,&h56,&h24,
&h02,&h04,&h08,&h10,&h20,&h3C,
&h42,&h42,&h43,&h24,&h3C,&h43,
&h42,&h43,&h24,&h80,&h80,&h80,
&h80,&h80,&h44,&h65,&h56,&h4D,
&h44,&h30,&h54,&h54,&h54,&h78,
&h7F,&h44,&h44,&h44,&h38,&h38,
&h44,&h44,&h44,&h44,&h38,&h44,
&h44,&h44,&h7F,&h38,&h54,&h54,
&h54,&h18,&h04,&h04,&h7E,&h05,
&h05,&h18,&hA4,&hA4,&hA4,&h7C,
&h7F,&h08,&h04,&h04,&h78,&h00,
&h44,&h7D,&h40,&h00,&h40,&h80,
&h84,&h7D,&h00,&h7F,&h10,&h28,
&h44,&h00,&h00,&h41,&h7F,&h40,
&h00,&h7C,&h04,&h7C,&h04,&h78,
&h7C,&h08,&h04,&h04,&h78,&h38,
&h44,&h44,&h44,&h38,&hFC,&h24,
&h24,&h24,&h18,&h18,&h24,&h24,
&h24,&hFC,&h7C,&h08,&h04,&h04,
&h00,&h48,&h54,&h54,&h54,&h24,
&h04,&h04,&h3F,&h44,&h44,&h3C,
&h40,&h40,&h20,&h7C,&h1C,&h20,
&h40,&h20,&h1C,&h3C,&h40,&h30,
&h40,&h3C,&h44,&h28,&h10,&h28,
&h44,&h1C,&hA0,&hA0,&hA0,&h7C,
&h44,&h64,&h54,&h4C,&h44,&h48,
&h55,&h56,&h55,&h24,&h00,&h00,
&h77,&h00,&h00,&h38,&h44,&h46,
&h45,&h44,&h38,&h45,&h46,&h45,
&h44,&h00,&h00,&h07,&h05,&h07

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-1-26 08:48:24 | 显示全部楼层
楼主强,顶一个

出0入0汤圆

发表于 2013-1-27 01:47:06 | 显示全部楼层
厉害,学习了

出0入0汤圆

发表于 2013-1-27 03:18:38 | 显示全部楼层
顶!学习了

出0入0汤圆

发表于 2013-1-27 10:57:30 | 显示全部楼层
高手,学习学习再学习。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-27 09:26

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

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