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

📄 lcm.c

📁 由CCS3.1开发
💻 C
字号:
//designed by dai
//

/*=========================================
07.12.25
Show_Left;Show_right edited
ShowLine added
===========================================*/
#include "lcm.h"
#include "LF2407REGS.h"
#include <stdio.h>
#include"SysFun.h"
//http://ruixuedz.vip6.adminftp.cn/ruixuedz_article/37/326.html
/**********************带字库液晶显示模块LCM12864ZK*****************************/
/*=====================================================
#include <REG51.H>
#include <STDIO.H>


#define Uchar unsigned char
#define Uint unsigned int
#define Ulong unsigned long
sbit E=P3^0; //对应第8脚
sbit RW=P3^1; //对应第7脚
sbit RS=P3^2; //对应第6脚
sbit BG=P3^3; //背光源正极2脚	?背光什么用处
*=====================================================*/

Uchar BUSY,hang,lie;
#ifndef nMAXBUSY
#define nMAXBUSY 10000
#endif
/*//////////////////////////////////////////////////////////////////////////////////////
3、LCM 接口	LCM12864ZK
引脚 K(1)	A(2) 	GND(3)	VCC(4)	NC(5)	RS(6)   R/W(7)	E(8)   	DB0~DB3  DB4~DB7(16)	PSB(17)	RST(18)	VR(19)	V0(20)
DSPIO  DGND   V4.2      DGND   	VCC				IOPA4   IOPA5   	IOPB7  	B0~B3      E0~E3  			V5      	IOPC4	10K可调电阻
*//////////////////////////////////////////////////////////////////////////////////////

#define LCM_RS  _PADATDIR.bit4
#define LCM_RW _PADATDIR.bit5
#define LCM_E    _PBDATDIR.bit7
#define LCM_RST    _PCDATDIR.bit4

/********************************/
//定义字符串数组 */
/********************************/
Uchar STR2[]="单片机显示技术网";	//8汉字
Uchar STR3[]="网址:http://www.mcubbs.net";


/*//////////////////////////////////////////////////////////////////////////////////////
3、LCM 接口	LCM12864ZK
引脚 K(1)	A(2) 	GND(3)	VCC(4)	NC(5)	RS(6)   R/W(7)	E(8)   	DB0~DB3  DB4~DB7(16)	PSB(17)	RST(18)	VR(19)	V0(20)
DSPIO  DGND   V4.2  DGND   	VCC				IOPA4   IOPA5   IOPB7  	B0~B3      E0~E3  			V5      	IOPC4	10K可调电阻
#define LCM_RS  _PADATDIR.bit4
#define LCM_RW _PADATDIR.bit5
#define LCM_E    _PBDATDIR.bit7
#define LCM_RST    _PCDATDIR.bit4
*//////////////////////////////////////////////////////////////////////////////////////
void	LcmOutInitial()	//IO定义初始化
{
//		#define LCM_RS  _PADATDIR.bit4
	_MCRA.bit4=0;
	_PADATDIR.bit12 =1;
	_PADATDIR.bit4 =0;
//		#define LCM_RW _PADATDIR.bit5
	_MCRA.bit5 =0;
	_PADATDIR.bit13 =1;
	_PADATDIR.bit5 =0;
//		#define LCM_E  _PBDATDIR.bit7
	_MCRA.bit15 =0;
	_PBDATDIR.bit15 =1;
	_PBDATDIR.bit7 =0;
//#define LCM_RST    _PCDATDIR.bit4	 复位位,置一
	_MCRB.bit4=0;
	_PCDATDIR.bit12=1;
	_PCDATDIR.bit4=1;
//定义IOPB0-3;IOPE0-3输出
	*MCRA&=0xF0FF;
	*PBDATDIR|=0x0F00;
	*MCRC&=0xFFF0;
	*PEDATDIR|=0x0F00;
}
//更改数据位的8位位输入,为判断读取做准备
void LcmInInitial()
{
//		#define LCM_RS  _PADATDIR.bit4
	_MCRA.bit4=0;
	_PADATDIR.bit12 =1;
	_PADATDIR.bit4 =0;
//		#define LCM_RW _PADATDIR.bit5
	_MCRA.bit5 =0;
	_PADATDIR.bit13 =1;
	_PADATDIR.bit5 =0;
//		#define LCM_E  _PBDATDIR.bit7
	_MCRA.bit15 =0;
	_PBDATDIR.bit15 =1;
	_PBDATDIR.bit7 =0;
//#define LCM_RST    _PCDATDIR.bit4	 复位位,置一
	_MCRB.bit4=0;
	_PCDATDIR.bit12=1;
	_PCDATDIR.bit4=1;
//定义IOPB0-3;IOPE0-3输入
	*MCRA&=0xF0FF;
	*PBDATDIR&=0xF0FF;
	*MCRC&=0xFFF0;
	*PEDATDIR&=0xF0FF;
}

//写入字节
void WriteDB(Uchar bDat)
{
	*PBDATDIR&=0xFFF0;
	*PBDATDIR|=(bDat&0x000F);
	*PEDATDIR&=0xFFF0;
	*PEDATDIR|=((bDat>>4)&0x000F);
}

//读出字节
Uchar ReadDB()
{
	Uchar bDat;
	bDat=0x0000;
	bDat |= (*PBDATDIR&0x000F);
	bDat |= (*PEDATDIR&0x00F0);
	return bDat;
}


//*********************判忙函数************************//
//读取忙标志(BF),可以确认内部动作是否完
//成,同时可以读出位址记数器AC 
//RS=0;RW=1;
void BUSYLOOP()
{
	Uint nTimes=0;
	WriteDB(0xFF);
	WriteDB(0x00);
	LcmInInitial();
	LCM_RS=0;
	LCM_RW=1;
	BUSY=0xFF;

	while(((BUSY&0xFF)>0x7F)&&(nTimes<nMAXBUSY))
		{
		LCM_E=1;
		BUSY=ReadDB();
		LCM_E=0;
		nTimes++;
		}
	LcmOutInitial();
/*	P1=0x0ff;
	LCM_RS=0;
	LCM_RW=1;
	do
		{
		LCM_E=1;
		BUSY=P1;
		LCM_E=0;
		}
	while(BUSY>0x7F);
	*/
}
//*********************写控制字函数****************************//
void Write_command(Uchar CMD,Uchar bb)
{ 
	if(bb)
	{BUSYLOOP();}
	asm("	setc	INTM");//关中断
	LCM_RS=0;
	LCM_RW=0;
	LCM_E=1;
	WriteDB(CMD);
	DelayUs(100);
	LCM_E=0;
		asm("	clrc	INTM");//开中断
}

//*********************写数据函数****************************//
void Write_data(Uchar CMD)
{
	BUSYLOOP();
	asm("	setc	INTM");//关中断	
	LCM_RS=1;
	LCM_RW=0;
	LCM_E=1;
	WriteDB(CMD);
	DelayUs(100);
	LCM_E=0;
	asm("	clrc	INTM");//开中断
}

//*************************液晶初始化********************************//
//需要有比较明显的初始化成功的特征
void LcmInitial()
{
	DelayMs(1000);//	Wait Time >40ms
	LcmOutInitial();
//	LcmClear();
	DelayMs(38);
	Write_command(0x30,0);	//Funtion Set
	DelayMs(200);
	Write_command(0x30,0);	//set basic mode
	DelayMs(1);
	Write_command(0x0C,1);	//turn on lcd	1 D C B D==1,整体显示;C=1,游标ON, B=1 游标位置ON
	DelayMs(1);
	Write_command(0x01,1);//clear screen 0x01
	DelayMs(20);
	Write_command(0x06,1);//enter dot setup
}
/***************************清 屏*************************************/
void LcmClear()
{
/*	LCM_RS=0;
	LCM_RW=0;
	LCM_E=1;
	P1=0x01;
	DelayUs(1);
	LCM_E=0;
	*/
	Write_command(0x01, 0);
}
/**************************主函数开始***********************************/
/*main()
{
	LcmOutInitial();
	LcmClear();
	LcmInitial(); //初始化函数//
	Display(STR2,0x82); // 上面一行显示一个预定字符串
	Display(STR3,0x88);
	DelayUs(200);
	Write_command(0x9C,0); //将光标移到0x9C
	Write_command(0x0f,0); //光标处反白闪烁

	// write_command(0x08,0); //进入睡眠状态
	// delayus(200);
	// write_command(0x0C,0); //唤醒

	while(1)



	{ ; }
}
*/
/*************************主函数结束*************************************/

/*=======================================================
显示字符串
=======================================================*/
void Display(Uchar *ptr,Uchar ddram)
{
	Uchar nLength ,i,x;
	nLength=0;
	if(ddram<0x88)
		{ hang=0; } //定位行地址:第一行
	else if(ddram<0x90)
		{ hang=2; } //定位行地址:第三行
	else if(ddram<0x98)
		{ hang=1; } //定位行地址:第二行
	else
		{ hang=3; } //定位行地址:第四行

	lie=0x0f&ddram; //定位列地址
	if(lie>0x07)
		{ lie=lie-0x08;}
	x=lie*2;
	Write_command(ddram,0); // 定位显示起始地址
	while ((ptr[nLength])!='\0')
		{nLength++;}
	for (i=0;i<nLength;i++ )
		{
		  DelayMs(10);
		Write_data(ptr[i]); //输出单个字符
		x++;
		if(x>16)
			break;




/*		if (x ==0x10)
			{ 
			x=0;
			hang++;
			switch (hang)
			{
				case 0:Write_command(0x80,0);
				break;
				case 1:Write_command(0x90,0);
				break;
				case 2:Write_command(0x88,0); 
				break;
				case 3:Write_command(0x98,0);
			}
			if (hang>3)
				{
				Write_command(0x80,0);
				hang=0;
				}
			}
			*/
		}
}

⌨️ 快捷键说明

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