📄 ocm12864.h
字号:
#include "ASCII816.h" //标准ASCII库
#define LCD_CS1 (1<<10)
#define LCD_CS2 (1<<11)
#define LCD_RW (1<<13)
#define LCD_RS (1<<12)
#define LCD_EN (1<<14)
#define LCD_RST (1<<8)
#define LCD_BUSY (1<<23)
//#define __IN_REAL_TARGET
//延时
void LCDmsDelay(uint8 ms)
{
uint16 i,j;
for(j=0;j<ms;j++)
{
for(i=0;i<6000;i++);
}
}
void LCDusDelay(uint8 us)
{
uint8 i,j;
for(j=0;j<us;j++)
{
for(i=0;i<5;i++);
}
}
/*----------------------------------------------------------------------------------------------------*/
//状态检查
uint8 rd_state() //读状态
{
uint8 temp;
IO1DIR&=0xFF00FFFF;
IO0CLR=LCD_RS;
IO0SET=LCD_RW;
IO0SET=LCD_RW;
IO0SET=LCD_EN;
temp=IO1PIN>>16;
IO0CLR=LCD_EN;
return(temp);
}
void CheckState() //等待可读写
{
uint8 temp;
temp=rd_state();
#ifdef __IN_REAL_TARGET
while((temp&0x90)==0x90) //判断状态位STA1,STA0(读写指令和读写数据状态),
//在写指令的读、写数据之前,这两个标志位必须同时为1
#else
while((temp&0x90)!=0x90) //判断状态位STA1,STA0(读写指令和读写数据状态),
//在写指令的读、写数据之前,这两个标志位必须同时为0
#endif
temp=rd_state();
}
/*----------------------------------------------------------------------------------------------------*/
//写显示数据
//dat:显示数据
void WriteByte(uint8 dat)
{
CheckState();
IO1DIR|=0xFF0000;
IO1CLR=0xff0000;
IO0SET=LCD_RS;
IO0CLR=LCD_RW;
IO1SET=dat<<16;
IO0SET=LCD_EN;
LCDusDelay(5);
IO0CLR=LCD_EN;
}
/*----------------------------------------------------------------------------------------------------*/
//读显示数据
uint8 ReadByte()
{
uint8 dat;
CheckState();
IO0SET=LCD_RS|LCD_RW;
IO1DIR&=0xFF00FFFF;
IO1SET=0xFF<<16;
IO0SET=LCD_RS;
IO0SET=LCD_RW;
IO0SET=LCD_EN;
dat=IO1PIN>>16;
IO0CLR=LCD_EN;
return(dat);
}
/*-----------------------------------------------------------------------------------------------------*/
//向LCD发送命令
//command :命令
void SendCommandToLCD(uint8 command)
{
CheckState();
IO0CLR=LCD_RW;
IO0CLR=LCD_RS;
IO1DIR|=0xFF0000;
IO1CLR=0xff0000;
IO1SET=command<<16;
IO0SET=LCD_EN;
LCDusDelay(5);
IO0CLR=LCD_EN;
}
/*---------------------------------------------------------------------------------------------------*/
//选择屏幕
//screen: 0-全屏,1-左屏,2-右屏
void SelectScreen(uint8 screen)
{
switch(screen)
{
#ifdef __IN_REAL_TARGET
case 0:
IO0SET=LCD_CS1;
IO0SET=LCD_CS2;
break;
case 1:
IO0SET=LCD_CS2;
IO0CLR=LCD_CS1;
break;
case 2:
IO0CLR=LCD_CS2;
IO0SET=LCD_CS1;
break;
#else
case 0:
IO0SET=LCD_CS1;
IO0SET=LCD_CS2;
break;
case 1:
IO0SET=LCD_CS1;
IO0CLR=LCD_CS2;
break;
case 2:
IO0CLR=LCD_CS1;
IO0SET=LCD_CS2;
break;
#endif
}
}
/*----------------------------------------------------------------------------------------------------*/
//设定行地址(页)--X 0-7
void SetLine(uint8 line)
{
line=line & 0x07; // 0<=line<=7
line=line | 0xb8; //1011 1xxx
SendCommandToLCD(line);
}
//设定列地址--Y 0-63
void SetColumn(uint8 column)
{
column=column & 0x3f; // 0=<column<=63
column=column | 0x40; //01xx xxxx
SendCommandToLCD(column);
}
//设定显示开始行--XX
void SetStartLine(uint8 startline) //0--63
{
startline=startline & 0x07;
startline=startline | 0xc0; //1100 0000
SendCommandToLCD(startline);
}
//开关显示
void SetOnOff(uint8 onoff)
{
onoff=0x3e | onoff; //0011 111x
SendCommandToLCD(onoff);
}
/*---------------------------------------------------------------------------------------------------*/
//清屏
//screen: 0-全屏,1-左屏,2-右
void ClearScreen(unsigned char screen)
{
uint8 i,j;
SelectScreen(screen);
for(i=0;i<8;i++)
{
SetLine(i);
SetColumn(0);
for(j=0;j<64;j++)
{
WriteByte(0x00);
}
}
}
/*--------------------------------------------------------------------------------------------------*/
//显示8*8点阵
//旋转90度:字模被竖着切分
//lin:行(0-7), column: 列(0-15)
//address : 字模区首地址
void Show88(uint8 lin,uint8 column,const uint8 *address)
{
uint8 i;
if(column>16) {return;}
if(column<8) SelectScreen(1); //如果列数<8(0,1,2,3,4,5,6,7)则写在第一屏上
else
{
SelectScreen(2); //否则 (8,9,10,11,12,13,14,15)写在第二屏上
column=column & 0x07; //防止越界
}
SetLine(lin);
SetColumn(column<<3);
for(i=0;i<8;i++) WriteByte(*(address+i));
}
/*------------------------------------------------------------------------------------------------*/
//显示8*16字符
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//character:字符代码(标准ASCII码)
void ShowChar(uint8 lin,uint8 column,uint8 character)
{
lin=lin<<1;
Show88(lin,column,ASCII816[character-0x20]);
Show88(lin+1,column,ASCII816[character-0x20]+8);
}
/*-----------------------------------------------------------------------------------------------*/
//显示8*16字符串
//!!!只能显示在一行上即: 串长+column <=15
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//address : 字模区首地址
void ShowString(uint8 lin,uint8 column, uint8 *string)
{
uint8 ch;
uint8 i=0;
while(*string!='\0')
{
ch=*string;
if(i+column >15) break; //(只能显示在一行上即: 串长+column <=15)
ShowChar(lin,i+column,ch);
string++; i++;
}
}
/*----------------------------------------------------------------------------------------------*/
//显示一个汉字
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-7)
//hzcode: 汉字代码(自定义的)
//uchar code HZtable
void ShowHZ(uint8 lin,uint8 column,uint16 hzcode)
{
lin=lin<<1; //lin*2
/*
Show88(lin,column,HZTable[hzcode]);
Show88(lin,column+1,HZTable[hzcode]+8);
Show88(lin+1,column,HZTable[hzcode]+16);
Show88(lin+1,column+1,HZTable[hzcode]+24);
*/
}
/*----------------------------------------------------------------------------------------------*/
//显示一行字符串(汉字,字母混排,一行16字节)
//lin:行
//lineheadaddr: 此行汉字代码区首地址
void ShowLine(uint8 lin,uint8 linehead[])
{
uint8 i;
uint8 byte;
uint16 hzcode;
for( i=0; i<16; )
{
byte=linehead[i];
if(byte < 0x80) //字母
{
if(i>15) return; //!!编译器有问题,须强制退出
i=i+1;
}
else // byte >= 0x80(汉字)
{
if(i>15) return; //!!编译器有问题,须强制退出
byte=byte & 0x7f; //最高位置0,即:减去0x8000
hzcode=(unsigned int)byte<<8; //?? //高8位
hzcode=hzcode+linehead[i+1]; //加低8位,组合成整型数地址
ShowHZ( lin,i,hzcode);
i=i+2;
}
}
}
/*----------------------------------------------------------------------------------------------------*/
//显示一屏汉字
//pageheadaddr:此屏汉字代码地址区首地址
void ShowPage(uint8 pagehead[][16])
{
uint8 i;
for(i=0;i<4;i++) ShowLine(i,pagehead[i]); //1行8个汉字,16字节
}
/*----------------------------------------------------------------------------------------------------*/
//反显一个8*8字块
//lin:行(0-3), column: 列(0-7)
void ReverseShow88(uint8 lin,uint8 column)
{
uint8 i;
uint8 tab[8];
if(column<8) SelectScreen(1); //如果列数<4(0,1,2,3),则写在第一屏上
else SelectScreen(2); //否则 (4,5,6,7), 写在第二屏上
//读上部8列
column=column<<3; //每个方块8*8大小
SetLine(lin);
SetColumn(column);
tab[0]=ReadByte(); //空读!!!!! //?
for(i=0;i<8;i++) tab[i]=~ReadByte();
//写回
SetLine(lin);
SetColumn(column);
for(i=0;i<8;i++) WriteByte(tab[i]);
}
/*----------------------------------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------------------------------*/
//反显一个字符
//lin:行(0-4), column: 列(0-15)
void ReverseShowChar(uint8 lin,uint8 column)
{
lin=lin<<1;
ReverseShow88(lin ,column);
ReverseShow88(lin+1,column);
}
/*----------------------------------------------------------------------------------------------------*/
//反显一个汉字
//lin:行(0-3), column: 列(0-7)
void ReverseShowHZ(uint8 lin,uint8 column)
{
lin=lin<<1;
column=column<<1;
ReverseShow88(lin ,column );
ReverseShow88(lin ,column+1);
ReverseShow88(lin+1,column );
ReverseShow88(lin+1,column+1);
}
/*----------------------------------------------------------------------------------------------------*/
//反显一行汉字
//lin:行
void ReverseShow(uint8 lin)
{
uint8 i;
for(i=0;i<8;i++) ReverseShowHZ(lin,i);
}
/*----------------------------------------------------------------------------------------------------*/
void InitialiseLCD() //初始化LCD
{
PINSEL0 = PINSEL0 & 0x00000000; //P0.0:15为GPIO pins
PINSEL2 &= 0xFFFFFFF7; //PINSEL2.3=0,P1.25:16 为GPIO pins. PINSEL2.3=1, P1.25:16 用作Trace port.
IO0DIR=LCD_RW|LCD_RS|LCD_CS1|LCD_CS2|LCD_EN|LCD_RST;
IO0CLR=LCD_RST;
LCDmsDelay(20);
IO0SET=LCD_RST;
LCDmsDelay(20);
// SendCommandToLCD(0xC0);
SelectScreen(0);
SetOnOff(0); //关显示
ClearScreen(1);//清屏
ClearScreen(2);
SelectScreen(0);
SetOnOff(1); //开显示
}
/*----------------------------------------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -