📄 lcd12864.c
字号:
/****************************************************************************************************
* 文件名: LCD12864.c *
* 描 述: 本文件包含了液晶模块的基本函数和显示汉字的所有操作子函数,可共其他的模块进行调用 *
* 接口定义: 用的是熊涛那块12864接口板,接口按板上定义 *
* P1口接DB7 -- DB0 *
* DI -- P3.7, 数据/指令 选择 *
* RW -- P3.6, 读/写选择 *
* E -- P3.5, 使能信号 *
* CS2 -- P3.4, 片选1, 右半片 *
* CS1 -- P3.3, 片选2, 左半片 *
* RST -- P3.2, 复位 *
* 版 本: KEIL uV2 *
****************************************************************************************************/
//头文件
#include "config.h"
#include "ziku.h"
//定义结构体数组
struct Word_Buffer
{
uchar word[2];
};
struct Word_Buffer word_buf[32]; //定义结构体数组来存储待显示的汉字,共32个
/*****************************************************************************************************
* 函 数 名: Delay
* 功能描述: 本函数为延时子函数,延时 i ms
* 全局变量: 无
* 入口参数: i
* 出口参数: 无
* 调用模块: 无
* 版 本: KEIL uV2
******************************************************************************************************/
void Delay(uchar i)
{
uchar j;
while(i > 0)
{
i--;
j = 122;
while(j > 0)
{
j--;
}
}
}
/*****************************************************************************************************
* 函 数 名: Initiate
* 功能描述: 本函数为液晶初始化子函数
* 全局变量: 无
* 入口参数: 无
* 出口参数: 无
* 调用模块: 无
* 版 本: KEIL uV2
******************************************************************************************************/
void Initiate(void)
{
Delay(40);
LEFTSIDE
WriteCmd(0x3e); //关显示
RIGHTSIDE
WriteCmd(0x3e); //关显示
LEFTSIDE
WriteCmd(0x3f); //开显示
RIGHTSIDE
WriteCmd(0x3f); //开显示
LEFTSIDE //起始行设置为第一行
WriteCmd(0xc0);
RIGHTSIDE
WriteCmd(0xc0);
ClearDDRAM(); //清屏
LEFTSIDE //读左右半屏
ReadData();
RIGHTSIDE
ReadData();
}
/*****************************************************************************************************
* 函 数 名: CheckBusy
* 功能描述: 本函数为判断LCD忙子函数,BUSY=1时,为忙;BUSY=0时,为空闲
* 全局变量: 无
* 入口参数:
* 出口参数: 无
* 调用模块: 无
* 日 期:
* 版 本: KEIL uV2
******************************************************************************************************/
void CheckBusy(void)
{
DPORT = 0xff;
DI = 0;
RW = 1;
E = 1;
while(DPORT & 0x80); //BUSY=1时,为忙,则等待;BUSY=0时,为空闲
E = 0;
}
/*****************************************************************************************************
* 函 数 名: WriteCmd
* 功能描述: 本函数为写指令子函数
* 全局变量: 无
* 入口参数: cmd -- 要写入的指令
* 出口参数: 无
* 调用模块: CheckBusy()
* 版 本: KEIL uV2
******************************************************************************************************/
void WriteCmd(uchar cmd) //写指令子函数
{
// CheckBusy();
DI = 0;
RW = 0;
DPORT = cmd;
E = 1;
E = 0;
}
/*****************************************************************************************************
* 函 数 名: WriteData
* 功能描述: 本函数为写数据子函数
* 全局变量: 无
* 入口参数: data -- 要写入的数据
* opp -- 显示标志位: 为1,显示阳码(点亮为0);为0,显示阴码(点亮为1)
* 出口参数: 无
* 调用模块: CheckBusy()
* 版 本: KEIL uV2
******************************************************************************************************/
void WriteData(uchar dat) //写数据子函数
{
// CheckBusy();
DI = 1;
RW = 0;
DPORT = dat;
E = 1;
E = 0;
}
/*****************************************************************************************************
* 函 数 名: ReadData
* 功能描述: 本函数为读数据子函数
* 全局变量: 无
* 入口参数:
* 出口参数: 无
* 调用模块: CheckBusy()
* 版 本: KEIL uV2
******************************************************************************************************/
uchar ReadData(void)
{
uchar rddata;
// CheckBusy();
DI = 1;
RW = 1;
E = 1;
rddata = DPORT;
E = 0;
return rddata;
}
/*****************************************************************************************************
* 函 数 名: SetPos
* 功能描述: 本函数为设置显示起始地址(显示行,页地址,Y地址)子函数
* 全局变量: 无
* 入口参数: st_line -- 液晶显示的起始行,0--63,共64行
* x_add -- 液晶显示的页地址,即为DDRAM的行地址,8行为一页,共8页
* y_add -- 液晶显示的Y地址,0--127,在对DDRAM进行读/写操作后,Y地址指针自动加1
* 出口参数: 无
* 调用模块: WriteCmd()
* 版 本: KEIL uV2
******************************************************************************************************/
void SetPos(uchar st_line, uchar x_add, uchar y_add) //设置显示起始地址子函数
{
st_line &= 0x3f; //st_line(起始行)的取值范围为0--63
x_add &= 0x07; //x_add(页地址)的取值范围为0--7
WriteCmd(st_line + 0xc0); //+ 0xc0根据液晶显示模块指令中设置起始行的格式
WriteCmd(x_add + 0xb8); //+ 0xb1根据液晶显示模块指令中设置页地址的格式
if(y_add < 64)
{
LEFTSIDE
WriteCmd(y_add + 0x40); //y_add的取值范围为0-63,y_add<64时,左半屏显示
}
else
{
RIGHTSIDE
WriteCmd(y_add); //63<y_add<124时,右半屏显示
}
}
/*****************************************************************************************************
* 函 数 名: ClearDDRAM
* 功能描述: 本函数为清DDRAM子函数
* 全局变量: 无
* 入口参数: 无
* 出口参数: 无
* 调用模块: WriteData(),SetPos()
* 版 本: KEIL uV2
******************************************************************************************************/
void ClearDDRAM(void)
{
uchar i; //i表示页地址
uchar j; //j表示列地址
for(i = 0; i < 8; i++) //清右半屏
{
//此处注意,起始行地址受到页地址的限制
SetPos(0, i, 0); //设置起始行为第0行,起始页为第0页,起始列为第0列
for(j = 0; j < 64; j++) //将右半屏DRAM的64个字节全部清零
{
WriteData(0);
}
}
for(i = 0; i < 8; i++) //清左半屏
{
SetPos(0, i, 64); //设置起始行为第0行,起始页为第0页,起始列为第64列
for(j = 0; j < 64; j++) //将左半屏DRAM的64个字节全部清零
{
WriteData(0);
}
}
}
/*****************************************************************************************************
* 函 数 名: WriteWord
* 功能描述: 本函数为在液晶屏的任意位置写单个汉字的子函数
* 全局变量: 无
* 入口参数: st_line,显示的起始行,0--63
* x_add,显示的页地址,0--7
* y_add,显示的列地址,0--127
* Index[2],字符串数组,用来存储汉字
* 出口参数: 无
* 调用模块: WriteData(),SetPos()
* 版 本: KEIL uV2
******************************************************************************************************/
void WriteWord(uchar st_line, uchar x_add, uchar y_add, uchar Index[2])
{
uchar i;
uchar j;
if(y_add < 64)
{
LEFTSIDE
WriteCmd(y_add + 0x40);
}
else
{
RIGHTSIDE
WriteCmd(y_add);
}
SetPos(st_line, x_add, y_add); //设置显示指针的位置
for(i = 0; i < 255; i++)
{
//汉字作为双字节字符串处理 采用顺序检索方式查找结构体名
if((GB_16[i].Index[0] == Index[0]) && (GB_16[i].Index[1] == Index[1]))
{
for(j = 0; j < 16; j++) //先写上半字节
{
WriteData(GB_16[i].Msk[j]);
}
SetPos(st_line, x_add + 1, y_add); //页地址加1,准备写下半字节
for(j = 16; j < 32; j++)
{
WriteData(GB_16[i].Msk[j]); //写下半字节
}
//break语句只能跳出一层循环
break; //break的用处是跳出for循环,以免重复写入
}
}
}
/*****************************************************************************************************
* 函 数 名: WriteFixWord
* 功能描述: 本函数为在液晶屏的固定位置写汉字的子函数
* 因为液晶每行显示8个汉字,一共能显示32个汉字,因此add%32可以得到显示的字为第几个,
* x_add只能为0,2,4,6;y_add只能为0,16,32,48,64,80,96,112.从而得到转换公式
* 全局变量: 无
* 入口参数: add,指定地址范围为0--31,全屏可写32个字(16*16)
* Index[2],字符串数组,用来存储汉字
* 出口参数: 无
* 调用模块: WriteWord()
* 版 本: KEIL uV2
******************************************************************************************************/
void WriteFixWord(uchar add, uchar Index[2])
{
uchar st_line = 0; //设置起始行为0
uchar x_add = add % 32 / 8 * 2; //转换得到相应的x_add,y_add
uchar y_add = add % 32 % 8 * 16;
WriteWord(st_line, x_add, y_add, Index); //调用任意位置写单个汉字的子函数
}
/*****************************************************************************************************
* 函 数 名: WriteSentence
* 功能描述: 本函数为在液晶屏上写句子的子函数,按照0到31的顺序写入句子
* 从第0个字的位置开始写入汉字,写完一个之后字指针加1,继续写下一个汉字
* 全局变量: 无
* 入口参数: sentence[],待写入汉字,组成字符串
* 出口参数: 无
* 调用模块: WriteWord(),strlen()
* 版 本: KEIL uV2
******************************************************************************************************/
void WriteSentence(uchar sentence[255])
{
uchar i;
uchar j = 0;
for(i = 0; i < strlen(sentence) / 2; i++) //strlen()为调用"string.h"中的函数,求字符串的长度
{
//从sentence中两个两个的取字符串即汉字 注意不要弄半角的字符或标点符号,否则后面的汉字将找不到
word_buf[i].word[0] = sentence[i * 2];
word_buf[i].word[1] = sentence[i * 2 + 1];
WriteFixWord(j++, word_buf[i].word);
}
}
/*****************************************************************************************************
* 函 数 名: WriteNum
* 功能描述: 本函数为在液晶屏的任意位置显示ASCII表的第几个字符
* 全局变量: 无
* 入口参数: st_line, x_add, y_add, order
* 出口参数: 无
* 调用模块: SetPos(),WriteData()
* 版 本: KEIL uV2
******************************************************************************************************/
void WriteNum(uchar st_line, uchar x_add, uchar y_add, uchar order)
{
uchar i;
uint k;
uchar buf_x, buf_y;
buf_x = x_add;
buf_y = y_add;
k = order * 0x10; //因为每16个字节表示一个字符
for(i = 0; i < 8; i++)
{
SetPos(st_line, x_add, y_add); //设置显示指针的位置
WriteData(num[k]);
k++;
y_add++;
if(y_add > 127)
{
y_add = 0;
x_add++;
x_add++;
}
}
x_add = buf_x + 1;
y_add = buf_y;
for(i = 0;i < 8; i++)
{
SetPos(st_line, x_add, y_add); //设置显示指针的位置
WriteData(num[k]);
k++;
y_add++;
if(y_add > 127)
{
y_add = 0;
x_add++;
x_add++;
}
}
}
/*****************************************************************************************************
* 函 数 名: WriteStr
* 功能描述: 本函数为在液晶屏的任意位置显示显示一列数字
* 全局变量: 无
* 入口参数: st_line, x_add, y_add, str
* 出口参数: 无
* 调用模块: SetPos(),WriteNum()
* 版 本: KEIL uV2
******************************************************************************************************/
void WriteStr(uchar st_line, uchar x_add, uchar y_add, uchar *str)
{
uchar i;
uchar j;
uchar k;
uchar n;
i = 0;
n = strlen(str); //no表示数字的个数
for(j = 0; j < n; j++)
{
k = str[i] - 0x20; //ASCII码转化为10进制数
WriteNum(st_line, x_add, y_add, k); //调用显示字符子函数
y_add = y_add + 8;
i++;
if(y_add > 127)
{
y_add = 0;
x_add++;
x_add++;
}
}
}
/*****************************************************************************************************
* 函 数 名: Printf_Num
* 功能描述: 本函数为在液晶屏的任意位置显示变量中的浮点数
* 全局变量: 无
* 入口参数: st_line, x_add, y_add, no
* 出口参数: 无
* 调用模块: SetPos(),WriteData()
* 版 本: KEIL uV2
******************************************************************************************************/
/*
void Printf_Num(uchar st_line, uchar x_add, uchar y_add, float no)
{
uchar a[8];
if((no < 1.0) && (no > 0.0))
{
no *= 1000;
a[0] = 0;
a[1] = 0;
a[2] = no/1000;
a[3] = 0;
a[4] = no/100
a[5] = no%100/10 + 0x30;
a[6] = no%100%10 + 0x30;
a[7] = 0;
WriteStr(st_line, x_add, y_add, a);
}
else if((no < 1.0) && (no > 0.0))
{
}
}
*/
/*****************************************************************************************************
* 函 数 名: Disp_Init
* 功能描述: 本函数为在液晶屏的显示最初界面
* 全局变量: 无
* 入口参数: 无
* 出口参数: 无
* 调用模块: WriteFixWord(),WriteStr()
* 版 本: KEIL uV2
******************************************************************************************************/
void Disp_Init()
{
WriteFixWord(0,"单");
WriteFixWord(1,"价");
WriteStr(0,0,32,": 0.00");
WriteFixWord(7,"元");
WriteFixWord(8,"重");
WriteFixWord(9,"量");
WriteStr(0,2,32,": 0.00");
WriteStr(0,2,112,"kg");
WriteFixWord(16,"金");
WriteFixWord(17,"额");
WriteStr(0,4,32,": 0.00");
WriteFixWord(23,"元");
WriteFixWord(24,"商");
WriteFixWord(25,"品");
WriteFixWord(26,"名");
WriteFixWord(27,"称");
WriteStr(0,6,64,":");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -