📄 lcd12864io.c
字号:
#include <reg51.h>
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RST= P3^7; //液晶屏复位脚定义
sbit DI=P3^4; //DI引脚定义
sbit RW=P3^5; //RW引脚定义
sbit CS=P3^3; //片选信号定义
sbit EN=P3^6; //使能信号定义
sbit RDY=P0^7; //对应状态信息中的BF位
sfr LCD=0x80; //P0口作为数据口
#define LCD_DISPON 0x3f // 打开LCD显示
#define LCD_STARTROW 0xc0
// 设置起始行,可用LCD_STARTROW+x设置起始行(x<64)
#define LCD_ADDRSTRY 0xb8
// 页起始地址, 可用LCD_ADDRSTRX+x设置当前页(x<8)
#define LCD_ADDRSTRX 0x40
// 列起始地址,可用LCD_ADDRSTRY+x设置当前列(x<64)
#define CS1 0 //左半屏选择
#define CS2 1 //右半屏选择
//命令字cmd送左半屏(port=0)/右半屏(port=1)命令口
void LCD_WrCmd(bit port,uchar cmd)
{ EN=0;
CS=port;
DI=0; //选择命令寄存器
RW=0;
EN=1;
LCD=cmd; //命令码送总线
EN=0;
}
//数据wrdata送左半屏(port=0)/右半屏(port=1)数据口
void LCD_WrDat(bit port ,uchar wrdata)
{ EN=0;
CS=port;
DI=1; //选择命令寄存器
RW=0;
EN=1;
LCD=wrdata; //数据送总线
EN=0;
}
uchar code ASCII_TAB[480] = //0x20~0x7F之间 ASCII码对应的点阵数据表
{ 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9e, 0x00, 0x00,
0x00, 0x0e, 0x00, 0x0e, 0x00,
0x28, 0xfe, 0x28, 0xfe, 0x28,
0x48, 0x54, 0xfe, 0x54, 0x24,
0x46, 0x26, 0x10, 0xc8, 0xc4,
0x6c, 0x92, 0xaa, 0x44, 0xa0,
0x00, 0x0a, 0x06, 0x00, 0x00,
0x00, 0x38, 0x44, 0x82, 0x00,
0x00, 0x82, 0x44, 0x38, 0x00,
0x28, 0x10, 0x7c, 0x10, 0x28,
0x10, 0x10, 0x7c, 0x10, 0x10,
0x00, 0xa0, 0x60, 0x00, 0x00,
0x10, 0x10, 0x10, 0x10, 0x10,
0x00, 0xc0, 0xc0, 0x00, 0x00,
0x40, 0x20, 0x10, 0x08, 0x04,
0x7C, 0xA2, 0x92, 0x8A, 0x7C,
0x00, 0x84, 0xFE, 0x80, 0x00,
0x84, 0xC2, 0xA2, 0x92, 0x8C,
0x42, 0x82, 0x8A, 0x96, 0x62,
0x30, 0x28, 0x24, 0xFE, 0x20,
0x4E, 0x8A, 0x8A, 0x8A, 0x72,
0x78, 0x94, 0x92, 0x92, 0x60,
0x02, 0xE2, 0x12, 0x0A, 0x06,
0x6C, 0x92, 0x92, 0x92, 0x6C,
0x0C, 0x92, 0x92, 0x52, 0x3C,
0x00, 0x6C, 0x6C, 0x00, 0x00,
0x00, 0xAC, 0x6C, 0x00, 0x00,
0x10, 0x28, 0x44, 0x82, 0x00,
0x28, 0x28, 0x28, 0x28, 0x28,
0x00, 0x82, 0x44, 0x28, 0x10,
0x04, 0x02, 0xA2, 0x12, 0x0C,
0x64, 0x92, 0xF2, 0x82, 0x7C,
0xFC, 0x22, 0x22, 0x22, 0xFC,
0xFE, 0x92, 0x92, 0x92, 0x6C,
0x7C, 0x82, 0x82, 0x82, 0x44,
0xFE, 0x82, 0x82, 0x44, 0x38,
0xFE, 0x92, 0x92, 0x92, 0x82,
0xFE, 0x12, 0x12, 0x12, 0x02,
0x7C, 0x82, 0x92, 0x92, 0xF4,
0xFE, 0x10, 0x10, 0x10, 0xFE,
0x00, 0x82, 0xFE, 0x82, 0x00,
0x40, 0x80, 0x82, 0x7E, 0x02,
0xFE, 0x10, 0x28, 0x44, 0x82,
0xFE, 0x80, 0x80, 0x80, 0x80,
0xFE, 0x04, 0x18, 0x04, 0xFE,
0xFE, 0x08, 0x10, 0x20, 0xFE,
0x7C, 0x82, 0x82, 0x82, 0x7C,
0xFE, 0x12, 0x12, 0x12, 0x0C,
0x7C, 0x82, 0xA2, 0x42, 0xBC,
0xFE, 0x12, 0x32, 0x52, 0x8C,
0x8C, 0x92, 0x92, 0x92, 0x62,
0x02, 0x02, 0xFE, 0x02, 0x02,
0x7E, 0x80, 0x80, 0x80, 0x7E,
0x3E, 0x40, 0x80, 0x40, 0x3E,
0x7E, 0x80, 0x70, 0x80, 0x7E,
0xC6, 0x28, 0x10, 0x28, 0xC6,
0x0E, 0x10, 0xE0, 0x10, 0x0E,
0xC2, 0xA2, 0x92, 0x8A, 0x86,
0x00, 0xFE, 0x82, 0x82, 0x00,
0x04, 0x08, 0x10, 0x20, 0x40,
0x00, 0x82, 0x82, 0xFE, 0x00,
0x08, 0x04, 0x02, 0x04, 0x08,
0x80, 0x80, 0x80, 0x80, 0x80,
0x00, 0x02, 0x04, 0x08, 0x00,
0x40, 0xA8, 0xA8, 0xA8, 0xF0,
0xFE, 0x90, 0x88, 0x88, 0x70,
0x70, 0x88, 0x88, 0x88, 0x40,
0x70, 0x88, 0x88, 0x90, 0xFE,
0x70, 0xA8, 0xA8, 0xA8, 0x30,
0x10, 0xFC, 0x12, 0x02, 0x04,
0x18, 0xA4, 0xA4, 0xA4, 0x7C,
0xFE, 0x10, 0x08, 0x08, 0xF0,
0x00, 0x88, 0xFA, 0x80, 0x00,
0x40, 0x80, 0x88, 0x7A, 0x00,
0xFE, 0x20, 0x50, 0x88, 0x00,
0x00, 0x82, 0xFE, 0x80, 0x00,
0xF8, 0x08, 0x30, 0x08, 0xF8,
0xF8, 0x10, 0x08, 0x08, 0xF0,
0x70, 0x88, 0x88, 0x88, 0x70,
0xF8, 0x28, 0x28, 0x28, 0x10,
0x10, 0x28, 0x28, 0x30, 0xF8,
0xF8, 0x10, 0x08, 0x08, 0x10,
0x90, 0xA8, 0xA8, 0xA8, 0x40,
0x08, 0x7E, 0x88, 0x80, 0x40,
0x78, 0x80, 0x80, 0x40, 0xF8,
0x38, 0x40, 0x80, 0x40, 0x38,
0x78, 0x80, 0x60, 0x80, 0x78,
0x88, 0x50, 0x20, 0x50, 0x88,
0x18, 0xA0, 0xA0, 0xA0, 0x78,
0x88, 0xC8, 0xA8, 0x98, 0x88,
0x00, 0x10, 0x6C, 0x82, 0x00,
0x00, 0x00, 0xFE, 0x00, 0x00,
0x00, 0x82, 0x6C, 0x10, 0x00,
0x10, 0x10, 0x54, 0x38, 0x10,
0x10, 0x38, 0x54, 0x10, 0x10};
uchar code HZTAB[]=
{0x10,0x21,0x86,0x70,0x00,0x7E,0x4A,0x4A,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,0x00,
0x02,0xFE,0x01,0x40,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x40,0x00,/*"温",0*/
0x20,0x18,0x08,0x09,0xEE,0xAA,0xA8,0xAF,0xA8,0xA8,0xEC,0x0B,0x2A,0x18,0x08,0x00,//常1
0x00,0x00,0x3E,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x12,0x22,0x1E,0x00,0x00,0x00,
0x40,0x20,0xF0,0x0C,0x07,0x02,0xFC,0x44,0x44,0x42,0xFE,0x43,0x43,0x42,0x40,0x00,//低2
0x00,0x00,0x7F,0x00,0x00,0x00,0x7F,0x20,0x10,0x28,0x43,0x0C,0x10,0x20,0x78,0x00,
0x04,0x04,0x04,0x04,0x74,0x54,0x55,0x56,0x54,0x54,0x74,0x04,0x04,0x04,0x04,0x00,
0x00,0xFF,0x01,0x01,0x3D,0x25,0x25,0x25,0x25,0x25,0x3D,0x41,0x81,0x7F,0x00,0x00,//高3
0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,
0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00,/*"电",4*/
0x82,0xE2,0x5E,0x42,0xC2,0x0A,0x08,0xC9,0x3E,0x0A,0x08,0x8C,0x7A,0x09,0x08,0x00,
0x00,0x7F,0x10,0x10,0x1F,0x32,0x2B,0x26,0x2A,0x71,0x32,0x2B,0x26,0x2A,0x71,0x00,/*"磁",5*/
0x00,0x00,0xF8,0x81,0x46,0xE0,0x58,0x42,0xFA,0x2A,0x32,0xA2,0x02,0xFE,0x00,0x00,
0x00,0x00,0xFF,0x00,0x00,0x3F,0x04,0x04,0x03,0x0E,0x11,0x3C,0x80,0xFF,0x00,0x00,/*"阀",6*/
0x40,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,/*"开",7*/
0x00,0x10,0x10,0x10,0x11,0x1E,0x14,0xF0,0x10,0x18,0x17,0x12,0x18,0x10,0x00,0x00,
0x01,0x81,0x41,0x21,0x11,0x09,0x05,0x03,0x05,0x09,0x31,0x61,0xC1,0x41,0x01,0x00,/*"关",8*/
0x10,0x60,0x01,0xC6,0x00,0x80,0x84,0x44,0x5F,0x24,0x64,0x94,0x84,0xE4,0x00,0x00,
0x04,0xFC,0x03,0x00,0x42,0x42,0x32,0x0E,0x02,0x02,0x3E,0x42,0x42,0x42,0x78,0x00,/*"浇",9*/
0x08,0x31,0x82,0x78,0x02,0x3A,0xEA,0xAF,0xBA,0xC2,0xBA,0xAF,0xAA,0xBA,0x02,0x00,
0x04,0x04,0x7F,0x00,0x02,0x01,0x7F,0x2A,0x2A,0x2A,0x3F,0x2A,0x2A,0x2A,0x20,0x00,/*"灌",10*/
0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,
0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,/*"时",11*/
0x00,0xF8,0x01,0x06,0x00,0xF0,0x92,0x92,0x92,0x92,0xF2,0x02,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x00,0x00,0x00,0x07,0x04,0x04,0x04,0x04,0x07,0x40,0x80,0x7F,0x00,0x00,/*"间",12*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*":",13*/
0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,
0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,/*"分",14*/
0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x38,0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,
0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00,/*"秒",15*/
0x00,0xF0,0xF8,0x0C,0x04,0x04,0x04,0x04,0x0C,0xF8,0xF0,0x00,0x00,0x00,0x01,0x03,
0x02,0x02,0x02,0x02,0x03,0x01,0x00,0x00,/*"0",16*/
};
//以filldata充填液晶屏
void LCD_DispFill(uchar filldata)
{ uchar x, y;
LCD_WrCmd(CS1,LCD_STARTROW); //设置左半屏显示起始行为0
LCD_WrCmd(CS2,LCD_STARTROW); //设置右半屏显示起始行为0
for(y=0; y<8; y++) //循环充填8页
{ LCD_WrCmd(CS1,LCD_ADDRSTRY+y); // 设置左半屏页地址
LCD_WrCmd(CS1,LCD_ADDRSTRX); // 设置左半屏列地址
LCD_WrCmd(CS2,LCD_ADDRSTRY+y); // 设置右半屏页地址
LCD_WrCmd(CS2,LCD_ADDRSTRX); // 设置右半屏列地址
for(x=0; x<64; x++) //充填每页的64个单元(列)
{ LCD_WrDat(CS1,filldata);
LCD_WrDat(CS2,filldata);
}
}
}
//液晶模块初始化
void LCD_DispIni(void)
{ uint i;
LCD_RST = 0; // 复位驱动芯片
for(i=0; i<500; i++);
LCD_RST = 1;
LCD_WrCmd(CS1,LCD_DISPON); // 打开显示
LCD_WrCmd(CS1,LCD_STARTROW); // 设置显示起始行为0
LCD_WrCmd(CS2,LCD_DISPON);
LCD_WrCmd(CS2,LCD_STARTROW);
LCD_DispFill(00); // 清屏
LCD_WrCmd(CS1,LCD_ADDRSTRY+0); // 设置页(字符行)地址
LCD_WrCmd(CS1,LCD_ADDRSTRX+0); // 设置列地址
LCD_WrCmd(CS2,LCD_ADDRSTRY+0);
LCD_WrCmd(CS2,LCD_ADDRSTRX+0);
}
//在液晶屏的cy(0-3)行、cx(0-7)列显示汉字字符dispdata
void LCD_DispHZ(uchar cy, uchar cx, uchar dispdata)
{ uchar code *pdat;
uchar i,s,page;
bit port;
cy = cy&0x03; // 参数过滤
cx = cx&0x07;
pdat = &HZTAB[dispdata*32];
if( (cx&0x04) == 0 ) // 如果在左半屏显示
{ port=0;
s = cx<<4; // 求出该汉字在屏幕上的起始列
}
else //在右半屏上显示
{ port=1;
s = (cx<<4)-64; // 求出该汉字在屏幕上的起始列
}
for(page=0;page<2;page++) //每个汉字2页
{ LCD_WrCmd(port,LCD_ADDRSTRX+s); // 设置当前列地址
LCD_WrCmd(port,LCD_ADDRSTRY+(cy<<1)+page); // 设置当前页地址
for(i=0; i<5; i++);
for(i=0; i<16; i++) //每个汉字16列
{ LCD_WrDat(port,*pdat); // 发送数据
pdat++;
}
for(i=0; i<5; i++);
}
}
//在液晶屏的cy(0-3)行、cx(0-7)列显示汉字字符串disp_str
void LCD_DispHZStr(uchar cy, uchar cx, uchar *disp_str)
{ while( *disp_str!=0x55)
{ cy = cy&0x03; // 参数过滤
cx = cx&0x07;
LCD_DispHZ(cy, cx, *disp_str); // 显示汉字
disp_str++; // 指向下一汉字
cx++; //列号加1
if(cx>7)
{ cy++; // 指向下一显示行
cx=0;
}
}
}
void LCD_DispChar(char cy, char cx, char dispdata)
{ uchar code *pch;
uchar i;
bit port;
cy = cy&0x07; // 参数过滤
cx = cx&0x0f;
pch = &ASCII_TAB[(dispdata-0X20)*5]; //指向字符起始列的点阵码
if( (cx&0x08) == 0 ) // 列号cx<8,在左半屏显示
{ port=CS1;
i=cx<<3;
}
else
{ port=CS2;
i = (cx&0x07)<<3;
}
LCD_WrCmd(port,LCD_ADDRSTRX+i); // 设置当前列地址
LCD_WrCmd(port,LCD_ADDRSTRY+cy); // 设置当前页地址
for(i=0; i<5; i++); //延时
LCD_WrDat(port,0x00); // 显示一列空格
for(i=0; i<5; i++) //送出字符的5列点阵码
{
LCD_WrDat(port,*pch);
pch++;
}
LCD_WrDat(port,0x00); // 显示一列空格
for(i=0; i<5; i++);
LCD_WrDat(port,0x00); // 显示一列空格
}
//字符串输出函数相应地改为:
void LCD_DispStr(char cy, char cx, char *disp_str)
{ while( *disp_str != '\0')
{ cy = cy&0x07; // 参数过滤
cx = cx&0x0f;
LCD_DispChar(cy, cx, *disp_str); // 显示字符
disp_str++; // 指向下一字符数据
cx++;
if(cx>15) cy++; // 指向下一显示行
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -