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