AT90S8515点阵C语言编程实例源程序
/*本例程未使用6963的文本模式,使用程序填入字模也足够快。程序以Youth所提供
的51例程移植过来,同时对有些地方做了简化处理,增加了画线画圆的例程,好在
6963的画点有专用指令,所以不用读屏就可以直接画点。
;************************************************************************
;连线图: 液晶屏分为8行*15列汉字,使用总线接口方式。 *
;*LCM----S8515* *LCM----S8515* *LCM-----S8515* *LCM-----S8515* *
;*DB0-----PA0* *DB4-----PA4* *Rd ------/Rd* *Cd ------PC0* *
;*DB1-----PA1* *DB5-----PA5* *Wr ------/Wr* *CE ------PC1* *
;*DB2-----PA2* *DB6-----PA6* *RST------VCC* *FS ------Vcc* *
;*DB3-----PA3* *DB7-----PA7* *
;注:S8515的晶振频率为8MHz,尝试使用11.0592MHz超频,发现偶尔有数据丢失 *
;************************************************************************/
#include #define WDR() asm("wdr") //汇编指令调用的定义
#define BIT(x) (1<
#define SRW 6
#define SE 5 #define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char // ASCII字符控制代码解释定义
#define STX 0x02
#define ETX 0x03
#define EOT 0x04
#define ENQ 0x05
#define BS 0x08
#define CR 0x0D
#define LF 0x0A
#define DLE 0x10
#define ETB 0x17
#define SPACE 0x20
#define COMMA 0x2C
#define TRUE 1
#define FALSE 0
#define HIGH 1
#define LOW 0 // T6963C 端口定义由汇编语言程序定义外部端口
__no_init statIC uchar LCMCW @ 0xF100; // 命令口
__no_init static uchar LCMDW @ 0xF000; // 数据口
// T6963C 命令定义
#define LC_CUR_POS 0x21 // 光标位置设置
#define LC_CGR_POS 0x22 // CGRAM偏置地址设置
#define LC_ADD_POS 0x24 // 地址指针位置
#define LC_TXT_STP 0x40 // 文本区首址
#define LC_TXT_WID 0x41 // 文本区宽度
#define LC_GRH_STP 0x42 // 图形区首址
#define LC_GRH_WID 0x43 // 图形区宽度
#define LC_MOD_OR 0x80 // 显示方式:逻辑“或”
#define LC_MOD_XOR 0x81 // 显示方式:逻辑“异或”
#define LC_MOD_AND 0x82 // 显示方式:逻辑“与”
#define LC_MOD_TCH 0x83 // 显示方式:文本特征
#define LC_DIS_SW 0x90 // 显示开关:D0=1/0:光标闪烁启用/禁用;
// D1=1/0:光标显示启用/禁用;
// D2=1/0:文本显示启用/禁用;
// D3=1/0:图形显示启用/禁用;
#define LC_CUR_SHP 0xA0 // 光标形状选择:0xA0-0xA7表示光标占的行数
#define LC_AUT_WR 0xB0 // 自动写设置
#define LC_AUT_RD 0xB1 // 自动读设置
#define LC_AUT_OVR 0xB2 // 自动读/写结束
#define LC_INC_WR 0xC0 // 数据一次写,地址加1
#define LC_INC_RD 0xC1 // 数据一次读,地址加1
#define LC_DEC_WR 0xC2 // 数据一次写,地址减1
#define LC_DEC_RD 0xC3 // 数据一次读,地址减1
#define LC_NOC_WR 0xC4 // 数据一次写,地址不变
#define LC_NOC_RD 0xC5 // 数据一次读,地址不变
#define LC_SCN_RD 0xE0 // 屏读
#define LC_SCN_CP 0xE8 // 屏拷贝
#define LC_BIT_OP 0xF0 // 位操作:
// D0-D2:定义D0-D7位;D3:1置位;0:清除 __flash uchar uPowArr[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; // ASCII 字模宽度及高度定义
#define ASC_CHR_WIDTH 8
#define ASC_CHR_HEIGHT 16 // ASCII 字模,显示为8*16
__flash char 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
};
typedef struct // 汉字字模数据结构
{
char Index[2];
char Msk[32];
}typFNT_GB16; __flash typFNT_GB16 GB_16[] =
{ // 显示为16*16
"中", 0x01,0x00,0x01,0x00,0x21,0x08,0x3F,0xFC,
0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,
0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x00,
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
"文", 0x02,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,
0x08,0x20,0x08,0x20,0x08,0x20,0x04,0x40,
0x04,0x40,0x02,0x80,0x01,0x00,0x02,0x80,
0x04,0x60,0x18,0x1E,0xE0,0x08,0x00,0x00,
"测", 0x40,0x02,0x27,0xC2,0x24,0x42,0x84,0x52,
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,
0x27,0xFE,0x00,0x20,0xE0,0x20,0x27,0xE0,
0x21,0x20,0x21,0x10,0x21,0x10,0x21,0x0A,
0x29,0xCA,0x36,0x06,0x20,0x02,0x00,0x00
};
uchar const turnf[8] = {7,6,5,4,3,2,1,0};
uchar gCurRow,gCurCol; // 当前行、列存储,行高16点,列宽8点 /* 取当前行数据 */
uchar fnGetRow(void)
{
return gCurRow;
} /* 取当前列数据 */
uchar fnGetCol(void)
{
return gCurCol;
} /************************************************/
/* 状态位STA1,STA0判断(读写指令和读写数据) */
/* 在读写数据或者写入命令前必须保证均为1 */
/************************************************/
uchar fnSTA01(void)
{
uchar i;
for(i=10;i>0;i--)
{
if((LCMCW & 0x03) == 0x03) // 读取状态
break;
}
return i; // 若返回零,说明错误
} /********************************************************/
/*检查STA2,如果 STA2=1 为自动读状态 */
/********************************************************/
uchar fnSTA2(void)
{
uchar i;
for(i=10;i>0;i--)
{
if((LCMCW & 0x04) == 0x04)
break;
}
return i; // 若返回零,说明错误
} /********************************************************/
/* 状态位STA3判断(STA3 = 1 数据自动写状态) */
/********************************************************/
uchar fnSTA3(void)
{
uchar i;
for(i=10;i>0;i--)
{
if((LCMCW & 0x08) == 0x08)
break;
}
return i; // 若返回零,说明错误
} /********************************************************/
/* 状态位STA6判断(STA6 =1 屏读/屏拷贝状态) */
/********************************************************/
uchar fnSTA6(void)
{
uchar i;
for(i=10;i>0;i--)
{
if((LCMCW & 0x40) == 0x40)
break;
}
return i; // 若返回零,说明错误
} /********************************************************/
/* 写双参数的指令 */
/********************************************************/
uchar fnPR1(uchar uCmd,uchar uPar1,uchar uPar2)
{
if(fnSTA01() == 0)
return 1;
LCMDW = uPar1;
if(fnSTA01() == 0)
return 2;
LCMDW = uPar2;
if(fnSTA01() == 0)
return 3;
LCMCW = uCmd;
return 0; // 返回0成功
} /********************************************************/
/* 写单参数的指令 */
/********************************************************/
uchar fnPR11(uchar uCmd,uchar uPar1)
{
if(fnSTA01() == 0)
return 1;
LCMDW = uPar1;
if(fnSTA01() == 0)
return 2;
LCMCW = uCmd;
return 0; // 返回0成功
} /********************************************************/
/* 写无参数的指令 */
/********************************************************/
uchar fnPR12(uchar uCmd)
{
if(fnSTA01() == 0)
return 1;
LCMCW = uCmd;
return 0; // 返回0成功
} /********************************************************/
/* 写数据 */
/********************************************************/
uchar fnPR13(uchar uData)
{
if(fnSTA3() == 0)
return 1;
LCMDW = uData;
return 0; // 返回0成功
} /********************************************************/
/* 读数据 */
/********************************************************/
uchar fnPR2(void)
{
if(fnSTA01() == 0)return 1; // 获取状态,如果状态错
return LCMDW; // 返回数据
} /********************************************************/
/* 设置当前地址 */
/********************************************************/
void fnSetPos(uchar urow, uchar ucol)
{
uint iPos; iPos = urow * 30 + ucol;
fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256);
gCurRow = urow;
gCurCol = ucol;
} /********************************************************/
/* 设置当前显示行、列 */
/********************************************************/
void cursor(uchar uRow, uchar uCol)
{
fnSetPos(uRow * 16, uCol);
} /********************************************************/
/* 清屏 */
/********************************************************/
void cls(void)
{
uint i; fnPR1(LC_ADD_POS,0x00,0x00); // 置地址指针为从零开始
fnPR12(LC_AUT_WR); // 自动写
for(i=0;i<240*128/8;i++) // 清一屏
{
fnSTA3();
fnPR13(0x0); // 写数据,实际使用时请将0x55改成0x0
}
fnPR12(LC_AUT_OVR); // 自动写结束
fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指针
gCurRow = 0; // 置地址指针存储变量
gCurCol = 0;
} /********************************************************/
/* LCM 初始化 */
/********************************************************/
char fnLCMInit(void)
{
if(fnPR1(LC_TXT_STP,0x00,0x00) != 0) // 文本显示区首地址
return (0xff);
fnPR1(LC_TXT_WID,0x1E,0x00); // 文本显示区宽度
fnPR1(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
fnPR1(LC_GRH_WID,0x1E,0x00); // 图形显示区宽度
fnPR12(LC_CUR_SHP | 0x01); // 光标形状
fnPR12(LC_MOD_OR); // 显示方式设置
fnPR12(LC_DIS_SW | 0x08); // 显示开关设置
return 0;
} /********************************************************/
/* ASCII(8*16) 及 汉字(16*16) 显示函数 */
/********************************************************/
uchar dprintf(uchar x,uchar y, char *ptr)
{ char c1,c2,cData;
uchar i,j,uLen,uRow,uCol;
uint k;
uLen=0;
i=0;
uRow = y;
uCol = x;
fnSetPos(uRow*16,uCol); //起点定位
while (ptr[uLen]!=0){uLen++;}; //探测字串长度 while(i
{
c1 = ptr[i];
c2 = ptr[i+1];
//ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
uRow = fnGetRow();
uCol = fnGetCol();
if(c1 <=128) // ASCII
{
for(j=0;j<16;j++) //写16行
{
fnPR12(LC_AUT_WR); // 写数据(命令)
if (c1 >= 0x20)
{
fnPR13( ASC_MSK[(c1-0x20)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)] );
}
else
fnPR13(cData);
fnPR12(LC_AUT_OVR); //写数据结束
fnSetPos(uRow+j+1,uCol);
}
if(c1 != BS) // 非退格
uCol++; // 列数加1
}
else // 中文
{
for(j=0;j
{
if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
break;
}
for(k=0;k
{
fnSetPos(uRow+k,uCol);
fnPR12(LC_AUT_WR); // 写数据
if(j
{
fnPR13(GB_16[j].Msk[k*2]);
fnPR13(GB_16[j].Msk[k*2+1]);
}
else // 未找到该字
{
if(k
{
fnPR13(0x00);
fnPR13(0x00);
}
else
{
fnPR13(0xff);
fnPR13(0xff);
}
}
fnPR12(LC_AUT_OVR);
}
uCol += 2;
i++;
};
if(uCol >= 30) // 光标后移
{
uRow += 16;
if(uRow
uCol -= 30;
else
{
uRow = 0;
uCol = 0;
}
}
fnSetPos(uRow,uCol);
i++;
}
return uLen; //返回字串长度,汉字按2字节计算
} /*==============================*/
/* 延时 */
/*==============================*/
void shortdelay(uint tt)
{
uchar i;
while (tt)
{
i=100;
while (i)i--;
tt--;
};
}
/****************************************/
/* 画点 */
/****************************************/ void point(uchar x,uchar y,uchar s)
{
uchar x1;
x1=x>>3; //取Y方向分页地址
fnSetPos(y,x1); //起点定位
x1 = turnf[ x & 0x07 ];
x1=0xF0|x1|s; //字节内位置计算
fnPR12(x1); //画上屏幕,S显示属性8画点0擦除点
}
/************************************************/
/*画线。任意方向的斜线,直线数学方程 aX+bY=1 */
/************************************************/
void Linexy(uchar x0,uchar y0,uchar xt,uchar yt,uchar s)
{
register uchar t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol; delta_x = xt-x0; //计算坐标增量
delta_y = yt-y0;
uRow = x0;
uCol = 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(uRow,uCol,s); //画点
xerr += delta_x ;
yerr += delta_y ;
if( xerr > distance )
{
xerr-=distance;
uRow+=incx;
}
if( yerr > distance )
{
yerr-=distance;
uCol+=incy;
}
}
} /************************************************/
/*画圆。数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2 */
/************************************************/
void circle(uchar Ox,uchar Oy,uchar Rx,uchar s)
{
unsigned int xx,rr,xt,yt,rs,row,col;
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--;
row=Ox+xt; //第一象限
col=Oy-yt;
point(row,col,s);
row=Ox-xt; //第二象限
point(row,col,s);
col=Oy+yt; //第三象限
point(row,col,s);
row=Ox+xt; //第四象限
point(row,col,s); /***************45度镜象画另一半***************/ row=Ox+yt; //第一象限
col=Oy-xt;
point(row,col,s);
row=Ox-yt; //第二象限
point(row,col,s);
col=Oy+xt; //第三象限
point(row,col,s);
row=Ox+yt; //第四象限
point(row,col,s);
}
}
void main(void) // 测试用
{
uchar i;
shortdelay(1200);
MCUCR |=BIT(SRE)|BIT(SRW);
fnLCMInit();
cls();
cursor(0,0);
dprintf(3,3,"This is a test: 中文测试"); dprintf(0,6,"LCM Exsample use 90S8515&6963");
dprintf(15,7,"~Xiaoqi~");
Linexy(10,20,239,110,8); // 画斜线1
Linexy(10,20,217,1,8); // 斜线2
Linexy(239,110,217,1,8); // 斜线3
circle(185,45,40,8); // 画圆
circle(185,45,41,8); // 画同心圆加粗
shortdelay(24000); while(1)
{
//变化圆演示,直径不断的变化,由大到小再由小到大来回缩放
for (i=40;i>5;i--)
{
circle(185,45,i+1,0); //擦除外圆
circle(185,45,i,8);
circle(185,45,i-1,8);
shortdelay(3600);
}; shortdelay(8000); for (i=5;i<40;i++)
{
circle(185,45,i-1,0); //擦除内圆
circle(185,45,i,8);
circle(185,45,i+1,8);
shortdelay(1800);
}; shortdelay(4000); };
}