📄 s12864.c
字号:
/*
* 文件名称 : s12864.c
* 摘 要 : 本文件描述液晶控制器s12864接口函数
*
* 当前版本 : v2.0
* 作 者 : Catherine
* 完成日期 : 2007年6月30日
*/
//#pragma ot(9)
//#pragma small
#pragma ot(9)
#pragma large
#include <w77e58.h>
#include <stdio.h>
#include <string.h>
#include "s12864.h"
#include "FONTLIB.h"
sbit DOG = P1^4; //喂狗端
//#define ComReg 0x2001
//***************读lcd口状态****************
char TestLcd()//等待LCD显,可以接受数据
{
char data1;
//int *p;
for(;;)
{
LcdCd =1; //lcd 写命令端口
data1=ComRegWr;
//data1=0x03;
if((data1&0x03)==0x03)break;
}
return(0x01);
}
//***************向lcd写命令****************
void OrderCode(char com)
{
if(TestLcd()==1)
{
LcdCd =1; //lcd 写命令端口
ComRegWr=com;
}
DOG = 1; //喂狗
DOG = 0; //喂狗
}
//***************向lcd写数据****************
void OrderData(char dat1,char dat2,char com)
{
if(TestLcd()==1)
{
LcdCd =0; //lcd 写数据端口
DataRegWr=dat1;
}
if(TestLcd()==1)
{
LcdCd =0; //lcd 写数据端口
DataRegWr=dat2;
}
if(TestLcd()==1)
{
LcdCd =1; //lcd 写命令端口
ComRegWr=com;
}
DOG = 1; //喂狗
DOG = 0; //喂狗
}
void OrderData1(char dat2,char com)
{
if(TestLcd()==1)
{
LcdCd =0; //lcd 写数据端口
DataRegWr=dat2;
}
if(TestLcd()==1)
{
LcdCd =1; //lcd 写命令端口
ComRegWr=com;
}
DOG = 1; //喂狗
DOG = 0; //喂狗
}
/***********************************************
*显示一个汉字子程序,图形方式 16*16
*图形方式显示汉字子程序
*显示方式为:左上角,左下角,右上角,右下角
***********************************************/
/*void WriteWord(char o_x,char o_y,char code1)
{
char i;
int dot1=0;
int addr=0;
addr=o_y*32+o_x+2048;
dot1=(code1-1)*32;
for(i=0;i<32;i=i+2)
{
o_x=addr%256;
o_y=addr/256;
OrderData(o_x,o_y,0x24);
OrderData1(FontLib16[dot1+i],0xc0);
OrderData1(FontLib16[dot1+1+i],0xc0);
addr+=32;
}
} */
//************写入一个字符子程序,字符格式为 16*8
void WriteNum(char o_x,char o_y,char code1)
{
char i;
int dot1;
int addr=0;
addr=o_y*16+o_x+2048; //2048是设置的图形区的首地址0x0800
dot1=(code1-1)*16;
for(i=0;i<16;i++)
{
o_x=addr%256;
o_y=addr/256;
OrderData(o_x,o_y,0x24);
OrderData1(FontLib8[dot1+i],0xc0);
addr+=32;
}
}
//************反显一个字符子程序,字符格式为 16*8
void WriteNum_N(char o_x,char o_y,char code1)
{
char i;
int dot1;
int addr=0;
addr=o_y*16+o_x+2048; //2048是设置的图形区的首地址0x0800
dot1=(code1-1)*16;
for(i=0;i<16;i++)
{
o_x=addr%256;
o_y=addr/256;
OrderData(o_x,o_y,0x24);
OrderData1(~FontLib8[dot1+i],0xc0);
addr+=32;
}
}
//*************** 液晶清屏子程序******************
void ClearLcd()
{
char data1;
int i;
OrderData(0x00,0x00,0x24);
OrderCode(0xb0);
for(i=0;i<8000;i++)
{
for(;;)
{
LcdCd =1; //lcd 写命令端口
data1=ComRegWr;
//data1=0x08;
if((data1&0x08)==0x08)
break;
}
LcdCd =0; //lcd 写数据端口
DataRegWr=0x00;
}
OrderCode(0xb2);
}
//************** 字串显示 ****************
void ShowWord(char o_x,char o_y,char *code1,char count)
{
char i;
for(i=0;i<count;i++)
{
WriteNum(o_x,o_y,*code1);
code1++;
o_x++;
}
}
//***********反显字串*******************************
void ShowWord_N(char o_x,char o_y,char *code1,char count)
{
char i;
for(i=0;i<count;i++)
{
WriteNum_N(o_x,o_y,*code1);
code1++;
o_x++;
}
}
//**************** 液晶初始化程序 ********
void IntLcd()
{
OrderData(0x00,0x00,0x40); //设置文本显示区域首地址
OrderData(0x20,0x00,0x41); //设置文本显示区域宽度,即一行显示所占字节数
OrderData(0x00,0x08,0x42); //设置图形显示区域首地址,或为文本属性区域首地址
OrderData(0x20,0x00,0x43); //设置图形显示区域宽度,或为文本属性区域首地址,即一行显示所占字节数
OrderCode(0xa0); //光标形状设置
OrderCode(0x81); //显示方式设置,逻辑异或合成
OrderCode(0x9c); //显示开关设置
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -