www.pudn.com > iar240128.rar > iar240128.c
/*本例程未使用6963的文本模式,使用程序填入字模也足够快。程序以Youth所提供 的51例程移植过来,同时对有些地方做了简化处理,增加了画线画圆的例程,好在 6963的画点有专用指令,所以不用读屏就可以直接画点。 晓奇 液晶模块供应商:广州市盛宝电子有限公司 Tel:020-87592491 Fax:87541571 Email: tinsharp@public.guangzhou.gd.cn ;************************************************************************ ;连线图: 液晶屏分为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<<(x)) #define SRE 7 #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 = 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 = 30) // 光标后移 { uRow += 16; if(uRow < 0x80) 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); }; }