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

📄 lcd128_64main.c

📁 keil C51写的LCD驱动 for 12864
💻 C
📖 第 1 页 / 共 2 页
字号:
//		 128x64液晶KS0108驱动程序(C51) 
/*------------------------------------------------------------------------------------------
[文件名] 12864.c
[功能] 128X64驱动程序
[版本] 2.0
[作者] 鞠春阳
[最后修改时间] 2003年5月12日
[版权所有] www.mcuzb.com
[资料] 请到www.mcuzb.com下载
===========================================================================================*/ 
#include <REGX52.H>

#include "absacc.h"
#include "intrins.h"

//自定义库 在"C:\comp51\UserLib\"文件夹中
//#include "ASCII0816.h" //标准ASCII库

//#include ".\inc\HZTable.h" //汉字点阵库(自做)
//#include ".\inc\Menu.h" //菜单库(自做)

// LCD128*64 数据线
#define LCD12864DataPort P3
unsigned char code ASCII0816[]; 
// LCD128*64 I/O 信号管脚
sbit di =P1^3; // 数据\指令 选择
sbit rw =P1^4; // 读\写 选择
sbit en =P1^5; // 读\写使能

//sbit dc=P1^3; /*P1.3 LCD 的RS 21*/
//sbit rw=P1^4; /*P1.4 LCD 的R/W 22*/
//sbit cs=P1^5; /*P1.5 LCD 的E 25*/

sbit cs1 =P2^2; // 片选1,低有效(前64列)
sbit cs2 =P2^1; // 片选2,低有效(后64列)
sbit reset=P2^0; // 复位


/*----------------------------------------------------------------------------------------------------*/
/* ****函数列表****

//开关显示
void SetOnOff(unsigned char onoff)

//选择屏幕
//screen: 0-全屏,1-左屏,2-右
void SelectScreen(unsigned char screen)

//清屏
//screen: 0-全屏,1-左屏,2-右
void ClearScreen(unsigned char screen)

//显示8*8点阵
//旋转90度:字模被竖着切分
//lin:行(0-7), column: 列(0-15)
//address : 字模区首地址
void Show88(unsigned char lin,unsigned char column,unsigned int address)

//显示8*16字符
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//character:字符代码(标准ASCII码)
void ShowChar(unsigned char lin,unsigned char column,unsigned char character)

//显示8*16字符串
//!!!只能显示在一行上即: 串长+column <=15
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//address : 字模区首地址
void ShowString(unsigned char lin,unsigned char column, unsigned char *string)

//显示一个汉字
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//hzcode: 汉字代码(自定义的)
void ShowHZ(unsigned char lin,unsigned char column,unsigned int hzcode)

//显示图片
//旋转90度 :字模被竖着切分
//startline :开始行
//startcolumn:开始列
//linechar :图片行点除8(图片以8*8点阵为单位)
//columnchar :图片列点除8(图片以8*8点阵为单位)
//address : 字模区首地址
void ShowPicture(unsigned char startline,unsigned char startcolumn,unsigned char linechar,unsigned char columnchar,unsigned int address)
//!!问题大户
//显示一行汉字
//lin:行
//lineheadaddr: 此行汉字代码区首地址
void ShowLine(unsigned char lin,unsigned int lineheadaddr)

//显示一屏汉字
//pageheadaddr:此屏汉字代码地址区首地址
void ShowPage(unsigned int pageheadaddr)

//反显一个8*8字块
//lin:行(0-3), column: 列(0-7)
void ReverseShow88(unsigned char lin,unsigned char column)


//反显一个字符
//lin:行(0-4), column: 列(0-15)
void ReverseShowChar(unsigned char lin,unsigned char column)


//反显一个汉字
//lin:行(0-3), column: 列(0-7)
ReverseShowHZ(unsigned char lin,unsigned char column)

//反显一行汉字
//lin:行
ReverseShow(unsigned char lin)

//初始化LCD
void InitLCD()

****函数列表结束**** */
/*----------------------------------------------------------------------------------------------------*/

/*--基本函数源程序------------------------------------------------------------------------------------*/
//延时
void mydelay(void);
Lcd12864delay()
{
   unsigned int i=500;
   while(i--) {;}
}
/*----------------------------------------------------------------------------------------------------*/
//状态检查
void CheckState()
{
	unsigned char dat;
	Lcd12864delay();
	return;
	di=0;
	en=1;
	rw=1;
	LCD12864DataPort=0xff;
	//P3=0xff;
	do
	{	en=1; _nop_(); _nop_(); _nop_(); _nop_();
		LCD12864DataPort=0xff;
		P0=0xfb;mydelay(); 
		dat=LCD12864DataPort;		
		 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
		en=0;		
		P0=0xf7;mydelay(); 
		dat=0x80 & dat; //仅当第4,7位为0时才可操作 0x90
	} while(!(dat==0x00));
	P0 = 0x77;
	mydelay();
}
/*----------------------------------------------------------------------------------------------------*/
//写显示数据
//dat:显示数据
void WriteByte(unsigned char dat)
{
	CheckState();
	//mydelay();
	en=1; di=1; rw=0;
	LCD12864DataPort=dat;
	en=1; en=0;
}
/*-----------------------------------------------------------------------------------------------------*/
//向LCD发送命令
//command :命令
void SendCommandToLCD(unsigned char command)
{
	CheckState();
	en=1; 
	rw=0; di=0;
	LCD12864DataPort=command;
	en=0;
}
/*----------------------------------------------------------------------------------------------------*/
//设定行地址(页)--X 0-7
void SetLine(unsigned char line)
{
	line=line & 0x07; // 0<=line<=7
	line=line | 0xb8; //1011 1xxx
	SendCommandToLCD(line);
}
//设定列地址--Y 0-63
void SetColumn(unsigned char column)
{
	column=column & 0x3f; // 0=<column<=63
	column=column | 0x40; //01xx xxxx
	SendCommandToLCD(column);
}
//设定显示开始行--XX
void SetStartLine(unsigned char startline) //0--63
{
	//startline=startline & 0x07;//?
	startline=startline & 0x3f;
	startline=startline | 0xc0; //1100 0000
	SendCommandToLCD(startline);
}
//开关显示
void SetOnOff(unsigned char onoff)
{
	onoff=0x01 & onoff;
	onoff=0x3e | onoff; //0011 111x
	SendCommandToLCD(onoff);
}
/*---------------------------------------------------------------------------------------------------*/
//选择屏幕
//screen: 0-全屏,1-左屏,2-右屏
void SelectScreen(unsigned char screen)
{ //北京显示器:负有效 cs1: 0--右; cs2: 0--左
	switch(screen)
	{ 
	case 0: cs1=0;//全屏
			_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
			cs2=0; 
			_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
			break; 
	case 1: cs1=1;//左屏
			_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
			cs2=0;
			_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
			break;
	case 2: cs1=0;//右屏
			_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
			cs2=1;
			_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
			break;
	}
}
/*---------------------------------------------------------------------------------------------------*/
//清屏
//screen: 0-全屏,1-左屏,2-右
void ClearScreen(unsigned char screen)
{ unsigned char i,j;
  SelectScreen(screen);
  for(i=0;i<8;i++)
  { SetLine(i);
    for(j=0;j<64;j++)
    {
      WriteByte(0x05);
     }
  }
}
/*--------------------------------------------------------------------------------------------------*/
//显示8*8点阵
//旋转90度:字模被竖着切分
//lin:行(0-7), column: 列(0-15)
//address : 字模区首地址
void Show88(unsigned char lin,unsigned char column,unsigned int address)
{ unsigned char i;
  if(column>16) {return;}
  if(column<8) SelectScreen(1); //如果列数<8(0,1,2,3,4,5,6,7)则写在第一屏上
  else {
     SelectScreen(2); //否则 (8,9,10,11,12,13,14,15)写在第二屏上
     column=column & 0x07; //防止越界
   }
   SetLine(lin);
   SetColumn(column<<3);
   for(i=0;i<8;i++) WriteByte( CBYTE[address+i] );
}
/*------------------------------------------------------------------------------------------------*/
//显示8*16字符
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//character:字符代码(标准ASCII码)
void ShowChar(unsigned char lin,unsigned char column,unsigned char character)
{  lin=lin<<1;
   Show88(lin ,column,ASCII0816[character-0x20] );
   Show88(lin+1,column,ASCII0816[character-0x20]+8 );
}
/*-----------------------------------------------------------------------------------------------*/
/*
//显示8*16字符串
//!!!只能显示在一行上即: 串长+column <=15
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//address : 字模区首地址
void ShowString(unsigned char lin,unsigned char column, unsigned char *string)
{ unsigned char ch;
unsigned char i=0;

while(*string!=''\0'')
{
ch=*string;
if(i+column >15) break; //(只能显示在一行上即: 串长+column <=15)
ShowChar(lin,i+column,ch);
string++; i++;
}
}
*/
/*----------------------------------------------------------------------------------------------*/
//显示一个汉字
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-7)
//hzcode: 汉字代码(自定义的)
//uchar code HZtable
void ShowHZ(unsigned char lin,unsigned char column,unsigned int hzcode)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -