📄 ocm12864.c
字号:
/*
下面是对OCM12864进行操作的函数接口
*/
#include "reg51.h"
#include "ldy.h"
#include "ZiMo.h"
#include "ExternDefine.h"
#define uchar unsigned char //声明uchar为无符号字符型
#define uint unsigned int //声明uint为无符号整型
#define REFRESH 20
uchar ucFn = 0;
bit bChinese = 1;
bit bErrorFlag = 0; //是否已显示提示错误
//bit bPause = 0; //暂停指示灯标志位
extern unsigned char idata Buffer[RDCOUNT][BUFFLEN];
extern unsigned char buffin,ucRCount,ucDCount;
extern bit bReceError1,bReceError2; //add by zhx,05.12.29,出现校验和错误
extern bit bAllUp,bLast;
extern unsigned char KeyValue[2];
/****************************/
/********/
/*函数原型:void delay(uint v)
/*参数:v
/*功能:延时
/*说明:delay(1)相当于延时10微秒(us)
/********/
/****************************************/
void delay(uint v) //声明函数名为delay的函数,并定义无符号整形变量v
{
WDTRST = 0x1E; //启动看门狗
WDTRST = 0xE1;
while(v!=0)v--;//当v不等于0时,v自减,目的为指令延时
WDTRST = 0x1E; //启动看门狗
WDTRST = 0xE1;
}
/****************************/
/********/
/*函数原型:void reset()
/*参数:
/*功能:复位
/*说明:当RST送低电平复位,高电平正常工作
/********/
/****************************************/
void reset() //声明函数名为reset的函数
{
P32=0; //LCD的RST置低电平
delay(20); //延时约200微秒
P32=1; //LCD的RST置高电平
delay(20); //延时约200微秒
}
/*******************************/
/********/
/*函数原型:void wcode(uchar c,uchar cs1,uchar cs2)
/*参数:c,cs1,cs2
/*功能:写代码
/*说明:D/I和R/W都为0时为写代码,根据p1不同的数据发送不同的指令cs1、cs2分别为左右选屏
/*********/
/****************************************/
void wcode(uchar c,uchar cs1,uchar cs2) //声明函数名为wcode()的函数,并定义无符号整形变量c,cs1,cs2
{
P34=cs1; //cs1=1打通LCD左半屏片选
P33=cs2; //cs2=1选通LCD右半屏片选
P37=0; //D/I赋0为写代码(命令)
P36=0; //R/W赋0为写操作
P1=c; //c数据送p1
P35=0; //使能位置0
delay(10); //延时约100微秒
P35=1; //使能位置1
delay(10); //延时约100微秒
P35=0; //使能位由1变0,数据有效传送
}
/*************************************/
/********/
/*函数原型:void wdata(uchar c,uchar cs1,uchar cs2)
/*参数:c,cs1,cs2
/*功能:写显示数据
/*说明:D/I为1、R/W为0时,c为要发送到RAM中的显示数据,cs1、cs2分别为选择左右半屏,置1为选中,置0为不选。
/********/
/*************************************/
void wdata(uchar c,uchar cs1,uchar cs2) //定义名为wdata的函数,并将形参c,cs1,cs2定义为无符号字符型变量
{
P34=cs1; //是否选中左半屏
P33=cs2; //是否选中右半屏
P37=1; //LCM的D/I置1,选择显示资料寄存器
P36=0; //LCM的R/W置0,选择写操作
P1=c; //将要写入LCM的显示资料送P1
P35=0; //使能位置0
delay(10); //延时约100微秒
P35=1; //使能位置1
delay(10); //延时约100微秒
P35=0; //使能位由1到0向下跳变,显示数据有效传送
}
/********************************************/
/********/
/*函数原型:void set_startline(uchar i)
/*参数:i
/*功能:设置显示开始行
/*说明:设置显示开始行为第i行,i为小于64的正整数
/********/
/*******************************************/
void set_startline(uchar i) //定义名为set_startline的函数,并将形参i定义为无符号字符型变量
{
i=0xc0+i; //设定显示起始行的指令代码
wcode(i,1,1); //将显示起始行指令写入LCM的左右半屏
}
/******************************************/
/********/
/*函数原型:void set_adr(uchar x,uchar y)
/*参数:x,y
/*功能:设置读/写显示数据的具体位置
/*说明:设置读/写显示数据的具体位置为第X页的第Y列
/********/
/*******************************************/
void set_adr(uchar x,uchar y) //定义名为set_ adr的函数,并将形参x、y定义为无符号字符型变量
{
x=x+0xb8;y=y+0x40; //设置第X页和第Y列的指令代码
wcode(x,1,1); //将页地址写入LCM的左右半屏
wcode(y,1,1); //将列地址写入LCM的左右半屏
}
/*****************************/
/*函数原型:dison_off(uchar o)
/*参数:o
/*功能:显示开关
/*说明:当o为0时为关显示,当o为1时为开显示
/*****************************/
void dison_off(uchar o) //定义名为dison_off的函数,并将形参o定义为无符号字符型变量
{
o=o+0x3e; //设定显示开关的指令代码
wcode(o,1,1); //将显示开关指令写入LCM的左右半屏
}
/****************************/
/********/
/*函数原型:void clear()
/*功能:清屏
/*说明:以整个显示RAM填0的方式清屏
/*************/
/****************************************/
void clear() //声明清屏函数void clear()
{
uchar i,loop; //定义无符号整形变量i,loop
for(i=0;i<8;i++) //整屏共8页,循环8次
{
WDTRST = 0x1E; //启动看门狗
WDTRST = 0xE1;
set_adr(i,0); //设置页地址
for(loop=0;loop<64;loop++) //一页有64个Y地址,循环64次
wdata(0,1,1); //写0至左右半屏
}
}
/****************************/
/********/
/*函数原型:void Lcd_Init()
/*功能:液晶屏初始化
/*说明:指令代码控制屏幕的开启
/*************/
/****************************************/
void Lcd_Init() //液晶初始化
{
reset(); //复位子程序
clear(); //清屏
dison_off(1); //开屏
}
/*****************************/
/*函数原型:Show12864_Row(unsigned char cs1,unsigned char cs2,unsigned char x,unsigned char y,unsigned char ucSelect,unsigned char * pScr_Row)
/*参数:cs1,cs2,X,Y,ucSelect,*pScr_Row
/*功能:液晶显示的具体位置和显示时的正反选状态以及显示的内容
/*说明:cs1为1时打开左屏,为cs2为1时打开右屏;x为显示的行值,可以为0,1,2,3; y为显示的列值(0~127);ucSelect为0时为正选,为1时为反显;*pScr_Row指向要显示的内容
/*****************************/
void Show12864_Row(unsigned char cs1,unsigned char cs2,unsigned char x,unsigned char y,unsigned char ucSelect,unsigned char * pScr_Row) //区信息显示函数,x为显示页,pScr_Row为显示信息内容
{
unsigned char ch = '\0',cs1 = 0, cs2 = 0, col_up = y,col_down = y;
unsigned char i,j;
while(*pScr_Row)
{
WDTRST = 0x1E; //启动看门狗
WDTRST = 0xE1;
if(*pScr_Row > 0xA0) //为中文信息
{
ch = *pScr_Row++;
for(i = 0;i < 114;i ++) //共114个汉字可供检索
{
WDTRST = 0x1E; //启动看门狗
WDTRST = 0xE1;
if(ch == GB_32[i].Index[0]&&*pScr_Row == GB_32[i].Index[1]) //找到信息
{
set_adr(x*2,y%64); //在x,y处开始显示,上半部分信息
for(j = 0;j < 16;j ++)
{
if(col_up > 63&&col_up < 128)
{
if(cs2 == 0)
set_adr(x*2,0);
cs2 = 1;
}
else if(col_up > 127)
break;
else
cs1=1;
if(ucSelect == 1) //反显
wdata(~GB_32[i].Msk[j],cs1,cs2);
else //不反显
wdata(GB_32[i].Msk[j],cs1,cs2);
col_up ++;
}
WDTRST = 0x1E; //启动看门狗
WDTRST = 0xE1;
set_adr(x*2+1,y%64); //在x,y处开始显示,下半部分信息
for(j = 0;j < 16;j++)
{
if(col_down > 63&&col_down < 128)
{
if(cs2 == 0)
set_adr(x*2+1,0);
cs2=1;
}
else if(col_down > 127)
return;
else
{ c = 0;
cs1=1;
}
if(ucSelect == 1) //反显
wdata(~GB_32[i].Msk[j + 16],cs1,cs2);
else //不反显
wdata(GB_32[i].Msk[j + 16],cs1,cs2);
col_down ++;
}
y += 16; //16×16的汉字
break;
}
}
pScr_Row++;
}
else //为西文信息
{
for(i = 0;i < 75;i++) //共75个西文可供检索
{
WDTRST = 0x1E; //启动看门狗
WDTRST = 0xE1;
if(*pScr_Row == GB_16[i].Index)
{
set_adr(x*2,y%64); //在x,y处开始显示,上半部分信息
for(j = 0;j < 8;j ++)
{
if(col_up > 63)
{
if(cs2 == 0)
set_adr(x*2,0);
cs2=1;
}
else
cs1=1;
if(ucSelect == 1) //反显
wdata(~GB_16[i].Msk[j],cs1,cs2);
else //不反显
wdata(GB_16[i].Msk[j],cs1,cs2);
col_up ++;
}
WDTRST = 0x1E; //启动看门狗
WDTRST = 0xE1;
set_adr(x*2+1,y%64); //在x,y处开始显示,下半部分信息
for(j = 0;j < 8;j ++)
{
if(col_down > 63)
{
if(cs2 == 0)
set_adr(x*2+1,0);
cs2=1;
}
else
cs1=1;
if(ucSelect == 1) //反显
wdata(~GB_16[i].Msk[j + 8],cs1,cs2);
else //不反显
wdata(GB_16[i].Msk[j + 8],cs1,cs2);
col_down ++;
}
y += 8; //16×8的西文
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -