搜索
bottom↓
回复: 8

RA8806

[复制链接]

出0入0汤圆

发表于 2009-3-13 14:20:42 | 显示全部楼层 |阅读模式
请问有谁用过RA8806于SED1335的LCD 控制器啊,能否提供一下来参考,小弟的邮箱:shewang131@163.com

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2009-3-13 14:44:55 | 显示全部楼层
以下网络得到,实验通过





/*==============================================================================
  SED1335驱动320x240图形液晶驱动演示程序
接口情况表述:
        No: LCM ----- 52
        ---------------------
        1...VSS..... GND                                        地线
        2...VDD..... +5V(VCC)                                电源
        3...VO ..... -Vadj Input                        对比度负压调整输入
        4...A0 ..... P2.0                                        寄存器选择信号,命令数据方式选择
        5.../WR..... WR                                                写有效
        6.../RD..... RD                                                读有效
        7...D0 ..... P0.0                                        数据总线 D0
        8...D1 ..... P0.1                                        数据总线 D1
        9...D2 ..... P0.2                                        数据总线 D2
        10..D3 ..... P0.3                                        数据总线 D3
        11..D4 ..... P0.4                                        数据总线 D4
        12..D5 ..... P0.5                                        数据总线 D5
        13..D6 ..... P0.6                                        数据总线 D6
        14..D7 ..... P0.7                                        数据总线 D7
        15../CS        .... GND                                        片选通信号,低电平有效.实际使用应编入地址
        16../RES.... /RESET                                        复位信号,低电平有效,阻容式复位电路
        17..VEE..... -Vout                                        逆变-22.5V 负电压输出
        18..VSS..... GND                                        地线 0V
==============================================================================         */

#include <reg52.h>
#include <stdlib.h>
#include <intrins.h>
#include <stdio.h>

//变量类型标识的宏定义,大家都喜欢这么做
#define        Uchar unsigned char
#define Uint unsigned int

Uint                                        timer1,timer2;

// 直接访问方式地址定义,根据用户平台接口修改
// P2.7~~~CS  P2.0 --- A0
char xdata LcmCmdPort        _at_ 0xCFFF;                        //CS=0 A0=1 写命令口
char xdata LcmWdataPort        _at_         0xCFFE;                //CS=0 A0=0 写数据口
//char xdata LcmRdataPort _at_         0x7100;                //CS=0 A0=1 读数据口
//char xdata LcmStatusPort _at_         0x7000;        //CS=0 A0=0 读忙状态标志口

#define LcmRdataPort LcmCmdPort
#define LcmStatusPort LcmWdataPort

//============================ 1335 常用指令列表 ===============================

//初始化设置。A0=1..写指令/0...读写参数。后续8字节参数串ParaSysTable8[]
#define SystemSet        0x40                                                        // 时序要求:/WR=0;/RD=1       

Uchar code                                ParaSysTable8[] =
{
0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00                                  // P1-P8参数

};
//                30H,87H,07H,27H,42H,0F0H,30H,00H
/*SystemSet初始化设置参数表,共八字节具体定义如下:
P1     [ DR | 0 | IV | 1 | W/S | M2 | M1 | M0 ] = 0x38
                 0    0   1    1        1    0    0    0

        DR.... 辅助位移时钟周期的选择位。DR=0为正常运行;DR=1为使用辅助位移时钟周期。
                通常=0
          [说明]在控制双屏显示时需要液晶模块一行像素为64的整倍数,如果不是则控制器自
                          动通过填充数据'0'来凑齐64位,此时就需要增加辅助位移时钟周期。
        IV.... 负向字符显示时屏面边界选择位。=0为首行作为边界;=1则无边界。通常=1
                [说明]在文本方式下,第一行显示的字符是顶天的,没有天头。所以在制作负向字
                        符显示时的效果就不太理想。此时使用IV参数位在显示控制时制造出一行空行
                        作为天头,以达到理想的显示效果。
        W/S... 适配驱动系统选择位。改为将选择产生驱动时序信号的类型。0为单屏结构液晶
                        显示驱动系统;1为双屏结构液晶显示驱动系统
        M2.... 外部字符发生器的字体选择位。0=8*8;1=8*16
        M1.... 外部字符发生器Cgram代码区选择位。0选择Cgram1字符代码为0x80~0x9f;1选择
                        Cgram1 + Cgram2,字符代码为0x80~9f和0xe0~0xff
        M0.... 字符发生器选择位. 0为内部字符发生器;1为外部字符发生器。
                [说明]M2,M1,M0组合设置了字符发生器的结构

P2                [ WF | 0 | 0 | 0 | 0 |    FX         ] = 0x87
                   1   0   0   0   0   1   1   1

        WF.... 交流驱动波形选择位。0为C型驱动波形,行翻转驱动波形,交流驱动波形输出
                        WF每16行翻转1次;1为B型驱动波形,交流驱动波形输出每一帧翻转1次,通常
                        取1
        FX.... 字符体宽度设置参数(点列数)。若FX大于实际字符体的宽度,则余出的部分
                        作为空点置于字符体的右侧,形成字符字间距。FX取值在0~7范围内,代表1~8
                        列/字符体。

P3                [ WF | 0 | 0 | 0 |           FY          ] = 0x07
                   0   0   0   0   0   1   1   1

        WF.... 同上;
        FY.... 字符体高度设置参数(点行数)。若FY大于实际字符体的宽度,则余出的部分
                        作为空点置于字符体的下方,形成字符行间距。FY取值在0~0xf之间,代表1-16
                        点行/字符体

P4                [                    C/R                                 ] = 0x27

        C/R... 有效显示窗口宽度设置参数。C/R值设置了显示屏上一行显示所占显示存储器的
                        单元数(字节数)。C/R取值在0~0xef范围内,表示显示屏上一个显示行所占
                        显示存储器的单元数为1~240个字节。
                [说明]C/R值可以选择得比显示屏的实际长度值小,但是余留部分不能超过64点列
                        =8字节

P5                [                        TC/R                                ] = 0x42

        TC/R.. 驱动频率的时间常数。TC/R是晶振频率Fosc转换成液晶显示驱动工作频率FR的
                        时间常数。它可以简单地由下式求出:
                                                                                TC/R >= C/R +4
                [说明] 该参数的设置有时是非常重要的。错误的设置可引起以下几种现象:
                        *行扫描停止且出现高对比度的水平线
                        *显示不稳定,出现闪烁或全亮或全暗
                        *LP信号不足或不存在。
                        在取值时还是允许有一定的选取范围的。
                        TC/R与震荡频率的关系为:  Fosc >= 9 * TC/R * L/F * FR
                        TC/R也可以由以上两个公式联合求出。FR为液晶显示帧扫描频率,通常=70Hz.
                        在控制大规模液晶显示模块时,最大震荡频率10MHz下,要满足TC/R取值要求,
                        就要降低液晶显示的帧扫描频率了。
                       
P6                [                          L/F                                ] = 0xF0

        L/F... 扫描驱动的帧参数。L/F值设置了控制器所要控制的液晶显示驱动系统的扫描数,
                        其倒数为占空比系数。当液晶显示驱动系统为单屏结构时,L/F即为1帧的扫描
                        行数;当液晶显示驱动系统为双屏结构时,L/F为1帧扫描行数的2倍,此时L/F
                        必须为偶数值。L/F取值范围在0~0xff范围内,对应扫描行数为1~256行。

P7                [                        APL                                        ] = 0x30
P8                [                        APH                                        ] = 0x00

        ap在显示存储器内分配一个显示行的单元数(字节数)。ap为双字节参数,apl为低8位,
        aph为高8位。通常AP取值为C/R + 1或大于C/R值的整数,以方便计算个显示行的显示存
        储器地址。
       
*/

//显示域设置。A0=1..写指令/0...读写参数。后续10字节参数串ParaScrTableA[]

#define Scroll                0x44                // 时序要求:/WR=0;/RD=1       

#define BasePart1        0x00
#define BasePart2        0x40
#define BasePart3        0x80
#define BasePart4        0x00

Uchar code                                ParaScrTableA[] =
{
0x00,BasePart1,0xF0,0x00,BasePart2,0xF0,0x00,BasePart3,0x00,BasePart4
};

/*..............................................................................
该指令设置了四个显示区的起始地址SAD合格区所控制的显示行数SL.设置的参数与‘系统
设定’指令设置的参数结合将确定显示RAM中的各显示区域范围与有效的显示区域。定时间
定量地递增或递减某区的起始地址SAD,将产生显示画面的平滑滚动。该指令有10个参数。
部分参数的设置是有效的,但设置的顺序不能改变也不能省略。Scroll初始化设置参数表,
共10字节具体定义如下:
................................................................................
P1                [        SAD1L        ] = 0x00
P2                [        SAD1H        ] = 0x00
        SAD1显示1区首地址。SAD1确定了第1显示区的起始地址。他由双字节组成。
        本区为显示主区间,占用8K空间
       
P3                [        SL1                ] = 0xF0
        SL1显示一区所控制的显示屏上的行数:0~(L/F)
................................................................................
P4                [        SAD2L        ] = 0x00
P5                [        SAD2H        ] = 0x40
        SAD2显示2区首地址。SAD2确定了第2显示区的起始地址。他由双字节组成。
        本参数表定义这个区占用8K空间

P6                [        SL2                ] = 0xF0
        SL1显示2区所控制的显示屏上的行数:0~(L/F)
................................................................................
P7                [        SAD3L        ] = 0x00
P8                [        SAD3H        ] = 0x40
        SAD3显示3区首地址。SAD2确定了第3显示区的起始地址。他由双字节组成。
        作为文本区定义,占用2K空间
................................................................................
P9                [        SAD4L        ] = 0x00
P10                [        SAD4H        ] = 0x48
        SAD4显示4区首地址。SAD2确定了第4显示区的起始地址。他由双字节组成。
        作为文本区定义,占用2K空间
................................................................................
后面预留空间将作为cgram使用
..............................................................................*/

//休闲模式设置。A0=1;/WR=0;/RD=1;后续参数:无
#define SleepIn                0x53

/*该指令强制SED1335等进入休闲工作方式。在该指令输入后,SED1335等在扫描最后一行时
将列驱动器清零;置YDIS=0,使液晶显示驱动系统关闭显示驱动电源;将显示存储器管理信
号/VCE=1,以保护显示数据不被破坏;终止包括振荡器在内的所有内部逻辑电路的运行,但
保存原设置的参数,使其进入休闲方式。退出休闲方式需要计算机重新写入'SYSTEM SET'指
令的P1参数。该指令无效。
*/

//显示状态设置。A0=1..ON/0..OFF;/WR=0;/RD=1.后续参数1字节:
#define DispOn                0x59
#define        DispOff                0x58

/*代码  [ 0 1 0 1 0 0 0 ON/OFF  ]
该指令设置了显示的各种状态。他们有显示开关的设置,光标的显示状态的设置和各显示区
显示状态的设置。在指令代码中就含有一个参数位:=0关显示;=1开显示。
[说明]该参数位控制着显示的总开关状态。
后续参数:[ FP5  FP4  FP3  FP2  FP1  FP0  FC1  FC0 ]

FC1,FC0..光标状态设置位。他们组合设置了光标显示的4种状态:
                ==========================================
                 FC1 FC0         光   标   状   态
                ==========================================
                  0   0   光标显示关闭
                  0   1   光标显示但不闪烁
                  1   0   光标以 FR/32Hz 的频率闪烁显示
                  1   1   光标以 FR/64Hz 的频率闪烁显示
                ==========================================
                [注]光标闪烁的亮与暗占空比为7:3

FP1,FP0...显示一区状态设置位.他们组合设置了一区显示的4种状态
FP3,FP2...显示二、四区状态设置位.他们组合设置了二、四区显示的4种状态
FP5,FP4...显示三区状态设置位.他们组合设置了三区显示的4种状态
                ==========================================
                  FP1 FP0        显示一区显示状态
                  FP3 FP2        显示二、四区显示状态
                  FP5 FP4        显示三区显示状态
                ==========================================
                   0   0        画面显示关闭
                   0   1        画面显示但不闪烁
                   1   0        画面以 FR/32Hz的频率闪烁显示
                   1   1        画面以 FR/64Hz的频率闪烁显示
                ==========================================
                [注]画面闪烁的亮与暗占空比为7:3

[说明]:这些参数位都是控制着各显示区的显示状态。该状态的实现需要在总开关为开状态
                时有效。
*/

//显示合成方式设置。A0=1..写指令/0...读写参数;/WR=0;/RD=1.后续参数1字节:

#define        Ovlay                0x5b
/* 该指令设置了显示区的合成显示方式以及显示1区和3区的显示方式。该指令带有一个参
数。参数的功能如下:
        P        [ 0  0  0  OV  DM2  DM1  MX1  MX0 ]
OV...显示合成设置位。=0为二重合成显示,用于文本与图形或图形与图形的混合显示;=1为
        三重合成显示,仅用于图形混合显示。
[说明1]:二重合成显示方式是将两个显示区的内容经某一种逻辑运算合成出新的显示数据
        从而产生新的显示画面。该方式将以第一、第二显示区为主,第三第四显示区为辅的合
        成,合成方式如下:

        SAD2        +--------+ ---                         SAD2    +----------+  ---
                        |L2          |                                                 |L2                |   ^
        SAD1  +--------+ |                                 SAD1-+---------+   |   |
                  |L1      | | SL2                                  |L1                |   |
        (SL1) |                   | |                                (SL1) |                        |   |  SL2
                  |                   |-+ ---                         SAD3 |---------|   |   |
                  |                   | |                                          |L3           |---+  ---
                  +--------+ + 新数据         (L/F-SL1)|                        |   |
                                        逻辑                                  +---------+ - +->新数据
                                        运算                                                          逻辑
                                                                                                          运算
        (a)单屏结构:显示1,2区参加的  (b)单屏结构:显示1,2,3区参加的
                 二重合成显示方式                          二重合成显示方式(一)


        SAD2--  +----------+ ----                  SAD2--  +-----------+ ---
                        | L2           | (SL2)                                  | L2                  | (SL2)
        SAD1--+---------+  |                          SAD1- +----------+  |
                  | L1                |--+ - SAD3                 (SL1)  | L1           |--+ ---
                  |                        |L3|                                        |                   |L4| (L/F-SL2)
                  |                 |  | (SL3)                  SAD3- +----------+  |
                  |                        |--+ ----                                | L3           |--+ ---
                  |                        |  v                   (L/F-SL1)|                   |  v
                  +---------+- + 新数据                                +----------+->+ 新数据
                                          逻辑                                                                逻辑
                                          运算                                                                运算

        (c)单屏结构:显示1,2,3区参加的         (d)单屏结构:显示1,2,3,4区参加的
                二重合成限时方式(二)                                二重合成限时方式

[说明2]:三重合成显示方式是将三个显示区的内容经某一种或二种逻辑运算合成出新的显示
        数据从而产生新的显示画面。该方式将以第一、第二、第三显示区参加的合成,合成方
        式如下:


                         SAD3------   +---------------+
                                                  | L3                          |
                         SAD2----  +---------------+  |
                                           |L2                           |  |
                         SAD1-- +---------------+  |  |
                                        |L1                                |  |--+
                                        |                                |  |  |
                                        |                                |--+  |
                                        |                                |  v  v
                                        +---------------+->+--+->新数据
                                                                           逻辑
                                                                           运算

MX1,MX0....显示合成方式设置位。组合设置了4种合成显示方式:

  ==============================================================================
        MX1  MX0                                 合成方式                                      用途
  ==============================================================================
         0    0         L1 or L2 or L3 简单逻辑或合成           底线坐标和文本图形混合显示  
         0    1         (L1 xor L2) or L3 逻辑异或。或合成  负向字符显示,区域内闪烁底线
         1    0         (L1 and L2) or L3 逻辑与。或合成        简单动画立体表达式
         1          1                L1 > L2 > L3 优先叠加                           简单动画立体表达式
  ==============================================================================
[说明]
   1。合成显示产生的结果仅改变显示画面而不改变各显示区的内容
   2。优先叠加合成显示是三个显示区以L1覆盖L2、L2覆盖L3的方式逻辑或合成显示,当关
           闭L1时,L2和L3与L1相同的显示部分(为'1'处)被关闭;当L2被关闭时,L3与L2相同显
           示的部分(为'1'处)被关闭。

DM1.......显示一区的显示属性位。DM1=0设置显示一区为文本显示属性,其数据均作为字
                符代码处理;=1设置显示一区为图形显示属性,其数据均作为图形数据处理。

DM2.......显示三区的显示属性位。DM2=0设置显示三区为文本显示属性,其数据均作为字
                符代码处理;=1设置显示三区为图形显示属性,其数据均作为图形数据处理。
*/

//点位移设置。A0=1..写指令/0...读写参数;/WR=0;/RD=1.后续参数1字节:
#define HdotScr                0x5a

/*该指令设置了以点为单位的显示画面的水平位移量。该指令的作用有二:1。在制作负向
显示字符时,与'SYSTEM SET'参数'IV'结合使用。通过设置该指令可以产生做边界,使得行
首字符有比较好的显示效果。2。在制作画面滚动显示效果时与'SCROOLL'指令结合产生水平
向点滚动的效果。但要注意的是该指令控制在显示数据合成之后向驱动系统输出之处,故该
指令所产生的滚动效果是针对所有参加显示的区,因此,要想使某一显示区产生点滚动而其
他显示区不动是不可能的??(可以在调用本指令以前先关闭其他显示区?)
附带参数: [ 0 0 0 0 0    D    ]
D......水平点位移参数。D取值在0~7,当D取值由0->7方向递增时,显示画面呈现左移效果,
        反之右移。
[说明]:与SCROLL指令结合使用方法:显示左移时,首先使用HDOY SCR指令使点位移参数从
0->7然后使用SCROLL指令将显示起始地址SAD加1,并同时将HDOT SCR参数清零。循环上述过
程,将产生显示水平向左点位移的效果。显示右移时,首先使用HDOY SCR指令使点位移参数
从7->0,然后使用SCROLL指令将显示起始地址SAD减1,并同时将HDOT SCR参数置7。循环上
述过程,将产生显示水平向右点位移的效果。
*/

//光标形状设置。A0=1..写指令/0...读写参数;/WR=0;/RD=1.后续参数2字节
#define        CsrForm        0x5d

/* 该指令设置了光标的显示形状。光标的显示形状有线状形式和块状形式两种。光标的形
状是可以设置的。该指令所带的两个参数将实现对光标形状的设置。两参数功能如下:
        P1          [ 0  0  0  0  0         CRX    ]
CRX....光标形状水平方向点列数。CRX取值 0~7,对应实际点列1~8点, CRX<=FX.


        P2          [ CM  0  0  0  0        CRY    ]
CRY....光标形状垂直方向点行数。CRY取值范围 1~FH,对应实际点行1~16行,CRY=0或
                        CRY>FY无效
CM.....光标形状选择位。=0为线状光标显示;=12为块状光标显示。
[说明]:线状光标的形状由CRX确定其长度,由CRY确定其所占的显示行数,当CRY=FY时,
光标显示底线形式。光标显示仅在文本方式下有效。
*/

//Cgram首地址设置.A0=1..写指令/0...读写参数;/WR=0;/RD=1.后续参数2字节
#define CgramAdr        0x5c

/* 该指令设置了CGRAM在显示存储器内的起始地址SAG.从该地址SAG起的2K字节空间(M2=0)
或4K字节空间(M2=1)为CGRAM区域。该指令带有两个参数:
   P1    [  SAGL  ]
   P2    [  SAGH  ]
SAG.... CGRAM起始地址。SAGL为SAG的低8位,SAGH为SAG的高8位。
[说明]SAG所指向对应的是字符代码0的字模首地址,所以对于CGRAM1的首地址应该是SAG+
0x80*8,CGRAM2区域的字符代码为0xE0~0xFF,但是由于控制部在CGRAM2的首地址上安置了异
或0x40的电路,所以,CGRAM2的地址应按0xA0~0xBF计算,即CGRAM2的首地址为SAG+0xA0*8
*/

//光标移动方向设置。A0=1;/WR=0;/RD=1.后续参数:无
#define CsrDirR                0x4c
#define CsrDirL                0x4d
#define CsrDirU                0x4e
#define CsrDirD                0x4f

/* 该指令规定了光标指针CSR在计算机读写显示数据后自动修复的方向,从显示效果来说,
就是光标移动的方向设置。该指令的两个参数位DR1,DR0:
                ===========================
                  DR1 DR0   自动定位方向
                ===========================
                   0   0        右
                   0   1        左
                   1   0        上
                   1   1        下
                ===========================

*/
//光标指针设置。A0=1..写指令/0...读写参数;/WR=0/1;/RD=1/0(指令/后续参数读写).后
//续参数2字节

#define        CsrW                0x46

/* 该指令设置了光标指针CSR.该指针有两个功能:1。作为当前光标显示的位置;2。作为
显示存储器当前的地址指针。2个参数:CSRL,CSRH

[说明]:当光标指针指向有效显示区域之外时,光标将自动消失,但不影响显示数据的读写。
光标指针在计算机的每次读写显示数据操作后,将根据最近设置的光标指针移动方向而自动
修正。光标指针不受画面滚动操作的影响。
*/

//读取光标指针。A0=1..写指令/0...读写参数;/WR=0;/RD=1.后续参数2字节
#define        CsrR                0x47

/* 该指令代码写入后,计算机将从SED1335等数据通道读出当前的光标指针值。光标指针读
出的顺序是先CSRL再CSRH.
*/

//数据写入设置。A0=1..写指令/0...读写参数;/WR=0;/RD=1.后续参数N字节
#define        mWrite                0x42

/*该指令写入后将允许计算机连续的向显示存储器内写入数据。写入的单元地址由光标指针
CSR提供,写操作完成后光标指针自动根据所设置的光标指针移动方向进行修改。显示数据
写入操作在计算机写入下一指令代码后结束。
*/

//数据读取设置。A0=1..写指令/0...读写参数;/WR=0;/RD=1.后续参数N字节
#define        mRead                0x43

/*该指令写入将允许计算机连续地从显示存储器内读取数据。读取的单元地址由光标指针
CSR提供读操作完成后,光标指针自动根据所设定的光标移动方向进行修改。显示数据读取
操作在计算机写入下一个指令代码后结束。
*/

//读状态位:A0=0;WR=1;RD=0.无指令无参数



bit                                                wAttrib;                        // 字符的写入方式:1为初次写入;0为接续写入

// 程序参数定义,根据用户选择的LCM型号修改
#define Busy                0x40                // 忙状态标志位0b0100 0000
#define        paraP9                0x28                // 相对于320 X 240

// 在此可以观察文本方式下的字符及光标的显示效果
Uchar code                                StrForSample[] =
{
"This is an exsample for CGRAM Program\n"
};
Uchar code                                StrForSample1[] =
{
"Let our to look program in Graphics\n"
};
Uchar code                                StrForMixed[] =
{
"This is a 图形方式测试 in SED1335\n"
};
Uchar code                                StrForMixed1[] =
{
"图形方式测试 write in Layer 2 ^O^\n"
};

char code                                ASC_MSK[96 * 16] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,        /*--          --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,        /*--   !  --*/
0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x00,0x00,        /*--   "  --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x36,0x7F,0x36,0x36,        /*--   #  --*/
0x36,0x7F,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x3C,0x66,0x60,0x30,0x18,        /*--   $  --*/
0x0C,0x06,0x66,0x3C,0x18,0x18,0x00,0x00,0x00,0x00,0x70,0xD8,0xDA,0x76,0x0C,0x18,        /*--   %  --*/
0x30,0x6E,0x5B,0x1B,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x6C,0x6C,0x38,0x60,        /*--   &  --*/
0x6F,0x66,0x66,0x3B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x00,0x00,        /*--   '  --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x18,0x18,0x30,0x30,        /*--   (  --*/
0x30,0x30,0x30,0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,0x30,0x18,0x18,0x0C,0x0C,        /*--   )  --*/
0x0C,0x0C,0x0C,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x1C,0x7F,        /*--   *  --*/
0x1C,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x7E,        /*--   +  --*/
0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,        /*--   ,  --*/
0x00,0x00,0x1C,0x1C,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,        /*--   -  --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,        /*--   .  --*/
0x00,0x00,0x1C,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x0C,0x0C,0x18,        /*--   /  --*/
0x18,0x30,0x30,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x33,0x37,0x37,0x33,        /*--   0  --*/
0x3B,0x3B,0x33,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x1C,0x7C,0x0C,0x0C,        /*--   1  --*/
0x0C,0x0C,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x06,0x0C,        /*--   2  --*/
0x18,0x30,0x60,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x06,0x1C,        /*--   3  --*/
0x06,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x36,0x36,0x36,        /*--   4  --*/
0x66,0x7F,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x60,0x60,0x60,0x7C,        /*--   5  --*/
0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x18,0x30,0x7C,0x66,        /*--   6  --*/
0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x06,0x0C,0x0C,0x18,        /*--   7  --*/
0x18,0x30,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x76,0x3C,        /*--   8  --*/
0x6E,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,        /*--   9  --*/
0x3E,0x0C,0x18,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x00,        /*--   :  --*/
0x00,0x00,0x1C,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x00,        /*--   ;  --*/
0x00,0x00,0x1C,0x1C,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,        /*--   <  --*/
0x30,0x18,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,        /*--   =  --*/
0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x06,        /*--   >  --*/
0x0C,0x18,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x0C,0x18,        /*--   ?  --*/
0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0xC3,0xC3,0xCF,0xDB,        /*--   @  --*/
0xDB,0xCF,0xC0,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x66,0x66,0x66,        /*--   A  --*/
0x7E,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x7C,        /*--   B  --*/
0x66,0x66,0x66,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x60,0x60,        /*--   C  --*/
0x60,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x6C,0x66,0x66,0x66,        /*--   D  --*/
0x66,0x66,0x6C,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x60,0x60,0x60,0x7C,        /*--   E  --*/
0x60,0x60,0x60,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x60,0x60,0x60,0x7C,        /*--   F  --*/
0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x60,0x60,        /*--   G  --*/
0x6E,0x66,0x66,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x7E,        /*--   H  --*/
0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x18,0x18,0x18,0x18,        /*--   I  --*/
0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,        /*--   J  --*/
0x06,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x6C,0x6C,0x78,        /*--   K  --*/
0x6C,0x6C,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,        /*--   L  --*/
0x60,0x60,0x60,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x77,0x6B,0x6B,        /*--   M  --*/
0x6B,0x63,0x63,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x73,0x7B,0x6F,        /*--   N  --*/
0x67,0x63,0x63,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,        /*--   O  --*/
0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x7C,        /*--   P  --*/
0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,        /*--   Q  --*/
0x66,0x66,0x66,0x3C,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x7C,        /*--   R  --*/
0x6C,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x60,0x30,0x18,        /*--   S  --*/
0x0C,0x06,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x18,0x18,0x18,0x18,        /*--   T  --*/
0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,        /*--   U  --*/
0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,        /*--   V  --*/
0x66,0x66,0x3C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x6B,0x6B,        /*--   W  --*/
0x6B,0x36,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x34,0x18,0x18,        /*--   X  --*/
0x2C,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x3C,        /*--   Y  --*/
0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x06,0x06,0x0C,0x18,        /*--   Z  --*/
0x30,0x60,0x60,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x30,0x30,0x30,0x30,        /*--   [  --*/
0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x3C,0x00,0x00,0x00,0x60,0x60,0x30,0x30,0x18,        /*--   \  --*/
0x18,0x0C,0x0C,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,        /*--   ]  --*/
0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x3C,0x00,0x18,0x3C,0x66,0x00,0x00,0x00,0x00,        /*--   ^  --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,        /*--   _  --*/
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x38,0x18,0x0C,0x00,0x00,0x00,0x00,        /*--   `  --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x06,0x06,        /*--   a  --*/
0x3E,0x66,0x66,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x7C,0x66,0x66,        /*--   b  --*/
0x66,0x66,0x66,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x60,        /*--   c  --*/
0x60,0x60,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x3E,0x66,0x66,        /*--   d  --*/
0x66,0x66,0x66,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,        /*--   e  --*/
0x7E,0x60,0x60,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x30,0x30,0x30,0x7E,        /*--   f  --*/
0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,        /*--   g  --*/
0x66,0x66,0x66,0x3E,0x06,0x06,0x7C,0x7C,0x00,0x00,0x00,0x60,0x60,0x7C,0x66,0x66,        /*--   h  --*/
0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x78,0x18,0x18,        /*--   i  --*/
0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x3C,0x0C,0x0C,        /*--   j  --*/
0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x78,0x78,0x00,0x00,0x00,0x60,0x60,0x66,0x66,0x6C,        /*--   k  --*/
0x78,0x6C,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x18,0x18,0x18,0x18,        /*--   l  --*/
0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x6B,0x6B,        /*--   m  --*/
0x6B,0x6B,0x6B,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,        /*--   n  --*/
0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,        /*--   o  --*/
0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,        /*--   p  --*/
0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,        /*--   q  --*/
0x66,0x66,0x66,0x3E,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x66,0x6E,0x70,        /*--   r  --*/
0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x60,0x60,        /*--   s  --*/
0x3C,0x06,0x06,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x7E,0x30,0x30,        /*--   t  --*/
0x30,0x30,0x30,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,        /*--   u  --*/
0x66,0x66,0x66,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,        /*--   v  --*/
0x66,0x66,0x3C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x6B,0x6B,        /*--   w  --*/
0x6B,0x6B,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x3C,        /*--   x  --*/
0x18,0x3C,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,        /*--   y  --*/
0x66,0x66,0x66,0x3C,0x0C,0x18,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0x7E,0x06,0x0C,        /*--   z  --*/
0x18,0x30,0x60,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x18,0x18,0x18,0x30,        /*--   {  --*/
0x60,0x30,0x18,0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,        /*--   |  --*/
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x30,0x18,0x18,0x18,0x0C,        /*--   }  --*/
0x06,0x0C,0x18,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0xDB,        /*--   ~  --*/
0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,        /*--   .  --*/
0x00,0x00,0x1C,0x1C,0x00,0x00,0x00,0x00
};

/*==============================================================================
; 文本方式下的汉字显示方法
; 在文本方式下显示汉字,        需要在SED1335 等显示RAM        内建立一个自定义字符库
; CGRAM,然后通过在相应的单元写入相应的字符代码来实现汉字的显示.       
; SED1335 等的字符代码对应的是8x8 点阵的字符块,        而一个汉字需要四个8x8
; 点阵的字符块组合显示,        所以在建立汉字的CGRAM 时, 需要四个字符代码管理一个
; 汉字,        一般是按左上部,        左下部,        右上部和右下部四部分分配代码. 比如在演示程
; 序中建立 "清华" 两个汉字的CGRAM,那么这两个汉字的代码为80H(81H,82H,83H)和
; 84H(85H,86H,87H).       

=============================================================================*/

// 下面是建立自定义字库CGRAM子程序,调用前先设置数据量(字节数)COUNT1
typedef struct typFNT_GB16                                // 汉字字模数据结
{
        signed char        Index[2];
        char                Msk[32];
};

struct typFNT_GB16 code        Cdotlib[] =
{
"测",0x40,0x02,0x27,0xC2,0x24,0x42,0x84,0x52,                //0
0x45,0x52,0x55,0x52,0x15,0x52,0x25,0x52,0x25,0x52,0x25,0x52,0xC5,0x52,0x41,0x02,0x42,0x82,0x42,0x42,0x44,0x4A,0x48,0x04,"试",0x00,0x20,0x40,0x28,0x20,0x24,0x30,0x24,                //1
0x27,0xFE,0x00,0x20,0xE0,0x20,0x27,0xE0,0x21,0x20,0x21,0x10,0x21,0x10,0x21,0x0A,0x29,0xCA,0x36,0x06,0x20,0x02,0x00,0x00,"文",0x02,0x00,0x01,0x00,0x01,0x04,0xFF,0xFE,                //2
0x10,0x10,0x08,0x10,0x08,0x20,0x04,0x20,0x04,0x40,0x02,0x80,0x01,0x00,0x02,0x80,0x04,0x60,0x08,0x10,0x30,0x0E,0xC0,0x04,"本",0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x08,                //3
0x7F,0xFC,0x05,0x40,0x05,0x40,0x05,0x40,0x09,0x20,0x09,0x20,0x11,0x10,0x2F,0xEE,0xC1,0x04,0x01,0x00,0x01,0x00,0x01,0x00,"方",0x04,0x00,0x03,0x00,0x01,0x00,0x00,0x04,                //4
0xFF,0xFE,0x04,0x00,0x04,0x10,0x07,0xF8,0x04,0x10,0x04,0x10,0x04,0x10,0x08,0x10,0x08,0x10,0x10,0x10,0x20,0xA0,0x40,0x40,"式",0x00,0x80,0x00,0xA0,0x00,0x90,0x00,0x84,                //5
0xFF,0xFE,0x00,0x80,0x00,0x80,0x3E,0x80,0x08,0x80,0x08,0x40,0x08,0x40,0x09,0x20,0x0E,0x22,0x70,0x12,0x20,0x0A,0x00,0x04,"图",0x00,0x04,0x7F,0xFE,0x44,0x04,0x47,0xE4,                //6
0x4C,0x44,0x52,0x84,0x41,0x04,0x42,0x84,0x46,0x44,0x49,0x3C,0x70,0x94,0x46,0x04,0x41,0x04,0x40,0x84,0x7F,0xFC,0x40,0x04,"形",0x00,0x80,0x7F,0xC4,0x11,0x0C,0x11,0x10,                //7
0x11,0x20,0x11,0x44,0x11,0x0C,0xFF,0xD0,0x11,0x20,0x11,0x42,0x11,0x06,0x11,0x08,0x21,0x10,0x21,0x20,0x41,0x40,0x01,0x00,
};


// 24点阵汉字演示,每个汉字72字节,每行3字节
Uchar code                                Cdot24lib[] =
{
\
0x00,0x04,0x00,0x00,0x07,0x00,0x00,0x06,                // 晓
0x00,0x23,0x06,0x18,0x3F,0x87,0xFC,0x33,0x7E,0x00,0x33,0x06,0x20,0x33,0x03,0x78,0x33,0x03,0xE0,0x33,0x03,0x84,0x3F,0x0E,0xC4,0x33,0x70,0x7C,0x33,0x00,0x0E,0x33,0x00,0x00,0x33,0x7F,0xF8,0x33,0x0C,0xC0,0x33,0x0C,0xC0,0x3F,0x0C,0xC4,0x33,0x18,0xC4,0x32,0x18,0xC4,0x20,0x30,0xC6,0x00,0x60,0xFE,0x01,0x80,0x7C,0x06,0x00,0x00,0x00,0x20,0x00,0x00,0x38,0x00,0x00,0x30,                // 奇
0x00,0x00,0x30,0x30,0x1F,0xFF,0xF8,0x00,0x60,0x00,0x00,0xDC,0x00,0x01,0x87,0xC0,0x06,0x00,0xE0,0x08,0x00,0x4C,0x7F,0xFF,0xFE,0x00,0x00,0x60,0x08,0x18,0x60,0x0F,0xFC,0x60,0x0C,0x18,0x60,0x0C,0x18,0x60,0x0C,0x18,0x60,0x0C,0x18,0x60,0x0F,0xF8,0x60,0x0C,0x10,0x60,0x08,0x00,0x60,0x00,0x0F,0xE0,0x00,0x01,0xC0,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,                // 工
0x18,0x3F,0xFF,0xFC,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x0C,0x7F,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x00,0x03,0x8E,0x00,0x03,0x0C,                // 作
0x00,0x03,0x0C,0x00,0x07,0x18,0x0C,0x06,0x1F,0xFE,0x06,0x36,0x00,0x0F,0x26,0x00,0x0E,0x66,0x00,0x1E,0x46,0x00,0x36,0x86,0x18,0x26,0x07,0xFC,0x46,0x06,0x00,0x86,0x06,0x00,0x06,0x06,0x00,0x06,0x06,0x0C,0x06,0x07,0xFE,0x06,0x06,0x00,0x06,0x06,0x00,0x06,0x06,0x00,0x06,0x06,0x00,0x06,0x06,0x00,0x06,0x06,0x00,0x04,0x04,0x00,0x00,0x30,0x00,0x00,0x18,0x00,0x10,0x10,                // 室
0x0C,0x1F,0xFF,0xFE,0x30,0x00,0x0C,0x30,0x00,0x10,0x60,0x00,0xC0,0x07,0xFF,0xE0,0x00,0x60,0x00,0x00,0xC2,0x00,0x01,0x81,0x80,0x02,0x00,0x60,0x0F,0xFF,0xF0,0x07,0x10,0x30,0x00,0x1C,0x10,0x00,0x18,0x00,0x00,0x18,0x60,0x0F,0xFF,0xF0,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x0C,0x7F,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00
};

void PutCdotInAlpha(Uchar Ox, Uchar Oy, Uchar Cnumber);
void TextDisp(Uchar Ox, Uchar Oy, Uchar code *ptr);
void PutWordInAlpha(void);
void Linexy(Uint x0, Uchar y0, Uint xt, Uchar yt, Uchar att);
void LcmInition(void);
void WriteData(Uchar dataW);
void WriteCommand(Uchar CommandByte);
void Delay(Uint);
void PutCdotInGraph(Uint Ox, Uchar Oy, Uchar Cnumber, Uchar DotWidth);
void PutWordInGraph(void);
void PutWord24InGraph(void);
void BuildCgram(Uchar Base, Uchar EndlCode);
void LcmClear(void);
void Sample3(void);
void RollLaft(void);
void Rollright(void);
void RollDown(void);
void RollUp(void);
void Point(Uint Px, Uchar Py, Uchar attr);
void Locatexy(Uchar x, Uchar y, Uchar attribs);
Uchar dprintf(Uchar x, Uchar y, char code *ptr, Uchar att);
void DelayMs(Uint tt);
void circle(Uint Ox, Uchar Oy, Uchar Rx, Uchar attr);
//================================= 演示主程序 =================================
void Main(void)
{
        Uchar        i;
        Delay(32768);                        // 足够的延时确保lcm已经准备好
        LcmInition();
        LcmClear();

        // 文本方式演示               
        PutWordInAlpha();                // 文本方式下显示汉字演示,主要通过建立CGRAM映射
        RollLaft();                                // 向左逐点位移
        Rollright();                        // 向右逐点位移
        RollUp();                                // 向上逐行位移
        RollDown();                                // 向下逐行位移
        //                TextDisp( 0,10, StrForSample );        // 英文字符串的显示,演示光标自动移位
        TextDisp(0, 13, StrForSample1);        // 英文字符串的显示,演示光标自动移位
        DelayMs(100);
        LcmClear();                                // 清屏

        // 图形方式演示                       
        WriteCommand(Ovlay);        // 显示合成方式设置.代码0x5b
        WriteData(0x04);                // 设置参数:显示3区为文本属性,二重xor合成
        Sample3();
        PutWordInGraph();
        PutWord24InGraph();
        DelayMs(50);
        Linexy(20, 25, 100, 96, 1);
        Linexy(20, 25, 225, 96, 1);
        Linexy(20, 25, 100, 126, 1);
        Linexy(100, 96, 225, 96, 1);
        Linexy(225, 96, 225, 126, 1);
        Linexy(225, 126, 100, 126, 1);
        Linexy(100, 126, 100, 96, 1);
        Linexy(101, 127, 226, 127, 1);
        Linexy(226, 127, 226, 97, 1);
        //                circle(160,120,20,1);
        DelayMs(300);
        dprintf(0, 10, StrForMixed, 0);        // 图形方式下中英文混合字符串的显示
        DelayMs(100);
        RollLaft();                                // 向左逐点位移
        DelayMs(35);
        Rollright();                        // 向右逐点位移
        DelayMs(35);
        dprintf(4, 70, StrForMixed1, 10);        // 图形方式下中英文混合字符串的显示
        DelayMs(35);
        RollUp();                                // 向上逐行位移
        RollDown();                                // 向下逐行位移
        DelayMs(300);
        DelayMs(35);
        RollUp();                                // 向上逐行位移
        RollDown();                                // 向下逐行位移
        DelayMs(200);
        while (1)
        {
                //变化圆演示,直径不断的变化,由大到小再由小到大来回缩放
                for (i = 50; i > 5; i--)
                {
                        circle(185, 185, i + 1, 0);                //擦除外圆
                        circle(185, 185, i, 8);
                        circle(185, 185, i - 1, 8);
                        DelayMs(4);
                };

                DelayMs(50);

                for (i = 5; i < 50; i++)
                {
                        circle(185, 185, i - 1, 0);                //擦除内圆
                        circle(185, 185, i, 8);                                       
                        circle(185, 185, i + 1, 8);
                        DelayMs(3);
                };

                DelayMs(50);
        };
}

//============================== 西文显示演示程序 ==============================
// 仅仅用于文本方式下的西文字符串显示,本函数只写入第3显示区

void TextDisp(Uchar Ox, Uchar Oy, Uchar code *ptr)
{
        Uchar        TexLength = 0,ii;
        Uint        iTemp;

        while (ptr[TexLength] > 0x1f)
        {
                TexLength++;
        };   // 获取字串长度

        iTemp = Oy * paraP9 + Ox;
        WriteCommand(CsrForm);                // 光标形状设置,代码0x5d
        WriteData(0x07);                                // 设置光标水平点为CSX=8
        WriteData(0x07);                                // 光标为块状形式,垂直点为CSY=8

        WriteCommand(Ovlay);                        // 显示合成方式设置.代码0x5b
        WriteData(0x01);                                // 设置参数:显示3区为文本属性,二重xor合成

        WriteCommand(DispOn);                        // 写入指令DISP ON/OFF代码,后续参数:
        WriteData(0x56);                                // 01 01 01 10显示1~4区开显示,光标闪烁显示

        iTemp = (Uint) Oy * paraP9 + Ox;                                // 光标位置到实际ram地址换算

        WriteCommand(CsrDirR);                                        // 自动右移光标指向

        WriteCommand(CsrW);                                                // 制定光标位置
        WriteData((Uchar) (iTemp & 0xff));                        // 设置光标地址CSR
        WriteData((Uchar) (iTemp / 256 + BasePart3));        // 加入显示三区起始地址SAD2H

        WriteCommand(mWrite);                                                // 当前位置写入数据指令

        for (ii = 0; ii < TexLength; ii++)
        {
                WriteData(ptr[ii]);                                        // 写入显示字符代码
        }
        DelayMs(350);
}

/*==============================================================================
;        该汉字字模是根据清华蓬远公司提供的PICKHZ.EXE软件从计算机中提取的汉字 16x16       
        点阵字模, 其排列顺序是:        前16字节为汉字左半部分(自上而下), 后16字节为汉字右
        半部分(自上而下). 下面提供的在文本方式下汉字的写入子程序可以在文本显示区任意
        地方写入汉字. 程序如下:
;------------ 文本方式下汉字写入子程序 ------------
;        在文本方式下汉字显示演示程序段
==============================================================================*/
void PutWordInAlpha(void)
{
        //        return;                                                                // 首先建立CGRAM,

        WriteCommand(Ovlay);                                // 显示合成方式设置.代码0x5b
        WriteData(0x01);                                        // 设置参数:显示3区为文本属性,二重xor合成

        BuildCgram(0, 8);                                        // 调建立CGRAM子程序设置写入字模量八个汉字模

        // 开始调用显示cgram内所建立的汉字模       
        PutCdotInAlpha(28, 24, 0x88);                        // 调文本方式下汉字写入子程序,88H= "文"
        PutCdotInAlpha(30, 24, 0x8c);                        // 调文本方式下汉字写入子程序,8cH= "本"
        PutCdotInAlpha(32, 24, 0x90);                        // 调文本方式下汉字写入子程序,90H= "方"
        PutCdotInAlpha(34, 24, 0x94);                        // 调文本方式下汉字写入子程序,94H= "式"
        PutCdotInAlpha(36, 24, 0x80);                        // 调文本方式下汉字写入子程序,80H= "测"
        PutCdotInAlpha(38, 24, 0x84);                        // 调文本方式下汉字写入子程序,84H= "试"
        DelayMs(50);
}

//; 图形方式下汉字显示方法,x方向2字节一个汉字
void PutWordInGraph(void)
{
        //x坐标以半个汉字定位左起0开始计算
        //y坐标以像素行定位,顶部0开始计算
        //汉字码以点阵码列表所对应32字节位单位进界,从0开始计算

        PutCdotInGraph(28, 30, 6, 16);        // 调汉字写入子程序,0=设置汉字代码
        PutCdotInGraph(30, 30, 7, 16);        // 调汉字写入子程序,1=设置汉字代码
        PutCdotInGraph(32, 30, 4, 16);        // 调汉字写入子程序
        PutCdotInGraph(34, 30, 5, 16);        // 调汉字写入子程序
        PutCdotInGraph(36, 30, 0, 16);        // 调汉字写入子程序,0=设置汉字代码
        PutCdotInGraph(38, 30, 1, 16);        // 调汉字写入子程序,1=设置汉字代码
        DelayMs(50);
}

void PutWord24InGraph(void)
{
        //x坐标以半个汉字定位左起0开始计算
        //y坐标以像素行定位,顶部0开始计算
        //汉字码以点阵码列表所对应32字节位单位进界,从0开始计算

        PutCdotInGraph(13, 100, 0, 24);        // 调汉字写入子程序
        PutCdotInGraph(16, 100, 1, 24);        // 调汉字写入子程序
        PutCdotInGraph(19, 100, 2, 24);        // 调汉字写入子程序
        PutCdotInGraph(22, 100, 3, 24);        // 调汉字写入子程序
        PutCdotInGraph(25, 100, 4, 24);        // 调汉字写入子程序
        DelayMs(50);
}

/********************************************/
/*画线。任意方向的斜线,直线数学方程        aX+bY=1        */
/********************************************/
// 参数类型有待修改
void Linexy(Uint x0, Uchar y0, Uint xt, Uchar yt, Uchar att)
{
        register Uchar t;
        int                xerr = 0,yerr = 0,delta_x,delta_y,distance;
        int                incx,incy;
        Uint        row,col;
        delta_x = xt - x0;                                                        //计算坐标增量
        delta_y = yt - y0;
        col = x0;
        row = y0;
        if (delta_x > 0)
        {
                incx = 1;
        }                                                //设置单步方向
        else
        {
                if (delta_x == 0)
                {
                        incx = 0;
                }                                //垂直线
                else
                {
                        incx = -1;delta_x = -delta_x;
                }
        }
        if (delta_y > 0)
        {
                incy = 1;
        }
        else
        {
                if (delta_y == 0)
                {
                        incy = 0;
                }                                //水平线
                else
                {
                        incy = -1;delta_y = -delta_y;
                }
        }
        if (delta_x > delta_y)
        {
                distance = delta_x;
        }        //选取基本增量坐标轴
        else
        {
                distance = delta_y;
        }

        for (t = 0; t <= distance + 1; t++)
        {
                //画线输出
                Point((Uint) col, row, att);                                //画点
                xerr += delta_x        ;
                yerr += delta_y        ;

                if (xerr > distance)
                {
                        xerr -= distance;
                        col += incx;
                }
                if (yerr > distance)
                {
                        yerr -= distance;
                        row += incy;
                }
        }
}

/*==============================================================================
滚动演示程序段
使用SED1335 等的屏幕滚动功能, 可以实现逐点滚动的显示效果. 这个效果的实现, 在
水平方向是依赖于指令HDOT SET的支持. 我们可以在下面的演示程序中看到HDOT SET指
令的使用方法.
==============================================================================*/
// 第一显示区向左滚动
void RollLaft(void)
{
        Uchar        tempI,jj = 25;
        Uint        iTemp = 0;

        while (jj--)
        {
                for (tempI = 0; tempI < 8; tempI++)
                {
                        WriteCommand(HdotScr);                // 写入HDOT SET 指令
                        WriteData(tempI);                                // 写入参数
                        DelayMs(4);                                                // 调延时子程序
                }

                iTemp ++;
                WriteCommand(Scroll);                                // 设定显示区域起始地址
                WriteData((Uchar) (iTemp & 0xff));                        // 写入参数
                WriteData((Uchar) (iTemp / 256));                        // 写入参数
        }
}


// 第一显示区向右滚动
void Rollright(void)
{
        Uchar        tempI,jj = 25;
        Uint        iTemp = 24;
        //        return;
        //        WriteCommand( DispOn );                        // 写入指令DISP ON/OFF代码,后续参数:
        //        WriteData( 0x44 );                                // 00 00 01 00显示1区开显示,其余层关闭

        while (jj--)
        {
                tempI = 8;
                WriteCommand(Scroll);                                // 显示区域(起点)设置
                WriteData((Uchar) (iTemp & 0xff));                        // 写入参数
                WriteData((Uchar) (iTemp / 256));                        // 写入参数
                while (tempI--)
                {
                        WriteCommand(HdotScr);                // 写入HDOT SET 指令
                        WriteData(tempI);                                // 写入参数
                        DelayMs(4);                                                // 调延时子程序
                }

                iTemp--;
        }
}

// 第一显示区向下滚动
void RollDown(void)
{
        Uchar        jj = 50;                                        // 演示32次
        Uint        iTemp = paraP9*50;

        //        WriteCommand( DispOn );                        // 写入指令DISP ON/OFF代码,后续参数:
        //        WriteData( 0x44 );                                // 00 00 01 00显示1区开显示,其余层关闭

        while (jj--)
        {
                iTemp -= paraP9;
                WriteCommand(Scroll);                // 设定显示区域起始地址
                WriteData((Uchar) (iTemp & 0xff));                        // 写入参数
                WriteData((Uchar) (iTemp / 256));                        // 写入参数
                DelayMs(8);                                        // 调延时子程序
        }
        WriteCommand(Scroll);                // 设定显示区域起始地址
        WriteData(0);                        // 写入参数
        WriteData(0);                        // 写入参数
        DelayMs(30);
}

// 第一显示区向上滚动
void RollUp(void)
{
        Uint        iTemp = 0;
        Uchar        jj = 50;                                        // 演示30次

        //        WriteCommand( DispOn );                        // 写入指令DISP ON/OFF代码,后续参数:
        //        WriteData( 0x44 );                                // 00 00 01 00显示1区开显示,其余层关闭

        while (jj--)
        {
                iTemp += paraP9;

                WriteCommand(Scroll);                // 设定显示区域起始地址
                WriteData((Uchar) (iTemp & 0xff));                        // 写入参数
                WriteData((Uchar) (iTemp / 256));                        // 写入参数

                DelayMs(3);                                // 调延时子程序
        }
}

//--------延时子程序--------------------------
void Delay(Uint tt)
{
        while (tt--);
}

/*; 三重叠合成显示演示程序段       
;三重叠合成显示功能仅能在单屏结构液晶显示模块上实现.
;这里选用了应用比较广的DMF50081作为样例编程实验. 三重叠合成显示演示程序如下:
*/

void Sample3(void)
{
        Uchar        tempA;       
        return;
        WriteCommand(Ovlay);                // 显示合成方式设置
        tempA = 0x1d;                                // 设置参数:三重叠合成; 显示一,三
        // 区为图形属性;合成方式为(L1 and L2) or L3
        // 或选择
        //                tempA = 0x1c;                                // 合成方式为 L1+L2+L3
        // 或选择
        //                tempA = 0x1e;                                // 合成方式为 (L1 and L2) or L3
        // 或选择
        //                tempA = 0x1f;                                // 合成方式为 L1>L2>L3

        WriteData(0x1c);                // 三重合成方式设置

        PutCdotInGraph(10, 60, 0, 16);                // 在显示二区显示四个汉字
        PutCdotInGraph(12, 60, 1, 16);
        PutCdotInGraph(14, 60, 2, 16);
        PutCdotInGraph(16, 60, 3, 16);

        // 在显示一区相对应前两个汉字位置上写入"FF"
        /*        Cdata = 0;
                for(tempB=0;tempB<4;tempB++) {
                        WriteCommand( CsrW );                        // CSRW 代码,光标指针设置
                        WriteData(Cdata);                                // 设置参数CSR
                        WriteData( 0 );
                        WriteCommand( CsrDirD );                // 光标自动移动方向:向下
                        WriteCommand( mWrite );                        // 代码0x42,数据写入指令
                        for(tempA=0;tempA<16;tempA++) {
                                WriteData( 0xff );                                // 写入显示数据
                        }
                        Cdata++;
                }
        */
        /*        WriteCommand( CsrW );                                // CSRW 代码
                WriteData( 4 );                                                // 设置参数CSR
        // 设置第三显示区位于第三个汉字下的相对应的地址
                WriteData( 0x83 );
                WriteCommand( CsrDirL );
                WriteCommand( mWrite );                                // 代码0x42,数据写入指令
                WriteData( 0xff );                                        // 显示两个数据"FF"作为底线光标
                WriteData( 0xff );
                WriteCommand( DispOn );                                // 写入指令DISP ON/OFF代码
                WriteData( 0x94 );                                        // 设置参数:显示一~三区开显示
        */
}                                                                                // 显示三区闪烁

/*========================================================
;  直接访问方式的驱动子程序
;        程序口地址设置CWADD1,DWADD1,CRADD1,DRADD1
;        占用内部资源DAT1,A,COM
;        程序输入变量: DAT1,,COM
;===============直接访问方式驱动子程序==================*/
// 判忙标志BF子程序pr0
/*void WaitForBusy( void ) {
       
        while ( LcmStatusPort & Busy );
}
*/
//---------------------------
// 写指令代码子程序pr1
void WriteCommand(Uchar CommandByte)
{
        LcmCmdPort = CommandByte;
}

//---------------------------
// 写参数及显示数据子程序
void WriteData(Uchar dataW)
{
        LcmWdataPort = dataW;
}

//---------------------------
// 读参数及显示数据子程序
Uchar ReadDataLcm(void)
{
        return LcmRdataPort;
}

/*=====================================
初始化子程序
======================================*/
void LcmInition(void)
{
        Uchar        i;

        WriteCommand(SystemSet);                        // 系统参数设置
        for (i = 0; i < 8; i++)
        {
                WriteData(ParaSysTable8);        //
        }

        WriteCommand(Scroll);                         //设定显示区域起始地址
        for (i = 0; i < 10; i++)
        {
                WriteData(ParaScrTableA);
        }

        WriteCommand(HdotScr);                // 写入点位移指令代码
        WriteData(0);                                        // 写入P1参数
        WriteCommand(Ovlay);                        // 显示合成方式设置
        WriteData(4);                                        // 0000 0100 显示一区图形,三区文本属性,二重"或"合成
        WriteCommand(DispOn);                        // 写入指令代码
        WriteData(0x54);                                // 显示 1~4 区开显示,光标关显示

        // 定时器初始化

        TMOD = 0x11;                // 0001 0001 T0,T1 16位定时器
        IP = 0x2;                        // 0000 0010 T0 优先
        IE = 0x82;                        // 1000 0010 CT0启动
        TCON = 5;                        // 0000 0101 IT0,IT1 IS LOW LAVEL
        TH0 = 0x36;                        // 设定定时
        TL0 = 0x3b;
        TR0 = 1;                        // 打开定时器中断
        ET0 = 1;
}

/*============================================
建立 cgram,将显示字符送入cgram中

  入口参数约定:Base.... 起始
=============================================*/
void BuildCgram(Uchar Base, Uchar EndlCode)
{
        Uchar        iCgram,ii,ij;

        WriteCommand(CgramAdr);                // CGRAMADR 代码
        WriteData(0);                                        // 设置SAG=0C000H
        WriteData(0x70);                                // 汉字模在cgram中的编码0x70~0x73

        WriteCommand(CsrW);                        // CSRW 代码,光标指针设置
        WriteData(0);                                        // 设置CSR=0C400H(字符代码=80H)
        WriteData(0x74);                                // 汉字模在cgram中的编码0x70~0x73
        WriteCommand(CsrDirR);                // CSRDIR 代码
        WriteCommand(mWrite);                        // 代码0x42,数据写入指令
        for (ii = 0; ii < EndlCode; ii++)
        {
                for (ij = 0; ij < 2; ij++)
                {
                        for (iCgram = 0; iCgram < 32; iCgram += 2)
                        {
                                WriteData(Cdotlib[Base + ii].Msk[ij + iCgram]);
                        }        // 将制定的数据块写入 cgram
                }
        }
}


/*==============================================================================
; 汉字写入子程序(图形方式)。每次调用输出一个汉字
; 支持图形方式使用,完成汉字点阵码的输出。
; 携入参数: Ox,Oy....写入显示的左上角坐标,Ox是以字节单位,Oy以行扫描线单位
                        Ptr......汉字码,库内的排列编码,大型程序时请改用unsigned int类型
; 无返回数据。
==============================================================================*/
void PutCdotInGraph(Uint Ox, Uchar Oy, Uchar Cnumber, Uchar DotWidth)
{
        Uint        tempPtr,Optr;
        Uchar        tempCount1,tempCount2,nByte;

        Optr = (Uint) Oy * paraP9 + Ox;
        nByte = DotWidth / 8;
        WriteCommand(CsrDirD);                                                // 自动右移。
        tempPtr = (Uint) Cnumber * DotWidth * nByte;

        for (tempCount1 = 0; tempCount1 < nByte; tempCount1++)
        {
                WriteCommand(CsrW);                                                // 光标定位指令
                WriteData((Uchar) (Optr & 0xff));                // 设置光标地址CSR
                WriteData((Uchar) (Optr / 256));
                WriteCommand(mWrite);                                                // ram写指令

                switch (DotWidth)
                {
                        case 16:
                                for (tempCount2 = 0; tempCount2 < DotWidth; tempCount2++)
                                {
                                        WriteData(Cdotlib[Cnumber].Msk[tempCount2 * 2 + tempCount1]);                // 写入数据
                                }
                                break;
                        case 24:
                                for (tempCount2 = 0; tempCount2 < DotWidth; tempCount2++)
                                {
                                        WriteData(Cdot24lib[tempPtr]);                // 写入数据
                                        tempPtr += nByte;
                                }
                                break;
                }
                tempPtr = Cnumber * DotWidth * nByte + tempCount1 + 1;
                Optr++;
        }
}

/*============================================================================
汉字写入子程序(文本方式)
在文本方式下显示汉字,        首先要建立汉字Cgram, 要定义汉字代码.
在文本方式下写汉字需要写入4 个代码以组成一个汉字
每8字节组成一个点阵Ascii小区,4个小区组合成一个汉字所以需要4个代码
============================================================================*/
void PutCdotInAlpha(Uchar Ox, Uchar Oy, Uchar Cnumber)
{
        Uint        tempPtr;
        Uchar        tempCount;

        tempPtr = (Uint) Oy * paraP9 + Ox;
        WriteCommand(CsrDirD);                                        // CSRDIR 代码(下移)

        for (tempCount = 0; tempCount < 2; tempCount++)
        {
                WriteCommand(CsrW);                                        // CSRW 代码,光标指针设置
                WriteData((Uchar) (tempPtr & 0xff));        // 设置光标地址CSR
                WriteData(tempPtr / 256 + BasePart3);
                WriteCommand(mWrite);                                        // 代码0x42,数据写入指令

                WriteData(Cnumber++);                                        // 写入汉字代码

                WriteData(Cnumber++);                                        // 写入汉字代码
                tempPtr++;                                                                // 修正光标地址
        }
}

/*====================================================
;  绘点子程序,携入参数X坐标的最高位决定写或擦点
====================================================*/
void Point(Uint Px, Uchar Py, Uchar attr)
{
        Uint        tempPtr;
        Uchar        tempD,tempP;

        tempPtr = (Uint) Py * paraP9 + (Px & 0x7fff) / 8;        // 去除最高位(显示属性)
        WriteCommand(CsrDirD);                                                // CSRDIR 代码(光标自动下移)
        WriteCommand(CsrW);                                                        // 设置光标地址
        WriteData((Uchar) (tempPtr & 0xff));
        WriteData((Uchar) (tempPtr / 256));
        WriteCommand(mRead);                                                        // 读显示ram指令
        tempD = ReadDataLcm();                                                        // 读取当前显示数据
        tempP = 1 << (Uchar) (7 - Px & 0x0007);

        // 根据预定属性决定写点或擦除
        if (attr)
        {
                tempD |= tempP;
        }        // 画点
        else
        {
                tempD &= ~tempP;
        }                                // 消点

        WriteCommand(CsrW);                                                // 重新设置光标地址
        WriteData((Uchar) (tempPtr & 0xff));
        WriteData((Uchar) (tempPtr / 256));
        WriteCommand(mWrite);                                                // 代码0x42,数据写入指令
        WriteData(tempD);                                                        // 写入合成数据
}

/*======================== 清显示 32K RAM区(清屏)子程序 ======================*/

void LcmClear(void)
{
        Uint        i1 = 32768;

        WriteCommand(CsrDirR);                         // 光标移动方向定义:自动右移
        WriteCommand(CsrW);                                // 光标Locate,定位
        WriteData(0);                                                // 写入参数CSRL设置参数光标指针低8位
        WriteData(0);                                                // 写入参数CSRH设置参数光标指针高8位
        WriteCommand(mWrite);                                // 数据写入指令,代码0x42
        while (i1--)
        {
                WriteData(0x0);        // 写入数据0
        }
}

/*============================================================================
光标位定位,用于在1区图形方式下。
输入参数约定:        x...水平方向字节单位坐标,即可以以半个汉字宽度设定水平坐标。
                                y...垂直方向以行线定位的坐标,可以定位到点单位。
                                左上角约定坐标为( 0, 0 )

============================================================================*/
void Locatexy(Uchar x, Uchar y, Uchar attribs)
{
        Uint        temp;
        temp = (Uint) y * paraP9 + x;
        if (attribs)
        {
                temp += BasePart2 * 256;
        }        // 如果需要就指向第二区,加上第二区首地址
        WriteCommand(CsrW);                                // 光标Locate,定位
        WriteData((Uchar) (temp & 0xff));        // 写入参数CSRL设置参数光标指针低8位
        WriteData((Uchar) (temp / 256));        // 写入参数CSRH设置参数光标指针高8位
}

/*=============================================================================
  ASCII(8*16) 及 汉字(16*16) 混合字符串显示函数       
  输入参数约定:
        x,y显示字符串的左上角xy坐标.x..8点一字节位置; y..一条扫描线定位
                                                       
        *ptr...字符串指针,本函数所指的是flash字串
        att....显示区标志,0...第一区;1...第二区
  返回参数:输出字串长度,留意汉字一个算两个
  其它假定:调用时汉字必须在字库数组中已经存在,否则将输出不正确的结果
==============================================================================*/
Uchar dprintf(Uchar x, Uchar y, char code *ptr, Uchar att)
{
        Uchar        c1,c2;
        Uchar        i,j,uLen,uRow,uCol,temp;
        Uint        k;
        uRow = x;
        uCol = y;
        uLen = 0;
        WriteCommand(CsrDirD);                                                 // 光标移动方向定义:自动下移
        Locatexy(uRow, uCol, att);                                                //起点定位
        while ((Uchar) ptr[uLen] >= 0x10)
        {
                uLen++;
        };        //探测字串长度
        i = 0;
        while (i < uLen)
        {
                c1 = ptr;
                c2 = ptr[i + 1];

                //ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
                if (c1 <= 128)                                                                // ASCII
                {
                        if (c1 >= 0x10)
                        {
                                WriteCommand(mWrite);                                // 写数据(命令)
                                for (j = 0; j < 16; j++)
                                {
                                        WriteData(ASC_MSK[(c1 - 0x20) * 16 + j]);
                                }
                        }
                        uRow++;                                                                        // 列数加1
                }
                else                                                                                // 中?
                {
                        for (j = 0; j < sizeof(Cdotlib) / sizeof(Cdotlib[0]); j++)        // 查找定?
                        {
                                if ((c1 == Cdotlib[j].Index[0]) && (c2 == Cdotlib[j].Index[1]))
                                {
                                        break;
                                }
                        }
                        for (k = 0; k < 2; k++)                                                // 分16行输出
                        {
                                Locatexy(uRow + k, uCol, att);
                                WriteCommand(mWrite);                                // 写数据(命令)

                                for (temp = 0; temp < 16; temp++)
                                {
                                        WriteData(Cdotlib[j].Msk[temp * 2 + k]);
                                }
                        }
                        uRow += 2;                                                                // 光标右移一大格
                        i++;
                }
                if (uRow >= 40)                                                                // 光标后移
                {
                        uCol += 16;                                                                // Y坐标
                        uRow = 0;                                                                // X坐标
                        if (uCol >= 240)
                        {
                                uCol = 0;
                        }
                }

                Locatexy(uRow, uCol, att);
                i++;
        }
        return uLen;                                                                        //返回字串长度,汉字按2字节计算
}

/*================================================
   在定时器中断
================================================*/
void timers0() interrupt 1 using 1
{
        TH0 = 0x80;
        TL0 = 0x00;
        if (timer1)
        {
                timer1--;
        }
        if (timer2)
        {
                timer2--;
        }
}


/*================================================
使用定时中断的长延时程序
===============================================*/
void DelayMs(Uint tt)
{
        timer1 = tt;
        while (timer1);
}

/************************************************/
/*画圆。数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2                */
/************************************************/

void circle(Uint Ox, Uchar Oy, Uchar Rx, Uchar attr)
{
        Uint        xx,rr,xt,yt,rs,col,row;
        yt = Rx;
        rr = Rx * Rx + 1;                        //补偿 1 修正方形
        rs = (yt + (yt >> 1)) >> 1;                //(*0.75)分开1/8圆弧来画
        for (xt = 0; xt <= rs; xt++)
        {
                xx = xt * xt;
                while ((yt * yt) > (rr - xx))
                {
                        yt--;
                }
                col = Ox + xt;                //第一象限
                row = Oy - yt;
                Point(col, row, attr);
                col = Ox - xt;                //第二象限
                Point(col, row, attr);
                row = Oy + yt;                //第三象限
                Point(col, row, attr);
                col = Ox + xt;                //第四象限
                Point(col, row, attr);

                /***************45度镜象画另一半***************/

                col = Ox + yt;                //第一象限
                row = Oy - xt;
                Point(col, row, attr);
                col = Ox - yt;                //第二象限
                Point(col, row, attr);
                row = Oy + xt;                //第三象限
                Point(col, row, attr);
                col = Ox + yt;                //第四象限
                Point(col, row, attr);
        }
}

出0入0汤圆

发表于 2009-3-13 14:47:15 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2009-3-25 17:30:44 | 显示全部楼层
楼上的能否把DATASHEET资料上传一份,小弟有一个DMF50081N不知道怎么用
谢谢

出0入0汤圆

 楼主| 发表于 2009-3-30 19:07:14 | 显示全部楼层
谢谢你回复!!!!

出0入0汤圆

发表于 2009-4-30 16:51:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-7 10:36:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-29 00:56:11 | 显示全部楼层
端口定义不知道怎么理解?

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-23 10:24

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

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