📄 lcd.c
字号:
//SED1565 ljj
//PTC0-WR,PTC1-RD,PTC2-A0
//PTD1-LEDRED,PTD2-LEDGREEN,PTD3-LEDBLUE
#include "gp32.h"
#include "display.h"
#define cli() _asm("cli\n") /*开中断*/
#define sei() _asm("sei\n") /*关中断*/
#define nop() _asm("nop\n") /*空操作*/
typedef struct bits { //为PTC口位操作定义的结构体
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 CLML,//列地址低位
PAGEADD,//页地址
CLMH,//列地址高位
command,//命令
data;//数据
/*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();
}
/*读取BF的值,判断控制器当前是否可以接收MCU发来的数据。*/
void BFRead(void){
unsigned char temp;
BSET(PTC,0); //WR=1
BCLR(PTC,2); //A0=0
DDRB=0x00;
while(1){
BCLR(PTC,1); //RD=0
temp=PTB;
BSET(PTC,1); //RD=1
if ((temp&0x80)==0) break; //BF为第7位,BF=0显示存储器空闲
}
}
/*写指令代码*/
void WRCommand(unsigned char command){
BFRead();
DDRB=0xFF; //B口设为输出
BSET(PTC,1); //RD=1
BCLR(PTC,2); //A0=0;
BCLR(PTC,0); //WR=0
PTB=command; //B口为要执行的命令
BSET(PTC,0); //给WR上升沿,将命令送入LCD
}
/*写显示数据*/
void WRData(unsigned char data){
BFRead();
DDRB=0xFF;
BSET(PTC,1); //RD=1
BSET(PTC,2); //A0=1
BCLR(PTC,0); //WR=0
PTB=data;
BSET(PTC,0); //给WR上升沿,将命令送入LCD
}
/*清显示RAM数据*/
void ClearRAM(void){
unsigned char i,j;
PAGEADD=0xB0; //%1011××××为起始页地址设置命令,此处设为0页
WRCommand(PAGEADD); //送出命令
WRCommand(0x40); //%01××××××为起始行设置命令,此处设为0行
WRCommand(0x10); //%0001××××为起始列地址高位设置命令,此处列地址高位为0
WRCommand(0x00); //%0000××××为起始列地址低位设置命令,此处列地址低位为0
//初始为0页,0行,0列
for(j=0;j<8;j++){ //1565将屏幕分为8页
WRCommand(PAGEADD);
WRCommand(0x10);
WRCommand(0x00);
for(i=0;i<128;i++){//1565将屏幕分为128列
WRData(0x00);//清除屏幕显示
}
PAGEADD++; //页地址加"1"
}
WaitNms(100); //延时
}
/*西文显示程序*/
void DisplayChar(unsigned char CharNum){
unsigned char i,j;
WRCommand(PAGEADD); //显示页地址
WRCommand(CLMH);
WRCommand(CLML); //显示列地址
//1565只要给出页地址和列地址就可以确定显示的位置
for(i=0;i<CharNum;i++){
for(j=0;j<6;j++){ //6*8点阵
WRData(CTable[i*8+j]);
}
}
}
/*西文显示演示程序段*/
//第7页,第24列开始显示16个西文字符
void DisplayCharTest(void){
PAGEADD=0xB7;
CLMH=0x11;
CLML=0x08;
DisplayChar(16);
}
/*西文显示滚动测试*/
void DisplayCharScroll(void){
unsigned char i;
//0页到3页向下滚动显示西文字符
for(i=0;i<4;i++){
ClearRAM();
PAGEADD=PAGEADDTab[i];
CLMH=0x10;
CLML=0x0F;
DisplayChar(16);
WaitNms(1000);
}
//7页到4页向上滚动显示西文字符
for(i=0;i<4;i++){
ClearRAM();
PAGEADD=PAGEADDTab[7-i];
CLMH=0x10;
CLML=0x0F;
DisplayChar(16);
WaitNms(1000);
}
}
/*中文显示程序*/
void DisplayChinese(unsigned char WordNum){
unsigned char i,j;
WRCommand(PAGEADD); //显示页地址
WRCommand(CLMH);
WRCommand(CLML); //显示列地址
//1565只要给出页地址和列地址就可以确定显示的位置
//2页16列显示一个16×16汉字
for(i=0;i<2;i++){
WRCommand(PAGEADD);
WRCommand(CLMH);
WRCommand(CLML);
for(j=0;j<16;j++){ //16*16点阵汉字
WRData(table[i*16+j+WordNum*32]);
}
PAGEADD++;
}
}
/*中文显示演示程序段*/
//0页0列开始显示汉字
void DisplayChineseTest(void){
unsigned char i;
for(i=0;i<4;i++){
PAGEADD=PAGEADDTab[i*2];
CLMH=0x10;
CLML=0x00;
DisplayChinese(i);
}
}
/*中文显示滚动*/
void DisplayChineseScroll(void){
unsigned char i,j;
//0列开始,每次右移2列滚动显示汉字
for(i=0;i<4;i++){
ClearRAM();
for(j=0;j<4;j++){
PAGEADD=PAGEADDTab[j*2];
CLMH=0x10;
CLML=0x00+i*2;
DisplayChinese(j);
}
WaitNms(300);
}
//116列开始,每次左移1个汉字的位置(16列)滚动显示汉字
for(i=0;i<4;i++){
ClearRAM();
for(j=0;j<4;j++){
PAGEADD=PAGEADDTab[j*2];
CLMH=0x17-i;
CLML=0x00;
DisplayChinese(j);
}
WaitNms(1000);
}
}
/*显示图象*/
void DisplayPicture(unsigned char PicNum){
unsigned char i,j;
WRCommand(PAGEADD); //显示页地址
WRCommand(CLMH);
WRCommand(CLML); //显示列地址
//1565只要给出页地址和列地址就可以确定显示的位置
//显示自定义的一幅图象,按照图象的实际大小自定义的算法
for(i=0;i<7;i++){
for(j=0;j<8;j++){
WRData(PictureTable[i*8+j+PicNum*56]);
}
}
}
/*显示图象测试*/
void DisplayPictureTest(void){
unsigned char i;
ClearRAM();
for(i=0;i<7;i++){
PAGEADD=PAGEADDTab[i];
CLMH=0x13;
CLML=0x00;
DisplayPicture(i);
}
}
/*显示颜色*/
void Back_Color(unsigned char i){
DDRD=0xFF;
PTD=BackColor[i];
}
/*初始化EPSON SED1565 */
void INIT_1565(void){
unsigned char i;
for(i=0;i<11;i++){
WRCommand(InitCommandTab[i]);//按照1565的要求顺序送出初始化命令
}
WaitNms(200);
}
/*8*16点阵字符显示算法*/
void Display_Init(unsigned char InfNum,unsigned char LineNum )
{
unsigned char i,j;
WRCommand(PAGEADD); //显示页地址
WRCommand(CLMH);
WRCommand(CLML); //显示列地址
//1565只要给出页地址和列地址就可以确定显示的位置
for(i=0;i<2;i++){
WRCommand(PAGEADD);
WRCommand(CLMH);
WRCommand(CLML);
for(j=0;j<8;j++){ //8*16点阵汉字
WRData(InitInfTab[i*8+j+InfNum*16+LineNum*224]);
}
PAGEADD++;
}
}
/*显示初始化信息测试*/
//初始显示 F1:中文显示 F2:西文显示
// F3:图形显示 F4:全部显示(8*16)
// 1~8:背景颜色(16*16)
void Display_InitTest(void)
{
unsigned char i,j;
ClearRAM();
//F1:中文显示 F2:西文显示
//F3:图形显示 F4:全部显示(8*16)
for(i=0;i<2;i++){
for(j=0;j<14;j++){
PAGEADD=PAGEADDTab[i*2];
CLMH=0x10+j/2;
CLML=0x00+j%2*8;
Display_Init(j,i);
}
}
//1~8:背景颜色
for(i=0;i<8;i++){
PAGEADD=PAGEADDTab[4];
CLMH=0x10+i;
CLML=0x00;
DisplayChinese(i+4);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -