📄 demo.c
字号:
// CEEBACK.GAO. 2006-05-09
// 目标器件: LCM: AG_320240,SED1335
// MCU: STC89C58RD+
// 实现功能: 可以写 ASCII 码字符,写汉字(文本层,图形层)
// 画直线,画圆;
// 说明:对320*240点阵屏幕坐标定位如下
// 左上角为原点(0,0),水平向右为X轴正方向,垂直向下为Y轴正方向
// X 轴坐标取值范围: 0~319;
// Y 轴坐标取值范围: 0~239;
// 字模提取方法:采zimo221软件,纵向取模,再修改图像->旋转90度->图像上下调换。
// 这样依次得到左上部, 左下部, 右上部和右下部四部分分配代码
#include <mcs51.h>
#include <absacc.h>
//#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
// 直接访问方式地址定义,根据用户平台接口修改
#define LCD_CMD_ADR XBYTE[0xBF02] // 写指令代码地址 读参数及显示数据地址
#define LCD_DAT_ADR XBYTE[0xBF00] // 写参数及显示数据地址 读忙状态地址
//#define rdadd1 XBYTE[0xBF02]
//#define rbadd1 XBYTE[0xBF00]
// 程序参数定义,根据用户选择的LCM型号修改
#define PARA 0x28
#define SAD2 0X04B0
// 定义调用函数
void CCW1_PR(uchar O_X,uchar O_Y,uint num); // 汉字写入函数(文本方式)
void CCW2_PR(uchar O_X,uchar O_Y,uint num); // 汉字写入函数(图形方式)
void CGRAM(uint num);
void clear_lcd(void);
void initial_lcd(void);
void draw_dot(int O_X,uchar O_Y); // 绘点函数
void w_ASCII(uchar O_X,uchar O_Y,uchar num); // 写ASCII码函数
void w_string(uchar O_X,uchar O_Y,const uchar *STRING);
void draw_vertical(uchar y1,uchar y2,int x);
void draw_horizontal(int x1,int x2,uchar y);
void draw_bias(int x1,uchar y1,int x2,uchar y2);
void draw_circle(int x0,uchar y0,uchar radius);
//-------------------240128的SYSTEM SET 参数-------------------------------
//code unsigned char SYSTAB[8]={0x30,0x87,0x07,0x1e,0x47,0x80,0x1f,0x00};
unsigned char SYSTAB[8]={0x30,0x87,0x07,0x27,0x47,0xef,0x28,0x00}; // 自己修改的
//code unsigned char SCRTAB[10]={0x00,0x00,0x80,0xf0,0x01,0x80,0x00,0x00,0x00,0x00};
unsigned char SCRTAB[8]={0x00,0x00,0xf0,0xb0,0x04,0xf0,0x2F,0x2A}; // 自己修改的
// 在此可以观察文本方式下的字符及光标的显示效果(写入内容为"Sevicer tel:")
code unsigned char CTAB1[]={"TIETONG ELECTRONICS CO.LTD"};
// 文本方式下的汉字显示方法
/*在文本方式下显示汉字, 需要在SED1335 等显示RAM 内建立一个自定义字符库
CGRAM,然后通过在相应的单元写入相应的字符代码来实现汉字的显示.
SED1335 等的字符代码对应的是8x8 点阵的字符块, 而一个汉字需要四个8x8
点阵的字符块组合显示, 所以在建立汉字的CGRAM 时, 需要四个字符代码管理一个
汉字, 一般是按左上部, 左下部, 右上部和右下部四部分分配代码. 比如在演示程
序中建立 "清华" 两个汉字的CGRAM,那么这两个汉字的代码为80H(81H,82H,83H)和
84H(85H,86H,87H).*/
code uchar CGTAB[][32]={
/*-- 文字: 泉 --*/
0x03,0x3F,0x3F,0x30,0x3F,0x30,0x3F,0x3F,0x01,0x7D,0x7D,0x0D,0x19,0x77,0xC3,0x00,
0x00,0xF8,0xF8,0x18,0xF8,0x18,0xF8,0xF8,0x80,0x8C,0xD8,0xE0,0xB0,0x9E,0x0C,0x00,
/*-- 文字: 州 --*/
0x18,0x19,0x19,0x19,0x59,0x5D,0x5D,0xDB,0x9B,0x99,0x19,0x31,0x31,0x61,0x60,0x00,
0x0C,0x8C,0x8C,0x8C,0x8C,0xCC,0xCC,0xAC,0xAC,0x8C,0x8C,0x8C,0x8C,0x8C,0x0C,0x00,
/*-- 文字: 铁 --*/
0x30,0x30,0x3D,0x7D,0xC1,0xFB,0x78,0x33,0x7B,0x78,0x30,0x3C,0x39,0x33,0x02,0x00,
0x30,0x30,0xB0,0xFC,0xFC,0x30,0x30,0xFE,0xFE,0x30,0x70,0xD8,0x8C,0x06,0x02,0x00,
/*-- 文字: 通 --*/
0x07,0x67,0x31,0x10,0x07,0xF7,0xF6,0x37,0x36,0x37,0x36,0x36,0x38,0x6F,0xC7,0x00,
0xFC,0xF8,0xB0,0xE0,0xFC,0xFC,0x6C,0xFC,0x6C,0xFC,0x6C,0x6C,0x00,0xFE,0xFE,0x00,
/*-- 文字: 电 --*/
0x03,0x03,0x3F,0x3F,0x33,0x33,0x3F,0x33,0x33,0x3F,0x3F,0x33,0x03,0x03,0x01,0x00,
0x00,0x00,0xF8,0xF8,0x18,0x18,0xF8,0x18,0x18,0xF8,0xF8,0x06,0x06,0xFE,0xFC,0x00,
/*-- 文字: 子 --*/
0x3F,0x3F,0x00,0x00,0x01,0x01,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01,0x07,0x03,0x00,
0xF8,0xF8,0x30,0x60,0xC0,0x80,0xFE,0xFE,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,
/*-- 文字: 设 --*/
0x23,0x33,0x1B,0x13,0x07,0xF6,0xF7,0x37,0x33,0x33,0x31,0x3C,0x39,0x37,0x06,0x00,
0xF0,0xF0,0x30,0x30,0x3E,0x1E,0xF8,0xF8,0x18,0x30,0xB0,0xE0,0xF0,0x9E,0x0C,0x00,
/*-- 文字: 备 --*/
0x06,0x07,0x0F,0x1C,0x36,0x03,0x0F,0x78,0x1F,0x1F,0x19,0x1F,0x19,0x1F,0x1F,0x00,
0x00,0xF0,0xF0,0x30,0x60,0xC0,0xF0,0x1E,0xF8,0xF8,0x98,0xF8,0x98,0xF8,0xF8,0x00,
/*-- 文字: 有 --*/
0x03,0x03,0x7F,0x7F,0x06,0x0F,0x1F,0x3C,0x6F,0xCC,0x0C,0x0F,0x0C,0x0C,0x0C,0x00,
0x00,0x00,0xFE,0xFE,0x00,0xF8,0xF8,0x18,0xF8,0x18,0x18,0xF8,0x18,0x38,0x30,0x00,
/*-- 文字: 限 --*/
0x00,0x7D,0x7D,0x6D,0x6D,0x79,0x79,0x6D,0x6D,0x6D,0x7D,0x79,0x61,0x61,0x61,0x00,
0x00,0xFC,0xFC,0x8C,0xFC,0x8C,0xFC,0xFC,0xA0,0xAC,0xB8,0xB0,0xD8,0xCE,0x84,0x00,
/*-- 文字: 公 --*/
0x00,0x0C,0x0C,0x0C,0x18,0x10,0x33,0x63,0x46,0x06,0x0C,0x18,0x3F,0x3F,0x00,0x00,
0x00,0x60,0x60,0x60,0x30,0x18,0x0C,0x06,0x00,0x60,0x60,0x30,0xF8,0x18,0x00,0x00,
/*-- 文字: 司 --*/
0x00,0x3F,0x3F,0x00,0x7F,0x7F,0x00,0x3F,0x3F,0x30,0x30,0x3F,0x3F,0x00,0x00,0x00,
0x00,0xFC,0xFC,0x0C,0xEC,0xEC,0x0C,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x3C,0x38,0x00,
/*-- 文字: 高 --*/
0x01,0x7F,0x7F,0x00,0x1F,0x18,0x1F,0x00,0x7F,0x60,0x6F,0x6C,0x6F,0x60,0x60,0x00,
0x80,0xFC,0xFC,0x00,0xF0,0x30,0xF0,0x00,0xFC,0x0C,0xEC,0x6C,0xEC,0x1C,0x18,0x00,
/*-- 文字: 时 --*/
0x00,0xFC,0xFC,0xCD,0xCD,0xCC,0xFC,0xFD,0xCC,0xCC,0xFC,0xFC,0xCC,0x00,0x00,0x00,
0x18,0x18,0x18,0xFE,0xFE,0x18,0x18,0x98,0xD8,0xD8,0x18,0x18,0x18,0x38,0x30,0x00,
/*-- 文字: 兵 --*/
0x00,0x1F,0x1F,0x18,0x18,0x1F,0x1F,0x18,0x18,0xFF,0xFF,0x04,0x0C,0x38,0x70,0x00,
0x30,0xF8,0x80,0x00,0x00,0xF8,0xF8,0x60,0x60,0xFE,0xFE,0x60,0x30,0x18,0x0C,0x00
};
/*code unsigned char CGTAB[4][32]={0x00,0x40,0x37,0x10,0x83,0x60,0x2F,0x08, // 清
0x13,0x22,0xE3,0x22,0x23,0x22,0x22,0x22,
0x40,0x48,0xFC,0x40,0xF8,0x40,0xFE,0x08,
0xFC,0x08,0xF8,0x08,0xF8,0x08,0x28,0x10,
0x04,0x04,0x08,0x08,0x18,0x29,0x4A,0x08, // 华
0x09,0x01,0xFF,0x01,0x01,0x01,0x01,0x01,
0x40,0x48,0x58,0x60,0xC0,0x40,0x44,0x44,
0x3C,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,
0x04,0xFF,0x05,0x41,0x33,0x14,0x01,0xF6, // 蓬
0x1B,0x10,0x13,0x10,0x17,0x10,0x28,0x47,
0x44,0xFE,0x40,0xF8,0x10,0xE0,0x18,0x46,
0xF8,0x40,0xF8,0x40,0xFC,0x40,0x46,0xFC,
0x00,0x43,0x30,0x10,0x00,0x07,0xF1,0x11, // 远
0x11,0x11,0x12,0x12,0x14,0x28,0x47,0x00,
0x10,0xF8,0x00,0x00,0x08,0xFC,0x20,0x20,
0x20,0x24,0x24,0x1C,0x00,0x06,0xFC,0x00 };
*/
///*******************
// 演示主程序
//*******************
void main()
{
uchar idata i;
uint idata O_X,O_Y;
uint idata j;
P23=0;
P25=1;
P24=1;
initial_lcd(); // 调初始化函数
// 中文显示(图形方式)
for(i=0;i<12;i++)
CCW2_PR(0x08+i*2,0x02,i); // 调中文显示函数(图形方式)
for(i=0;i<3;i++)
CCW2_PR(0x1b+i*2,0x16,12+i);
draw_vertical(9,239,4); // y轴 坐标系原点坐标为 (4,235)
draw_bias(4,9,0,13); // 画箭头
draw_bias(4,9,8,13);
for(i=0;i<21;i++) // 画刻度
{ j=225-i*10;
draw_horizontal(4,6,j);
}
draw_horizontal(0,299,235); // x轴
draw_bias(299,235,295,231); // 画箭头
draw_bias(299,235,295,239);
for(i=0;i<28;i++) // 画刻度
{ j=14+i*10;
draw_vertical(233,235,j);
}
w_ASCII(2,1,'Y');
w_ASCII(38,29,'X');
draw_bias(4,235,160,120);
for(i=0;i<6;i++)
draw_circle(160,120,20+i*10);
//------------西文显示-------------
LCD_CMD_ADR=0x5d; // 设光标形状
LCD_DAT_ADR=0x01;
LCD_DAT_ADR=0x87;
LCD_CMD_ADR=0x5b; // OVLAY代码
LCD_DAT_ADR=0x01;
LCD_CMD_ADR=0x59; // DISP ON\OFF代码
LCD_DAT_ADR=0x57; // 开光标闪动 2Hz
O_X=0; //X轴方向取值0~39(十进制)
O_Y=0; //Y轴方向取值0~29(十进制)
w_string(0x08,0x05,"TIETONG ELECTRONICS CO.LTD");
w_string(0x1b,0x19,"Ceeback.GAO");
//------- 中文显示(文本方式)-----------
//CGRAM(); // 调CGRAM子程序
/* num=0x00; // 取字模
O_X=0x10;
O_Y=0x03;
CCW1_PR(O_X,O_Y,num); // 调中文显示函数(文本方式)
num=0x01; // 取字模
O_X=0x12;
O_Y=0x03;
CCW1_PR(O_X,O_Y,num); // 调中文显示函数(文本方式)
num=0x02; // 取字模
O_X=0x14;
O_Y=0x03;
CCW1_PR(O_X,O_Y,num); // 调中文显示函数(文本方式)
num=0x03; // 取字模
O_X=0x16;
O_Y=0x03;
CCW1_PR(O_X,O_Y,num); // 调中文显示函数(文本方式)
*/
while(1);
}
///*****************
// 初始化函数
///*****************
void initial_lcd(void)
{
uchar idata i;
LCD_CMD_ADR=0x40; // SYSTEM SET代码
for(i=0;i<8;i++)
LCD_DAT_ADR=SYSTAB[i]; // 写入参数
LCD_CMD_ADR=0x44; // SCROLL代码
for(i=0;i<8;i++)
LCD_DAT_ADR=SCRTAB[i]; // 写入参数
LCD_CMD_ADR=0x5a; // HDOT SCR 代码
LCD_DAT_ADR=0x00; // 设置参数P1
LCD_CMD_ADR=0x5b; // OVLAY 代码
LCD_DAT_ADR=0x01; // 设置参数:显示一,三区为文本属性,合成方式为双重异或
clear_lcd(); // 调清屏函数
LCD_CMD_ADR=0x59; // 显示状态设置
LCD_DAT_ADR=0x54; // 设置参数:显示一~四区开显示
}
///******************
// 清屏函数
///******************
void clear_lcd(void)
{
uint idata i;
LCD_CMD_ADR=0x4c; // CSRDIR 代码
LCD_CMD_ADR=0x46; // CSRW 代码
LCD_DAT_ADR=0x00; // 设置参数光标指针低8位
LCD_DAT_ADR=0x00; // 设置参数光标指针高8位
LCD_CMD_ADR=0x42; // MWRITE 代码
for(i=0;i<0x8000;i++)
LCD_DAT_ADR=0x00; // 写入数据
}
// CGRAM函数
// 功能:在文本层显示汉字时使用,每次调用此函数向CGRAM
// 中写入一个汉字的点阵数据.调用代码固定为0x80
// num: 要显示字符在code uchar CGTAB[i][32] 中i的数值
void CGRAM(uint num)
{
uchar idata i;
LCD_CMD_ADR=0x5c; // CGRAMADR 代码
LCD_DAT_ADR=0x00; // 设置SAG=0x3000
LCD_DAT_ADR=0x30;
LCD_CMD_ADR=0x46; // CSRW 代码
LCD_DAT_ADR=0x00; // 设置CSR=0x3400(字符代码=80H)
LCD_DAT_ADR=0x34;
LCD_CMD_ADR=0x4c; // CSRDIR 代码
LCD_CMD_ADR=0x42; // MWRITE 代码
for(i=0;i<32;i++)
LCD_DAT_ADR=CGTAB[num][i]; // 写入字模数据
}
// 写汉字函数(文本方式)
// 经实践证明在文本层写汉字不好用,一次最多写16个汉字,
// 所以写汉字一律采用在图形层写
// 输入参数: O_X:水平
void CCW1_PR(uchar O_X,uchar O_Y,uint num)
{
uint idata j;
CGRAM(num);
j=PARA*O_Y+O_X;
LCD_CMD_ADR=0x4f; // CSRDIR 代码(下移)
LCD_CMD_ADR=0x46; // CSRW 代码
LCD_DAT_ADR=(uchar)j; // 设置光标地址
LCD_DAT_ADR=(uchar)(j>>8);
LCD_CMD_ADR=0x42; // MWRITE代码
LCD_DAT_ADR=0x80; // 写入汉字代码左上部
LCD_DAT_ADR=0x81; // 写入汉字代码左下部
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -