12864的液晶显示程序(无字库)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LCD_RS=0;LCD_RW=1;LCD_E=1;//高电平读取数据
//_nop_(); //若晶振速度高,可在此作延时处理
while(LCD_Data&0x80);//最高位为忙标志,检测忙信号状态
LCD_E=0;
//_nop_(); //若晶振速度高,可在此作延时处理
}
/***********************************************************
参数:Column表示列号,Page表示页号
********************************************************************************/
/****************************************************
LCD12864点阵液晶屏,
通过I/O口直接控制,采用模拟时序控制
****************************************************/
#include"12864.h"
功能:向LCD写入命令
参数:WDLCD待写入的字符数据
BusyC是否要检查忙标志位选择标志,1为进行,0为不检测
select用于选择LCD屏的左右,1选择左屏,2选择右屏
***********************************************************/
void WriteCommandLCD(unsigned char WCLCD , unsigned char BusyC,unsigned char select)
****************************************/
sbit LCD_RS = P2^5;//控制端口定义
sbit LCD_RW = P2^6;
sbit LCD_E = P2^7;
sbit LCD_CSA = P2^4;//H选通,即高电平有效
sbit LCD_CSB = P2^3;
功能:清显示RAM区(清屏)
参数:select为驱动控制器选择1为左2为右
********************************************************************************/
void clear_LCD(unsigned char select)
#include<math.h>
/***********************************************************
功能:从LCD读取状态位
变量:select用于选择LCD屏的左右,1选择左屏,2选择右屏
***********************************************************/
LCD_Data = WDLCD;
LCD_E = 1;
//_nop_(); //若晶振速度高,可在此作延时处理
LCD_E = 0; //下降沿写入数据
//_nop_(); //若晶振速度高,可在此作延时处理
}
/***********************************************************
{
if(BusyC)ReadStatusLCD(select);//根据需要检测忙
switch(select)
{
case 1:{LCD_CSA=1;LCD_CSB=0;break;}//左
case 2:{LCD_CSA=0;LCD_CSB=1;break;}//右
default: break;
}
LCD_Data = WCLCD;
void LcdReset(void) ;//初始化函数,完成液晶模块的初始设置
void clear_LCD(unsigned char select);//清屏函数
void Clr_All_Lcd(void);//全清屏函数
void set_XY(unsigned char Column,unsigned char Page);//设置数据写入或读出的地址,通过页号和列数可以唯一确定一个地址
功能:从LCD读取数据
变量:select用于选择LCD屏的左右,1选择左屏,2选择右屏
***********************************************************/
unsigned char ReadDataLCD(unsigned char select)
for(j=0;j<64;j++)
{//页内清零
WriteDataLCD( 0 ,select);
}
}
}
/*****************************************************************************
功能:清LCD左右屏
*****************************************************************************/
{
unsigned char dataR;
LCD_Data = 0xff;//置位输入口,已实现输入
switch(select)
{பைடு நூலகம்
case 1:{LCD_CSA=1;LCD_CSB=0;break;}//左
case 2:{LCD_CSA=0;LCD_CSB=1;break;}//右
default: break;
void ReadStatusLCD(unsigned char select)
{
switch(select)
{
case 1:{LCD_CSA=1;LCD_CSB=0;break;}//左
case 2:{LCD_CSA=0;LCD_CSB=1;break;}//右
default: break;
}
LCD_Data = 0xff;//置位输入口,已实现输入
#define LCD_Data P0//LCD数据端口8位
#define R 1
#define L 2
/*****************************************
函数声明
*****************************************/
void ReadStatusLCD(unsigned char select);//从LCD读出忙标志位
unsigned char ReadDataLCD(unsigned char select);//从LCD读出数据
void WriteDataLCD(unsigned char WDLCD,unsigned char select);//向LED写入数据
void WriteCommandLCD(unsigned char WCLCD , unsigned char BusyC,unsigned char select);//向LCD写入命令
unsigned char V_num, unsigned char * puts );//通用的显示函数
void Drawing_dot(unsigned char x,unsigned char y);
void Drawing_line_vertical(unsigned x);
#endif
12864.c
LCD_RS = 0;LCD_RW = 0;LCD_E = 1;
//_nop_(); //若晶振速度高,可在此作延时处理
LCD_E = 0;
}
/******************************************************************************
WriteCommandLCD( 0x3f,1 ,L);
clear_LCD(R);//清左屏
clear_LCD(L);//清右屏
}
/******************************************************************************
功能:设置数据写入或读出的地址,通过页号和列数可以唯一确定一个地址
void Clr_All_Lcd(void)
{
clear_LCD(1);
clear_LCD(2);
}
/******************************************************************************
功能:LCD初始化,分为左,右模块初始化
参数:select为驱动控制器选择1为左2为右
********************************************************************************/
void LcdReset(void)
{
unsigned char i;
for(i=0;i<5;i++)
{
WriteCommandLCD( 0xc0,0 ,R);//设置显示起始行为第一行,并分别写入左右模块中,不检测忙标志
功能:向LCD写入数据
参数:WDLCD待写入的字符数据
select用于选择LCD屏的左右,1选择左屏,2选择右屏
***********************************************************/
void WriteDataLCD(unsigned char WDLCD,unsigned char select)
}
LCD_RW=1;LCD_RS=1;LCD_E = 1;//操作允许脉冲信号,高电平读出
//_nop_(); //若晶振速度高,可在此作延时处理
dataR = LCD_Data;
LCD_E= 0;
return dataR;
}
/***********************************************************
WriteCommandLCD( 0xc0,0 ,L);
//_nop_(); //若晶振速度高,可在此作延时处理
}
WriteCommandLCD( 0xc0,1 ,R);//设置显示起始行为第一行,并分别写入左右模块中,检测忙标志
WriteCommandLCD( 0xc0,1 ,L);
WriteCommandLCD( 0x3f,1 ,R);//开显示设置,并分别写入左右模块中
void whiteword(unsigned char Column,unsigned char Page, const unsigned char puts[][16] );//显示16×16点阵的编码
void WhiteWord_Com(unsigned char Column,unsigned char Page,unsigned char C_num,
12864.h
#ifndef __12864_H__
#define __12864_H__
#include<reg52.h>
#include <intrins.h>
/***************************************
利用I/O口模拟点阵液晶所需时序
点阵液晶控制端口定义,需根据硬件适当改变
{
switch(select)
{
case 1:{LCD_CSA=1;LCD_CSB=0;break;}//左
case 2:{LCD_CSA=0;LCD_CSB=1;break;}//右
default: break;
}
ReadStatusLCD(select);//检测忙标志
LCD_RS = 1;LCD_RW = 0;
void xy_Write(unsigned char Column,unsigned char Page,unsigned char dataW);//向指定行列写数据
void LcmPutDots(unsigned char Column,unsigned char Page, unsigned char DotByte );//显示点
{
unsigned char i,j;
for(i=0;i<8;i++)
{//8页,换页清零
WriteCommandLCD( 0xb8|i,1 ,select);//页面地址设置,并分别写入左右模块中
WriteCommandLCD( 0x40,1 ,select);//列地址设置,设置为0列,并分别写入左右三个模块中
//_nop_(); //若晶振速度高,可在此作延时处理
while(LCD_Data&0x80);//最高位为忙标志,检测忙信号状态
LCD_E=0;
//_nop_(); //若晶振速度高,可在此作延时处理
}
/***********************************************************
参数:Column表示列号,Page表示页号
********************************************************************************/
/****************************************************
LCD12864点阵液晶屏,
通过I/O口直接控制,采用模拟时序控制
****************************************************/
#include"12864.h"
功能:向LCD写入命令
参数:WDLCD待写入的字符数据
BusyC是否要检查忙标志位选择标志,1为进行,0为不检测
select用于选择LCD屏的左右,1选择左屏,2选择右屏
***********************************************************/
void WriteCommandLCD(unsigned char WCLCD , unsigned char BusyC,unsigned char select)
****************************************/
sbit LCD_RS = P2^5;//控制端口定义
sbit LCD_RW = P2^6;
sbit LCD_E = P2^7;
sbit LCD_CSA = P2^4;//H选通,即高电平有效
sbit LCD_CSB = P2^3;
功能:清显示RAM区(清屏)
参数:select为驱动控制器选择1为左2为右
********************************************************************************/
void clear_LCD(unsigned char select)
#include<math.h>
/***********************************************************
功能:从LCD读取状态位
变量:select用于选择LCD屏的左右,1选择左屏,2选择右屏
***********************************************************/
LCD_Data = WDLCD;
LCD_E = 1;
//_nop_(); //若晶振速度高,可在此作延时处理
LCD_E = 0; //下降沿写入数据
//_nop_(); //若晶振速度高,可在此作延时处理
}
/***********************************************************
{
if(BusyC)ReadStatusLCD(select);//根据需要检测忙
switch(select)
{
case 1:{LCD_CSA=1;LCD_CSB=0;break;}//左
case 2:{LCD_CSA=0;LCD_CSB=1;break;}//右
default: break;
}
LCD_Data = WCLCD;
void LcdReset(void) ;//初始化函数,完成液晶模块的初始设置
void clear_LCD(unsigned char select);//清屏函数
void Clr_All_Lcd(void);//全清屏函数
void set_XY(unsigned char Column,unsigned char Page);//设置数据写入或读出的地址,通过页号和列数可以唯一确定一个地址
功能:从LCD读取数据
变量:select用于选择LCD屏的左右,1选择左屏,2选择右屏
***********************************************************/
unsigned char ReadDataLCD(unsigned char select)
for(j=0;j<64;j++)
{//页内清零
WriteDataLCD( 0 ,select);
}
}
}
/*****************************************************************************
功能:清LCD左右屏
*****************************************************************************/
{
unsigned char dataR;
LCD_Data = 0xff;//置位输入口,已实现输入
switch(select)
{பைடு நூலகம்
case 1:{LCD_CSA=1;LCD_CSB=0;break;}//左
case 2:{LCD_CSA=0;LCD_CSB=1;break;}//右
default: break;
void ReadStatusLCD(unsigned char select)
{
switch(select)
{
case 1:{LCD_CSA=1;LCD_CSB=0;break;}//左
case 2:{LCD_CSA=0;LCD_CSB=1;break;}//右
default: break;
}
LCD_Data = 0xff;//置位输入口,已实现输入
#define LCD_Data P0//LCD数据端口8位
#define R 1
#define L 2
/*****************************************
函数声明
*****************************************/
void ReadStatusLCD(unsigned char select);//从LCD读出忙标志位
unsigned char ReadDataLCD(unsigned char select);//从LCD读出数据
void WriteDataLCD(unsigned char WDLCD,unsigned char select);//向LED写入数据
void WriteCommandLCD(unsigned char WCLCD , unsigned char BusyC,unsigned char select);//向LCD写入命令
unsigned char V_num, unsigned char * puts );//通用的显示函数
void Drawing_dot(unsigned char x,unsigned char y);
void Drawing_line_vertical(unsigned x);
#endif
12864.c
LCD_RS = 0;LCD_RW = 0;LCD_E = 1;
//_nop_(); //若晶振速度高,可在此作延时处理
LCD_E = 0;
}
/******************************************************************************
WriteCommandLCD( 0x3f,1 ,L);
clear_LCD(R);//清左屏
clear_LCD(L);//清右屏
}
/******************************************************************************
功能:设置数据写入或读出的地址,通过页号和列数可以唯一确定一个地址
void Clr_All_Lcd(void)
{
clear_LCD(1);
clear_LCD(2);
}
/******************************************************************************
功能:LCD初始化,分为左,右模块初始化
参数:select为驱动控制器选择1为左2为右
********************************************************************************/
void LcdReset(void)
{
unsigned char i;
for(i=0;i<5;i++)
{
WriteCommandLCD( 0xc0,0 ,R);//设置显示起始行为第一行,并分别写入左右模块中,不检测忙标志
功能:向LCD写入数据
参数:WDLCD待写入的字符数据
select用于选择LCD屏的左右,1选择左屏,2选择右屏
***********************************************************/
void WriteDataLCD(unsigned char WDLCD,unsigned char select)
}
LCD_RW=1;LCD_RS=1;LCD_E = 1;//操作允许脉冲信号,高电平读出
//_nop_(); //若晶振速度高,可在此作延时处理
dataR = LCD_Data;
LCD_E= 0;
return dataR;
}
/***********************************************************
WriteCommandLCD( 0xc0,0 ,L);
//_nop_(); //若晶振速度高,可在此作延时处理
}
WriteCommandLCD( 0xc0,1 ,R);//设置显示起始行为第一行,并分别写入左右模块中,检测忙标志
WriteCommandLCD( 0xc0,1 ,L);
WriteCommandLCD( 0x3f,1 ,R);//开显示设置,并分别写入左右模块中
void whiteword(unsigned char Column,unsigned char Page, const unsigned char puts[][16] );//显示16×16点阵的编码
void WhiteWord_Com(unsigned char Column,unsigned char Page,unsigned char C_num,
12864.h
#ifndef __12864_H__
#define __12864_H__
#include<reg52.h>
#include <intrins.h>
/***************************************
利用I/O口模拟点阵液晶所需时序
点阵液晶控制端口定义,需根据硬件适当改变
{
switch(select)
{
case 1:{LCD_CSA=1;LCD_CSB=0;break;}//左
case 2:{LCD_CSA=0;LCD_CSB=1;break;}//右
default: break;
}
ReadStatusLCD(select);//检测忙标志
LCD_RS = 1;LCD_RW = 0;
void xy_Write(unsigned char Column,unsigned char Page,unsigned char dataW);//向指定行列写数据
void LcmPutDots(unsigned char Column,unsigned char Page, unsigned char DotByte );//显示点
{
unsigned char i,j;
for(i=0;i<8;i++)
{//8页,换页清零
WriteCommandLCD( 0xb8|i,1 ,select);//页面地址设置,并分别写入左右模块中
WriteCommandLCD( 0x40,1 ,select);//列地址设置,设置为0列,并分别写入左右三个模块中