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

📄 temp.c

📁 液晶程序液晶程序液晶程序液晶程序液晶程序液晶程序
💻 C
字号:
#include <reg52.h>
#include <hz.h>

//宏**************************************************************************************************8
#define zkpos(num,stadd)  (stadd+(num&0x00ff)*32)//通过字符编号算出字符在字符库中的地址num的低两位为地址编号

typedef unsigned char uchar;

//全局变量声明
extern unsigned char xdata KEY_BUF;

//变量定义**************************************************************************
unsigned char xdata XPOS; //XPOS	为0~7
unsigned char xdata YPOS; //YPOS 为0~127
unsigned char data COM; //command
unsigned char data DAT; //data
unsigned char code * data HZKSTADD = hzk;//汉字库起始地址
//地址定义*********************************
/*unsigned char xdata *WCADD_1=0x4000;
unsigned char xdata *RCADD_1=0x4200;
unsigned char xdata *WDADD_1=0x4100;
unsigned char xdata *RDADD_1=0x4300;

unsigned char xdata *WCADD_2=0x6000;
unsigned char xdata *RCADD_2=0x6200;
unsigned char xdata *WDADD_2=0x6100;
unsigned char xdata *RDADD_2=0x6300;
*/
unsigned char xdata *WCADD_1=0xC000;
unsigned char xdata *RCADD_1=0xC002;
unsigned char xdata *WDADD_1=0xC001;
unsigned char xdata *RDADD_1=0xC003;

unsigned char xdata *WCADD_2=0xE000;
unsigned char xdata *RCADD_2=0xE002;
unsigned char xdata *WDADD_2=0xE001;
unsigned char xdata *RDADD_2=0xE003;

//变量声明************************************************
bit FB_FLAG;//反白标志位,反白FB_FLAG=1,正常FB_FLAG=0

//读写基本子程序
void cmdwrite_1(uchar com)//左侧写命令
{
	while((*RCADD_1&0x80)!=0);//不为0 ,忙,等待
	*WCADD_1=com;
}

void datwrite_1(uchar dat)//左侧写数据
{
	while((*RCADD_1&0x80)!=0);//不为0 ,忙,等待
	*WDADD_1=dat;
}

/*
void datread_1() //左侧读数据(no use)
{
	while(*RCADD_1&0x80!=0);
	DAT=*RDADD_1;
}
*/

void cmdwrite_2(uchar com)//右侧写命令
{
	while((*RCADD_2&0x80)!=0);//不为0 ,忙,等待
	*WCADD_2=com;
}

void datwrite_2(uchar dat)//右侧写数据
{
	while((*RCADD_2&0x80)!=0);//不为0 ,忙,等待
	*WDADD_2=dat;
}

/*
void datread_2()//右侧读数据(no use)
{
	while(*RCADD_2&0x80!=0);
	DAT=*RDADD_2;
}
*/
//---------------------------------------------------------------

//初始化
void lcm_init()
{
	COM=0x3f;//开显示
	cmdwrite_1(COM);
	cmdwrite_2(COM);

	COM=0xc0;//显示启始行
	cmdwrite_1(COM);
	cmdwrite_2(COM);
}
//---------------------------------------------------------------

//清屏
void clearscreen()
{
	uchar x,y;
	for(x=0;x<8;x++)
	{
		COM=x|0xB8;
		cmdwrite_1(COM);
		cmdwrite_2(COM);
		COM=0X40;
		cmdwrite_1(COM);
		cmdwrite_2(COM);
		for(y=0;y<64;y++)
		{
			DAT=0x0;
			datwrite_1(DAT);
			datwrite_2(DAT);
		}
	}
}
//---------------------------------------------------------------

//设定液晶显示起始坐标,输入:液晶显示字符的地址 XPOS为0~7,YPOS为0~127,不影响XPOS,YPOS
void setxy()
{
	if(YPOS<=63)
	{     //设左侧lcm
		cmdwrite_1(XPOS|0xB8);//设左侧页命令
		cmdwrite_1(YPOS|0x40);}//设左侧列命令
	else 
	{    //设右侧LCM	
		cmdwrite_2(XPOS|0xB8);//设左侧页命令
		cmdwrite_2(YPOS|0x40);
	}//设左侧列命令
}
//--------------------------------------------------------

//写一个字节,不影响YPOS
void write_byte()
{
	if(YPOS<=63)
		datwrite_1(DAT);//字节写入左侧
	else
		datwrite_2(DAT);//字节写入右侧
}
//-----------------------------------------------------------

//写一个汉字16*16,输入:液晶显示字符的起始坐标XPOS,YPOS,字符的首地址*hzkpos,执行后XPOS,YPOS 不变
void write_ch(uchar *hzkpos)
{
	uchar xtimes,ytimes,ytemp;
	for(xtimes=0;xtimes<2;xtimes++)
	{
		XPOS=XPOS+xtimes;   //换下一页,一个汉字占两页 
		ytemp=YPOS;
		for(ytimes=0;ytimes<16;ytimes++)//一页中列变量自动加1写16列,但YPOS不变
		{
			if(FB_FLAG==0)
				DAT=*hzkpos;
			else
				DAT=(255-*hzkpos); 
			YPOS++;
			setxy();
			write_byte();//将一个字节写入
			hzkpos++;
		}//指向下个字节
		YPOS = ytemp;
	}
	XPOS--;
}//恢复页坐标
//-----------------------------------------------------------------------

//写一个英文字符8*16,输入:液晶显示字符的起始坐标XPOS,YPOS,字符的首地址hzkpos,执行后XPOS,YPOS 不变
void write_eng(uchar *hzkpos)
{
	uchar xtimes,ytimes,ytemp;
	for(xtimes=0;xtimes<2;xtimes++)
	{
		XPOS = XPOS+xtimes;              //换下一页,一个字符占两页
		ytemp = YPOS;
		for(ytimes=0;ytimes<8;ytimes++)//一页 列变量自动加1写8列,但YPOS不变
		{
			if(FB_FLAG==0)
				DAT=*hzkpos;
			else
				DAT=(255-*hzkpos); 
			YPOS++;
			setxy();
			write_byte();//将一个字节写入
			hzkpos++;
		}
		YPOS = ytemp;
	}//指向下个字节
	XPOS--;
}
//---------------------------------------------------------------------

//确定下个汉字在液晶上的显示坐标XPOS,YPOS,输入XPOS,YPOS为上一字符的坐标
void c_lcmnext()
{
	YPOS=YPOS+16;
	if(YPOS>127)
	{
		XPOS=XPOS+2;
		YPOS=0;
	}
}//写到最后一列,换到下一个字符显示行,列坐标置0
//----------------------------------------------------------------

//确定下个英文在液晶上的显示坐标XPOS,YPOS,输入XPOS,YPOS为上一字符的坐标
void e_lcmnext()
{
	YPOS=YPOS+8;
	if(YPOS>127)
	{
		XPOS=XPOS+2; 
		YPOS=0;
	}
}//写到最后一列,换到下一个字符显示行,列坐标置0
//-------------------------------------------------------------------

//以下为被调用函数putstr,输入为字符串起始坐标XPOS,YPOS,  字符串的起始地址STR,是否需要反白显示标志位FB_FLAG
void putstr(unsigned int *STR)
{
	unsigned int *charnumpt=STR;//指向编号的指针。最初指向该字符串的第一个字符编码
	unsigned int charnum;
	unsigned char code *hzkpos;//字符在汉字库中的地址

⌨️ 快捷键说明

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