📄 lcd.c
字号:
/* This file is designed for the LCD display.*/
/*It is designed by Lijingjiao*/
/*Control: SED1520 LCD NAME: MGLS100*32*/
#include "gp32.h"
/*开中断*/
#define cli() _asm("cli\n")
/*关中断*/
#define sei() _asm("sei\n")
#define nop() _asm("nop\n")
typedef struct bits {
unsigned char b0:1;
unsigned char b1:1;
unsigned char b2:1;
unsigned char b3:1;
unsigned char b4:1;
unsigned char b5:1;
unsigned char b6:1;
unsigned char b7:1;
}BITS;
typedef union bit_char {
unsigned char byte;
BITS b;
} BIT_CHAR;
#define BSET(x, y) ((x).b.b ## y = 1)
#define BCLR(x, y) ((x).b.b ## y = 0)
#define CLRBYTE(x) ((x).byte = 0)
@tiny volatile BIT_CHAR PTC @0x02;
unsigned char CLMADD,PAGEADD,Row,command,data;
int i,k,l,m;
unsigned char PAGENUM,CLMSUM;
const unsigned char KeyValue[4]={0xfe,0xfd,0xfb,0xf7};
const unsigned char KeyTable[16]={0xee,0xde,0xbe,0x7e,
0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,
0xe7,0xd7,0xb7,0x77};
const char CTable[128]={ //16个字符
0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00,// S
0x00,0x7F,0x49,0x49,0x49,0x49,0x00,0x00,// E
0x00,0x41,0x7F,0x41,0x41,0x3E,0x00,0x00, //D
0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00,// 1
0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00,// 5
0x00,0x42,0x61,0x51,0x49,0x46,0x00,0x00,//2
0x00,0x3e,0x51,0x49,0x45,0x3e,0x00,0x00,//0
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //
0x00,0x7F,0x40,0x40,0x40,0x40,0x00,0x00, //L
0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00, //C
0x00,0x41,0x7F,0x41,0x41,0x3E,0x00,0x00, //D
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //
0x00,0x3E,0x41,0x41,0x49,0x7A,0x00,0x00, //G
0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00, //P
0x00,0x21,0x41,0x45,0x4B,0x31,0x00,0x00, //3
0x00,0x42,0x61,0x51,0x49,0x46,0x00,0x00,//2
};
const char table[128]={
0x10,0x61,0x06,0xE0,0x18,0x84,0xE4,0x1C,0x84,0x65,0xBE,0x24,0xA4,0x64,0x04,0x00,
0x04,0x04,0xFF,0x00,0x01,0x00,0xFF,0x41,0x21,0x12,0x0C,0x1B,0x61,0xC0,0x40,0x00,//液
0x00,0x00,0x00,0x00,0x7E,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x7E,0x00,0x00,0x00,0x00,
0x00,0x7F,0x25,0x25,0x25,0x25,0x7F,0x00,0x00,0x7F,0x25,0x25,0x25,0x25,0x7F,0x00,//晶
0x10,0xD0,0xFF,0x50,0x90,0x04,0xF4,0x54,0x5F,0x54,0x54,0x5F,0xF4,0x04,0x00,0x00,
0x03,0x00,0xFF,0x00,0x00,0x84,0x85,0x45,0x35,0x0F,0x15,0x25,0x65,0xC4,0x44,0x00,//模
0x10,0x10,0xFF,0x10,0x10,0x00,0x08,0x08,0xFF,0x08,0x08,0x08,0xF8,0x00,0x00,0x00,
0x08,0x18,0x0F,0x04,0x85,0x41,0x31,0x0D,0x03,0x05,0x09,0x11,0x31,0x61,0x21,0x00//块
};
const int cnt=5;
const int ptr[5]={10,15,20,25,30};
/*1毫秒延迟*/
static void Wait1ms(void) {
int cnt = 0;
while (cnt <40) cnt++;
}
/*n毫秒延迟*/
void WaitNms(int n){
int i;
for(i=1;i<=n;i++) Wait1ms();
}
/*读状态位-左*/
void BFReadL(void){
unsigned char temp;
while(1){
DDRB=0x00;
BSET(PTC,2); //E1=1
BCLR(PTC,3); //E2=0
BSET(PTC,1); //R/W=1
BCLR(PTC,0); //A0=0
temp=PTB;
if ((temp&0x80)==0) break;
}
}
/*读状态位-右*/
void BFReadR(void){
unsigned char temp;
while(1){
DDRB=0x00;
BCLR(PTC,2); //E1=0
BSET(PTC,3); //E2=1
BSET(PTC,1); //R/W=1
BCLR(PTC,0); //A0=0
temp=PTB;
if ((temp&0x80)==0) break;
}
}
/*写指令代码-左*/
void WRCommandL(void){
BFReadL();
DDRB=0xff;
BSET(PTC,2); //E1=1
BCLR(PTC,3); //E2=0
BCLR(PTC,1); //R/W=0
BCLR(PTC,0); //A0=0
PTB=command;
BCLR(PTC,2); //E1=0
BSET(PTC,1); //R/W=1
}
/*写指令代码-右*/
void WRCommandR(void){
BFReadR();
DDRB=0xff;
BSET(PTC,3); //E2=1
BCLR(PTC,2); //E1=0
BCLR(PTC,1); //R/W=0
BCLR(PTC,0); //A0=0
PTB=command;
BCLR(PTC,3); //E2=0
BSET(PTC,1); //R/W=1
}
/*写显示数据-左*/
void WRDataL(void){
command=CLMADD;
WRCommandL();
BFReadL();
DDRB=0xff;
BSET(PTC,2); //E1=1
BCLR(PTC,3); //E2=0
BCLR(PTC,1); //R/W=0
BSET(PTC,0); //A0=1
PTB=data;
BCLR(PTC,2); //E1=0
CLMADD++;
BSET(PTC,1); //R/W=1
}
/*写显示数据-右*/
void WRDataR(void){
command=CLMADD;
WRCommandR();
BFReadR();
DDRB=0xff;
BSET(PTC,3); //E2=1
BCLR(PTC,2); //E1=0
BCLR(PTC,1); //R/W=0
BSET(PTC,0); //A0=1
PTB=data;
BCLR(PTC,3); //E2=0
CLMADD++;
BSET(PTC,1); //R/W=1
}
/*读显示数据-左*/
int RDDataL(void){
DDRB=0xff;
BSET(PTC,2); //E1=1
BCLR(PTC,3); //E2=0
command=CLMADD;
WRCommandL();
BFReadL();
BCLR(PTC,1); //R/W=0
BSET(PTC,0); //A0=1
DDRB=0x00;
data=PTB;
BCLR(PTC,3); //E2=0
CLMADD++;
BSET(PTC,1); //R/W=1
}
/*读显示数据-右*/
int RDDataR(void){
DDRB=0xff;
BSET(PTC,3); //E2=1
BCLR(PTC,2); //E1=0
command=CLMADD;
WRCommandR();
BFReadR();
BCLR(PTC,1); //*R/W=0
BSET(PTC,0); //A0=1
DDRB=0x00;
data=PTB;
BCLR(PTC,3); //E2=0
CLMADD++;
BSET(PTC,1); //R/W=1
}
/*开显示-左*/
void DisOnL(void){
unsigned char temp;
while(1){
command=0xaf;
WRCommandL();
BFReadL();
DDRB=0x00; //设置B口为输入
BSET(PTC,2); //E1=1
BCLR(PTC,3); //E2=0
BSET(PTC,1); //R/W=1
BCLR(PTC,0); //A0=0
temp=PTB;
if ((temp&0x20)==0) break;
}
}
/*关显示-左*/
void DisOffL(void){
unsigned char temp;
while(1){
command=0xae;
WRCommandL();
BFReadL();
DDRB=0x00; //设置B口为输入
BSET(PTC,2); //E1=1
BCLR(PTC,3); //E2=0
BSET(PTC,1); //R/W=1
BCLR(PTC,0); //A0=0
temp=PTB;
if ((temp&0x20)==0x20) break;
}
}
/*开显示-右*/
void DisOnR(void){
unsigned char temp;
while(1){
command=0xaf;
WRCommandR();
BFReadR();
DDRB=0x00; //设置B口为输入
BSET(PTC,3); //E2=1
BCLR(PTC,2); //E1=0
BSET(PTC,1); //R/W=1
BCLR(PTC,0); //A0=0
temp=PTB;
if ((temp&0x20)==0) break;
}
}
/*关显示-右*/
void DisOffR(void){
unsigned char temp;
while(1){
command=0xae;
WRCommandR();
BFReadR();
DDRB=0x00; //设置B口为输入
BSET(PTC,3); //E2=1
BCLR(PTC,2); //E1=0
BSET(PTC,1); //R/W=1
BCLR(PTC,0); //A0=0
temp=PTB;
if ((temp&0x20)==0x20) break;
}
}
/*清空显示RAM-左*/
void CLRDisplayL(void){
PAGEADD=0xB8; //设置页地址代码
CLMADD=0x00;
for(PAGENUM=0X04;PAGENUM>0;PAGENUM--){
command=PAGEADD;
WRCommandL();
data=0x00;
CLMADD=0x00;
for(CLMSUM=0X50;CLMSUM>0;CLMSUM--){
BFReadL();
WRDataL();
}
PAGEADD++; //页号增1
}
}
/*清空显示RAM-右*/
void CLRDisplayR(void){
PAGEADD=0xB8; //设置页地址代码
CLMADD=0x00;
for(PAGENUM=0x04;PAGENUM>0;PAGENUM--){
command=PAGEADD;
WRCommandR();
data=0x00;
CLMADD=0x00;
for(CLMSUM=0X50;CLMSUM>0;CLMSUM--){
BFReadR();
WRDataR();
}
PAGEADD++; //页号增1
}
}
/*初始化EPSON SED1520 LCD显示-左*/
void Init_LCDL(void){
DisOffL();
command=0xa4; //中止或退出休闲状态
WRCommandL();
command=0xa9; //占空比为1/32
WRCommandL();
command=0xe2; //软件复位
WRCommandL();
command=0xa0; //ADC选择-正向排列
WRCommandL();
CLRDisplayL();
BFReadL();
DisOnL();
}
/*初始化EPSON SED1520 LCD显示-右*/
void Init_LCDR(void){
DisOffR();
command=0xa4; //中止或退出休闲状态
WRCommandR();
command=0xa9; //占空比为1/32
WRCommandR();
command=0xe2; //软件复位
WRCommandR();
command=0xa0; //ADC选择-正向排列
WRCommandR();
CLRDisplayR();
BFReadR();
DisOnR();
}
/*显示西文字符-左*/
void DisplayCharL(void){
command=Row;
WRCommandL();
command=PAGEADD;
WRCommandL();
for(m=0;m<6;m++) //6*8点阵
{
data=CTable[i*8+m];
WRDataL();
}
}
/*显示西文字符-右*/
void DisplayCharR(void){
command=Row;
WRCommandR();
command=PAGEADD;
WRCommandR();
for(m=0;m<6;m++) //6*8点阵
{
data=CTable[i*8+m];
WRDataR();
}
}
/*西文显示演示程序段*/
void DisplayChar(void)
{
PAGEADD=0xbb;
for(i=0;i<7;i++)
{
CLMADD=i*6; //起始列为第0列
DisplayCharL();}
for(i=8;i<16;i++)
{
CLMADD=(i-8)*6;
DisplayCharR();}
}
/*显示中文字符-左*/
void DisplayChinaL(void){
command=Row;
WRCommandL();
command=PAGEADD;
WRCommandL();
i=i*32;
for (k=0;k<16;k++){
data=table[i+k];
WRDataL();
}
CLMADD-=16;
PAGEADD+=1;
command=PAGEADD;
WRCommandL();
for (;k<32;k++){
data=table[i+k];
WRDataL();
}
}
/*显示中文字符-右*/
void DisplayChinaR(void){
command=Row;
WRCommandR();
command=PAGEADD;
WRCommandR();
i=i*32;
for (k=0;k<16;k++){
data=table[i+k];
WRDataR();
}
CLMADD-=16;
PAGEADD+=1;
command=PAGEADD;
WRCommandR();
for (k=0;k<32;k++){
data=table[i+k];
WRDataR();
}
}
/*显示中文字符*/
void DisplayChinese(void){
i=0; //液
PAGEADD=0xb8;
CLMADD=7;
DisplayChinaL();
i=1; //晶
PAGEADD=0xb8;
CLMADD=30;
DisplayChinaL();
i=2; //模
PAGEADD=0xb8;
CLMADD=3;
DisplayChinaR();
i=3; //块
PAGEADD=0xb8;
CLMADD=26;
DisplayChinaR();
}
/*屏幕滚动*/
/*向上滚动*/
void UpScroll(void)
{
while(1){
Row=0xc0;
for(i=0;i<=32;i++){
DisplayChinese();
DisplayChar();
WaitNms(500);
Row+=1;
}
}
}
/*向下滚动*/
void DownScroll(void)
{
while(1){
Row=0xdf;
for(i=0;i<=32;i++){
DisplayChinese();
DisplayChar();
WaitNms(500);
Row-=1;
}
}
}
/*在图形方式下,绘点子程序。该程序在第row(0-31)行、第col(0-99)列绘点,行、列坐标均以点为单位.
该子程序采用读数据操作和读-修改-写功能。在启用读-修改-写和退出读-修改-写的过程中只允许读写
显示数据操作,不能插入其他指令
*/
void DrawDot(int row,int col)
{
int pageaddr,pagelr,data0,bit;
int bitset=0x01;
PAGEADD=0xB8;
pageaddr=row/8; //页面地址
pagelr=PAGEADD|pageaddr;
command=pagelr;
WRCommandL();
WRCommandR();
bit=(bitset<<(row%8));
if (col<50)
{
command=col; //设置列地址
WRCommandL();
command=0xe0; //设置读-修改-写
WRCommandL();
data0=RDDataL(); //空读
data0=RDDataL(); //读取该处的初始数据
data=(data0|bit);
WRDataL();
command=0xEE; //退出读-修改-写
WRCommandL();
}
else
{
col-=50;
command=col; //设置列地址
WRCommandR();
command=0xe0; //设置读-修改-写
WRCommandR();
data0=RDDataR(); //空读
data0=RDDataR(); //读取该处的初始数据
data0|=bit;
data=data0;
WRDataR();
command=0xEE; //退出读-修改-写
WRCommandR();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -