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

📄 lcd.c.bak

📁 此文档是网上一款开发板的完整系统,内附有电路图纸!系统有完整的接口程式,包含了字符型LCD驱动,pc串口通讯程式,flash读写驱动程式,中文字库,ad芯片驱动程式,keyscan4*4扫描程式
💻 BAK
字号:
//**********************************************************************************
//本函数模块来自"51单片机世界",作者版主丁丁(聂小猛)。
//主页地址http://www.mcu51.com
//本程序为本站推出的"MCU51-63K仿真器"及"DX-51多功能试验板"而设计的,详情请到本站查看.
//"51单片机世界"版权所有,未经允许,不得抄袭作为商业用途
//**********************************************************************************
//点阵液晶模块上的汉字显示程序
//可以显示全部一二级中文简体汉字
//可以混显全角和半角,并自动转行
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
#include <reg52.h>
#include <absacc.h>
#include "study.h"

#define LCMD	XBYTE[0xAfff]		// 液晶数据口
#define LCMC	XBYTE[0xAbff]		// 液晶命令口
#define  LCD_DOT_X 132 // lcd 的宽点数
#define  LCD_DOT_Y 64 //lcd 的高点数
//定义光标范围,每个光标占用8*8点阵
#define LCD_MAX_X 15 //每行字符, ( LCD_MAX_X +1 ) * 8 点
#define LCD_MAX_Y 7 //共多少行,( LCD_MAX_Y +1 ) * 8  点
//光标位置定义
struct cursortype
{
   uchar x;
   uchar y;
};
struct cursortype cursor;

//*******************************
//改变LCD亮度
//输入范围0-63
void light(uchar n)
{
	LCMC=0x81;
	LCMC=n;
}
//****************************
//清屏
//入口:ch=9会连带ICON一起清除,ch=8不清除ICON
void cls(uchar ch)
{
	uchar i,j;
	for(j=0x0;j<ch;j++)
	{
		LCMC=0xb0+j;//set page
		LCMC=0x0;//set column lsb
		LCMC=0x10;//set column msb

		LCMC=0xe0;//set modify-read mode
		for(i=0;i<132;i++)
		{
			LCMD=0x00;  //填满0即清屏
        }
		LCMC=0xee;//reset modify-read mode
	}

}
//***********************
//初始化液晶
uchar lcdlight=6;
void initlcd(void)
{
	//初始化液晶
	LCMC=0x2f;//SET POWER CONTROL
	LCMC=0x20;//REGULATOR RESISTOR SELECT
	LCMC=0x81;
	LCMC=lcdlight;
	LCMC=0x40;//INITIAL DISPLAY LINE
	LCMC=0xa1;//ADC=0(SEG1~SEG132) 
	LCMC=0xc8;//SHL=0(COM1~COM64) 
	LCMC=0xa2;//SET 1/9 LCD BIAS
	LCMC=0xa6;//NORMAL DISPIAY SET
	cls(9);
	LCMC=0xaf;//DISPIAY ON
	setcursor(0,0);//设置光标到左上角
}

//**********************************************************
//在当前光标位置显示一个12*6 点阵的ASC码字符
//入口:asc字符的值ch
show_asc(uchar ch)
{
	uint addr;
	uchar hzdata[16];
	uchar xdot,i;
	addr=16*ch;  //寻址点阵在flash中的物理位置

	readeprom(addr,hzdata,16); //读出16个字节的点阵数据
	xdot=cursor.x*8+2;			//计算出横向点位置
	LCMC=xdot & 0x0f;		//将x位置送入液晶
	LCMC= 0x10 | (xdot >> 4 );   
	LCMC= 0xb0+cursor.y;    //将y位置送入液晶
	LCMC=0xe0;
	for(i=0;i<8;i++)
	{
		LCMD=hzdata[i];			//写上半个字符
	}
	LCMC=0xee;
	LCMC=xdot & 0x0f;
	LCMC= 0x10 | (xdot >> 4 );   
	LCMC= 0xb0+cursor.y+1; 
	LCMC=0xe0;
	for(;i<16;i++)				//写下半个字符
	{
		LCMD=hzdata[i];
	}
	LCMC=0xee;
}
//*************************************
//在当前光标23位置显示一个16*16 汉字或者全角字符
//入口:该汉字的区码ch1,和位码ch2
show_hz(uchar ch1, uchar ch2)
{
	ulong addr;
	uchar hzdata[32];
	uchar xdot,i;
	if (ch1>=0xb0)			//寻址汉字在flash中的物理位置
	{
		addr=(ch1-0xb0)*94+ ch2-0xa1;
		addr=addr*32+0x5a40;
	}
	else
	{
		addr=(ch1-0xa1)*94+ ch2-0xa1;
		addr=addr*32+0x800;
	}

	readeprom(addr,hzdata,32); //读出32个汉字点阵数据

	xdot=cursor.x*8+2;			//计算X位置
	LCMC=xdot & 0x0f;
	LCMC= 0x10 | (xdot >> 4 );   
	LCMC= 0xb0+cursor.y; 
	LCMC=0xe0;
	for(i=0;i<16;i++)			//显示上半个汉字
	{
		LCMD=hzdata[i];
	}
	LCMC=0xee;
	LCMC=xdot & 0x0f;
	LCMC= 0x10 | (xdot >> 4 );   
	LCMC= 0xb0+cursor.y+1; 
	LCMC=0xe0;
	for(;i<32;i++)				//显示下半个汉字
	{
		LCMD=hzdata[i];
	}
	LCMC=0xee;
}
//*******************************************
//设置光标位置
//以6×6点阵为一个光标单位,
//入口:x方向和y方向光标位置
void setcursor(uchar x, uchar y)
{
        if ( x<= LCD_MAX_X )
        cursor.x= x;
        else
        cursor.x= LCD_MAX_X;

        if ( y<= LCD_MAX_Y )
        cursor.y= y;
        else
        cursor.y= LCD_MAX_Y-1;
}

// **********************************
//在光标位置显示字符串
//入口:要显示的字符串
void printstr( uchar *pst)
{
	while ( *pst != 0 )
	{
		if ( *pst < 0x80 ) //小于0x80是字符
    	{
             if (*pst==0x0a)  setcursor(0, cursor.y+2); //处理回车换行
             else if (*pst== 0x0d) setcursor(0, cursor.y );
             else
             {
				show_asc(*pst);  //显示ASC字符
				cursor.x++;
				if (( cursor.x > LCD_MAX_X )&& (*(pst+1)!=0x0a)){cursor.x=0;cursor.y=cursor.y+2;}
			}
			pst++;	//下一个要显示的字符
		}
		else		//大于0x80是汉字
		{
			if ( cursor.x>= LCD_MAX_X )
			{
				show_asc(0x20);   //一行的尾部只有半个汉字位置的处理,加一个空格,在下一行开始显示
				cursor.y=cursor.y+2;
				cursor.x=0;
				if (cursor.y> LCD_MAX_Y) cursor.y=0; //
			}
			show_hz(*pst, *(pst+1)); //显示一个汉字
			cursor.x+=2;
			pst+=2;
			if ((cursor.x> LCD_MAX_X)&& (*(pst+1)!=0x0a)){cursor.x=0;cursor.y=cursor.y+2;}
		}
		if ( cursor.y> LCD_MAX_Y ){	cursor.x=0;cursor.y=0;return;}  
	}
}
//**********************************************
//在当前光标以十进制方式在液晶上显示一个字节的值
//入口:要显示的值
printdigit(uchar ch)
{
	uchar i[4];
	i[0]=(0x30+ch/100);
	i[1]=(0x30+(ch%100)/10);
	i[2]=(0x30+ch%10);
	i[3]=0;   //添加结束符号
	printstr(i);
}
//***********************************
//在当前光标显示一个字符
//入口:要显示的字符
printchar(uchar ch)
{
	uchar i[2];
	i[0]=ch;
	i[1]=0; //添加结束符号
	printstr(i);
}


⌨️ 快捷键说明

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