📄 gdm12864ep.c
字号:
//============本程序为GDM12864E内带中文字符集的液晶显示模块驱动程序=============================
//**这里采用并行工作方式,占用I/O数据线8条,RS、R/W、E各一条,共11根I/O。
//**单片机为c8051f206
//**作者:陈丰良 Email: elemcu@sohu.com
//**创建时间:2004.3.23
//**
//**
#include <C8051F206.h> // Register definition file.
/*=======基本指令集=========*/
#define Base_Module 0x30 /*基本指令集*/
#define Clear_Display 0x01 /*清除显示器,清除DDRAM*/
#define Go_Origin 0x02 /*光标返回到原点,AC=0,DDRAM不变*/
#define Right_ACAdd 0x06 //设定光标移动方向,光标左移 AC-1
#define Left_ACDec 0x07 //设定光标移动方向,光标右移,AC+1
#define Clear_Screen 0x08 /*显示器关闭*/
#define On_Screen 0x0c /*显示器打开*/
#define Off_Cursor 0x0d /*光标显示关*/
#define On_Cursor 0x0e /*光标显示开*/
#define Reverse_Current 0x0f /*光标位置显示取反*/
#define LeftShift_Cursor 0x10 /*光标左移,AC-1*/
#define RightShift_All 0x18 /*画面整体左移*/
#define RightShift_Cursor 0x14 /*光标右移,AC+1*/
#define LeftShift_All 0x1c /*画面整体右移*/
/*=======扩充指令集=========*/
#define Expand_Module 0x34 /*扩充指令集*/
#define Wait_Module 0x01 //进入待命模式,执行任何其他指令都可
//终止待命模式,只保留COM33显示
#define Enable_ICGRAMBitAddr 0x02 /*允许输入IRAM,CGRAM位址*/
#define Enable_UprightnessBitAddr 0x03 /*允许输入垂直滚动位址*/
#define Reverse_WhiteOne 0x04 /*选择4行中的一行反白*/
#define Reverse_WhiteSecond 0x05 /*选择4行中的二行反白*/
#define On_ Sleep 0x08 /*进入睡眠模式*/
#define Off_Sleep 0x0c /*脱离睡眠模式*/
#define On_Plot 0x0c /*绘图显示开*/
#define Off_Plot 0x0c /*绘图显示关*/
//
//=========以下是数字1234567890。----------------------------------------------
/*-- 文字: 0 --*/
/*-- Verdana22; 此字体下对应的点阵为:宽x高=21x35 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=24x35 --*/
unsigned char code PNumber0[64]={
/*-- 文字: 0 --*/
/*-- Impact18; 此字体下对应的点阵为:宽x高=16x37 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,
0x0F,0xF0,0x1F,0xF8,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,
0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,
0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x1E,0x7C,0x1F,0xF8,0x0F,0xF0,0x07,0xE0,0x00,0x00,
0x00,0x00,0x00,0x00};
/*-- 文字: 1 --*/
/*-- Impact18; 此字体下对应的点阵为:宽x高=16x32 --*/
unsigned char code PNumber1[64]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,
0x03,0x80,0x0F,0x80,0x3F,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0x1F,0x80,0x0F,0x80,
0x0F,0x80,0x0F,0x80,0x0F,0x80,0x0F,0x80,0x0F,0x80,0x0F,0x80,0x0F,0x80,0x0F,0x80,
0x0F,0x80,0x0F,0x80,0x0F,0x80,0x0F,0x80,0x0F,0x80,0x0F,0x80,0x0F,0x80,0x00,0x00,
0x00,0x00,0x00,0x00};
/*-- 文字: 2 --*/
/*-- Verdana22; 此字体下对应的点阵为:宽x高=21x35 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=24x35 --*/
unsigned char code PNumber2[64]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,
0x1F,0xE0,0x1F,0xF0,0x3C,0xF0,0x3C,0xF8,0x3C,0xF8,0x3C,0xF8,0x3C,0xF8,0x00,0xF8,
0x01,0xF8,0x01,0xF0,0x03,0xF0,0x03,0xF0,0x07,0xE0,0x07,0xE0,0x07,0xC0,0x0F,0xC0,
0x0F,0x80,0x1F,0x80,0x1F,0x00,0x3F,0x00,0x3F,0xF0,0x3F,0xF0,0x3F,0xF0,0x00,0x00,
0x00,0x00,0x00,0x00};
/*-- 文字: 3 --*/
/*-- Verdana22; 此字体下对应的点阵为:宽x高=21x35 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=24x35 --*/
unsigned char code PNumber3[64]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,
0x1F,0xF0,0x1F,0xF8,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x00,0x7C,
0x00,0x7C,0x03,0xF8,0x03,0xF0,0x03,0xF8,0x00,0xFC,0x00,0x7C,0x3E,0x7C,0x3E,0x7C,
0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x1F,0xF8,0x1F,0xF8,0x07,0xE0,0x00,0x00,
0x00,0x00,0x00,0x00};
/*-- 文字: 4 --*/
/*-- Verdana22; 此字体下对应的点阵为:宽x高=21x35 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=24x35 --*/
unsigned char code PNumber4[64]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xF8,
0x07,0xF8,0x07,0xF8,0x0F,0xF8,0x0F,0xF8,0x0F,0xF8,0x1E,0xF8,0x1E,0xF8,0x1E,0xF8,
0x3C,0xF8,0x3C,0xF8,0x7C,0xF8,0x78,0xF8,0x78,0xF8,0xF8,0xF8,0xFF,0xFE,0xFF,0xFE,
0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0x00,
0x00,0x00,0x00,0x00};
/*-- 文字: 5 --*/
/*-- Verdana22; 此字体下对应的点阵为:宽x高=21x35 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=24x35 --*/
unsigned char code PNumber5[64]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFC,
0x3F,0xFC,0x3F,0xFC,0x3E,0x00,0x3E,0x00,0x3E,0x00,0x3E,0xF0,0x3F,0xF8,0x3F,0xFC,
0x3E,0x7C,0x3E,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,
0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x1E,0x7C,0x1F,0xF8,0x0F,0xF0,0x07,0xE0,0x00,0x00,
0x00,0x00,0x00,0x00};
/*-- 文字: 6 --*/
/*-- Verdana22; 此字体下对应的点阵为:宽x高=21x35 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=24x35 --*/
unsigned char code PNumber6[64]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,
0x0F,0xF8,0x1F,0xF8,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x00,0x3E,0x00,0x3E,0xF0,
0x3F,0xF8,0x3F,0xFC,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,
0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x1F,0xF8,0x0F,0xF0,0x07,0xE0,0x00,0x00,
0x00,0x00,0x00,0x00};
/*-- 文字: 7 --*/
/*-- Verdana22; 此字体下对应的点阵为:宽x高=21x35 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=24x35 --*/
unsigned char code PNumber7[64]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,
0xFF,0xF0,0xFF,0xF0,0x01,0xF0,0x01,0xF0,0x01,0xF0,0x01,0xE0,0x03,0xE0,0x03,0xE0,
0x03,0xE0,0x03,0xC0,0x07,0xC0,0x07,0xC0,0x07,0xC0,0x0F,0x80,0x0F,0x80,0x0F,0x80,
0x0F,0x80,0x1F,0x00,0x1F,0x00,0x1F,0x00,0x1F,0x00,0x3E,0x00,0x3E,0x00,0x00,0x00,
0x00,0x00,0x00,0x00};
/*-- 文字: 8 --*/
/*-- Verdana22; 此字体下对应的点阵为:宽x高=21x35 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=24x35 --*/
unsigned char code PNumber8[64]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,
0x0F,0xF0,0x1F,0xF8,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,
0x3E,0x7C,0x1F,0xF8,0x0F,0xF0,0x1F,0xF8,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,
0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x1F,0xF8,0x1F,0xF8,0x07,0xE0,0x00,0x00,
0x00,0x00,0x00,0x00};
/*-- 文字: 9 --*/
/*-- Verdana22; 此字体下对应的点阵为:宽x高=21x35 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=24x35 --*/
unsigned char code PNumber9[64]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,
0x0F,0xF0,0x1F,0xF8,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,
0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x3F,0xFC,0x1F,0xFC,0x0F,0x7C,0x00,0x7C,
0x00,0x7C,0x3E,0x7C,0x3E,0x7C,0x3E,0x7C,0x1F,0xF8,0x1F,0xF0,0x07,0xE0,0x00,0x00,
0x00,0x00,0x00,0x00};
/*-- 文字: . --*/
/*-- Verdana22; 此字体下对应的点阵为:宽x高=16x37 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=16x32 --*/
unsigned char code PDot[64]={
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,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x78,0x00,0x78,0x00,0x78,0x00,0x78,0x00,0x78,0x00,0x00,0x00,
0x00,0x00,0x00,0x00};
//================================================
//实用于晶振为2MHz
DelayMs(unsigned char x){
unsigned int y;
for(;x!=0;x--){for(y=2000;y!=0;y--){}}
}
//================================================
DelayUs(unsigned int t){
for(;t!=0;t--){;}
}
//================================================
//读取忙标志(BF),可以确认内部动作是否完成,同时
//可以读出位址计数(AC)的值
unsigned char LCDWaitLeisure()
{
unsigned char x;
LCD_DATA_DIR=FROM_LCD; //准备从LCD读忙指令
LCD_DATA=0XFF; //数据线设置为高阻
LCD_RS=0; //选择指令寄存器
LCD_RW=1; //从LCD读出
do
{
LCD_E=1; //读
x=LCD_DATA; //等待直到LCD有空闲
LCD_E=0;
}while (x&0x80);
LCD_RS=1;
LCD_RW=1;
return x&0x7f;
}
//================================================
//将操作命令写入对液晶显示器
LCDWriteCommand(unsigned char x){
unsigned char d;
d=LCDWaitLeisure(); //等待LCD空闲
LCD_DATA_DIR=TO_LCD; //准备向LCD写指令
LCD_RS=0; //选择指令寄存器
LCD_RW=0; //
LCD_E=1; //写入
LCD_DATA=x; //向LCD写入的数据
LCD_E=0;
LCD_RS=1; //选择指令寄存器
LCD_RW=1; //
}
//从LCD读出n字节数据=============================
LCDReadNByte(unsigned char *pd,unsigned char n){
unsigned char d;
//dummy虚拟读一次,将数据丢弃
d=LCDWaitLeisure(); //等待LCD空闲
LCD_RS=1; //选择数据寄存器
LCD_RW=1; //
LCD_E=1; //读
*pd=LCD_DATA; //等待直到LCD有空闲
LCD_E=0;
//有用的数据开始读
for(;n!=0;n--,pd++)
{
d=LCDWaitLeisure(); //等待LCD空闲
// LCD_DATA_DIR=FROM_LCD; //准备从LCD读数据
LCD_RS=1; //选择数据寄存器
LCD_RW=1; //
LCD_E=1; //读
*pd=LCD_DATA; //等待直到LCD有空闲
LCD_E=0;
}
}
//向LCD写入n字节数据=============================
LCDWriteNByte(unsigned char *pd,unsigned char n){
unsigned char d;
for(;n!=0;n--,pd++)
{
d=LCDWaitLeisure(); //等待LCD空闲
LCD_DATA_DIR=TO_LCD; //准备向LCD写数据
LCD_RS=1; //选择数据寄存器
LCD_RW=0; //
LCD_E=1; //写
LCD_DATA=*pd; //等待直到LCD有空闲
LCD_E=0;
}
LCD_RW=1; //
}
//=============================================
//设定字符串将要从y行,x列写入
LCDSelectPlace(unsigned char PlaceY,unsigned char PlaceX){
switch(PlaceY){
case 1: PlaceY=0x80+PlaceX; break;
case 2: PlaceY=0x90+PlaceX; break;
case 3: PlaceY=0x88+PlaceX; break;
case 4: PlaceY=0x98+PlaceX; break;
default: break;
}
LCDWriteCommand(Base_Module);
LCDWriteCommand(PlaceY); //设定字符串将要从y行,x列写入
}
//================================================
//将要显示的字符编码写入液晶显示器
//输入条件为:字符串地址pc,写入的行y、列位置x、字数n
LCDPrintChar(unsigned char *pd,unsigned char PlaceY,unsigned char PlaceX,unsigned char n){
LCDSelectPlace(PlaceY,PlaceX); //第y第X列开始写字符
LCDWriteNByte(pd,n); //向LCD写入N字节数据
}
//=================================================
//将要显示的字符串编码写入液晶显示器
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -