📄 lcd12864.c
字号:
//***************************************************************************//
// 说明
//库名:LCD12864.C
//适用范围:128X64点阵黑白液晶屏,如:KS0108等
//注意事项:对液晶屏操作时,应先操作左屏完成后,再对右屏操作,
// 如需要再回过来写左屏应先清全屏,否则会花屏!
//Design by Minstar@8.5 N.S.
//Test by Minstar
//***************************************************************************//
#include "LCD12864.h"
#include <stdio.h>
#include "absacc.h"
#include "intrins.h"
#include "hztable.h"
#include "ASCII816.H"
#include "bjtable.h"
#include "num5x8.h"
#include "Delay.h"
/*****************************函数实体****************************************/
/*****************************底层硬件操作************************************/
//延时
Lcd12864delay()
{
unsigned int i=500;
while(i--) {;}
}
//状态检查
void CheckState()
{
unsigned char dat;
Delay(5);
di=0;
Delay(5);
rw=1;
Delay(5);
do{
LCD12864DataPort=0xff;
Delay(5);
en=1;
Delay(5);
dat=LCD12864DataPort;
Delay(5);
en=0;
dat=0x90 & dat; //仅当第4,7位为0时才可操作
}while(!(dat==0x00));
//Delay(2000);
}
/*----------------------------------------------------------------------------------------------------*/
//写显示数据
//dat:显示数据
void WriteByte(unsigned char dat)
{
CheckState();
Delay(5);
di=1;
Delay(5);
rw=0;
Delay(5);
en=1;
Delay(5);
LCD12864DataPort=dat;
Delay(5);
en=0;
}
/*-----------------------------------------------------------------------------------------------------*/
//向LCD发送命令
//command :命令
SendCommandToLCD(unsigned char command)
{
CheckState();
Delay(5);
di=0;
Delay(5);
rw=0;
Delay(5);
en=1;
Delay(5);
LCD12864DataPort=command;
Delay(5);
en=0;
}
//设定行地址(页)--X 0-7
void SetLine(unsigned char line)
{
line=line & 0x07; // 0<=line<=7
line=line|0xb8; //1011 1xxx
SendCommandToLCD(line);
}
//设定列地址--Y 0-63
void SetColumn(unsigned char column)
{
column=column &0x3f; // 0=<column<=63
column=column | 0x40; //01xx xxxx
SendCommandToLCD(column);
}
//设定显示开始行--XX
void SetStartLine(unsigned char startline) //0--63
{
startline=startline & 0x07;
startline=startline|0xc0; //1100 0000
SendCommandToLCD(startline);
}
//开关显示
void SetOnOff(unsigned char onoff)
{
onoff=0x3e | onoff; //0011 111x
SendCommandToLCD(onoff);
}
//选择屏幕
//screen: 0-全屏未选,1-左屏,2-右屏
void SelectScreen(unsigned char screen)
{ //北京显示器:负有效 cs1: 0--右; cs2: 0--左
switch(screen)
{ case 0: cs1=0; //全屏未选
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
cs2=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
break;
case 1: cs1=1; //左屏
cs2=0;
break;
case 2: cs1=0; //右屏
cs2=1;
break;
}
}
/**********************************液晶常用功能函数*******************************/
//清屏
//screen: 0-全屏未操作,1-左屏,2-右
void ClearScreen(unsigned char screen)
{ unsigned char i,j;
SelectScreen(screen);
for(i=0;i<8;i++)
{ SetLine(i);
for(j=0;j<64;j++)
{
WriteByte(0x00);
}
}
}
/******************************************************/
void InitLCD() //初始化LCD
{
Lcd12864delay();
SetOnOff(0);
SetOnOff(1);
SetStartLine(0);
SetLine(0);
SetColumn(0);
SelectScreen(1);
ClearScreen(1);
ClearScreen(2);
}
//显示一个汉字
//旋转90度:字模被竖着切分
//line:行(0-3), column: 列(0-3),screen:左(1)右(2)屏选择
//hzcode: 汉字代码(自定义的)
//uchar code HZtable(16x16)
void ShowHZ(unsigned char line,unsigned char column,unsigned char screen,unsigned int hzcode)
{
unsigned char i;
SelectScreen(screen);
SetLine(line<<1);
SetColumn(column<<4);
for(i=0;i<16;i++)WriteByte(HZTable[hzcode][i]);
SetLine((line<<1)+1);
SetColumn(column<<4);
for(i=0;i<16;i++)WriteByte(HZTable[hzcode][i+16]);
}
//显示8*16字符
//line:行(0-3), column: 列(0-7),screen:左(1)右(2)屏选择
//character:字符代码(自定义)
void ShowChar(unsigned char line,unsigned char column,unsigned char screen,unsigned char character)
{
unsigned char i;
SelectScreen(0);
SelectScreen(screen);
SetLine(line<<1);
SetColumn(column<<3);
for(i=0;i<8;i++)WriteByte(XWTable[character][i]);
SetLine((line<<1)+1);
SetColumn(column<<3);
for(i=0;i<8;i++)WriteByte(XWTable[character][i+8]);
}
/******************************************************************/
//显示整屏背景图片
//unsigned char code BJTable(128X64)自定义取模!
void ShowBJTable()
{
unsigned char i,j;
// ShowNUM(4,10,1,0,0); //标定零点
for(i=0;i<8;i++)
{
SelectScreen(1);
SetLine(i);
SetColumn(0);
for(j=0;j<64;j++)WriteByte(BJTable[i][j]);
}
for(i=0;i<8;i++)
{
SelectScreen(2);
SetLine(i);
SetColumn(0);
for(j=0;j<64;j++)WriteByte(BJTable[i][j+64]);
}
}
//显示5*8数字
//line:行(0-7), column: 列(0-11),screen:左(1)右(2)屏选择,addn:字符显示偏移量0-4
//character:字符代码(自定义)
void ShowNUM(unsigned char line,unsigned char column,unsigned char screen,unsigned char character,unsigned char addn)
{
unsigned char i;
SelectScreen(0);
SelectScreen(screen);
SetLine(line);
SetColumn(column*5+addn);
for(i=0;i<5;i++)WriteByte(NUMTable[character][i]);
}
//*********************以下为波形显示相关函数***********************************//
/*******************************************************************************/
//在指定的位置发送一个字节,操作对应的8个点显示
//line:行(0-7), column: 列(0-63),screen:左(1)右(2)屏选择,byte:待显示的操作字节
/*******************************************************************************/
void ShowByte(unsigned char line,unsigned char column,unsigned char screen,unsigned char byte)
{
SetLine(line);
SetColumn(column);
SelectScreen(screen);
WriteByte(byte);
}
//将数据值(0-8)转化为液晶屏上相应点值的表格
unsigned char code DataTab[]=
{
0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,
};
/******************************************************************************/
//功能:显示左屏背景方格,长0-63点(每格10点),宽0-63点(每各10点)
/******************************************************************************/
void ShowBG_L()
{
unsigned int i,x;
for(x=0;x<64;x=x+10) //在第一屏画横条
{
for(i=0;i<64;i=i+2) ShowByte(7-x/8,i,1,DataTab[x%8]);
}
for(x=0;x<64;x=x+10) //画竖条
{
for(i=0;i<8;i++) ShowByte(i,x,1,0xaa);
}
}
/******************************************************************************/
//功能:显示右屏背景方格,长0-35点(每格10点,起始点为6),宽0-63点(每各10点)
/******************************************************************************/
void ShowBG_R()
{
unsigned int i,x;
for(x=0;x<64;x=x+10) //在第二屏画横条
{
for(i=0;i<36;i=i+2) ShowByte(7-x/8,i,2,DataTab[x%8]);
}
for(x=6;x<37;x=x+10) //画竖条
{
for(i=0;i<8;i++) ShowByte(i,x,2,0xaa);
}
}
/**********************************************************************/
//显示左屏上的数据点配合背景方格使用(参见ShowBG_L())
//dat(0-63):待显示的数据,column(0-63):显示点的列值
void ShowWave_L(unsigned char dat,unsigned char column)
{
unsigned char x,z;
if(column%2==0)
{
for(z=0;z<64;z=z+10)
{
if(dat/8==z/8)x=DataTab[dat%8]|DataTab[z%8];
}
if(dat/8==4)x=DataTab[dat%8];
}
else x=DataTab[dat%8];
if(column%10==0)x=x|0xaa;
ShowByte(7-dat/8,column,1,x);
}
/**********************************************************************/
//显示右屏上的数据点配合背景方格使用(参见ShowBG_R())
//dat(0-63):待显示的数据,column(0-35):显示点的列值
void ShowWave_R(unsigned char dat,unsigned char column)
{
unsigned char x,z;
if(column%2==0)
{
for(z=0;z<64;z=z+10)
{
if(dat/8==z/8)x=DataTab[dat%8]|DataTab[z%8];
}
if(dat/8==4)x=DataTab[dat%8];
}
else x=DataTab[dat%8];
if((column-6)%10==0&column!=0)x=x|0xaa;
ShowByte(7-dat/8,column,2,x);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -