📄 lcm.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 + -