⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdm12864ep.c

📁 128×64液晶接口程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//============本程序为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 + -