📄 lcd.c
字号:
#include <reg51.h>
#include <stdio.h>
#include <intrins.h>
#include <absacc.h>
#include <SwitchDect.h>
uchar com; //命令字
uchar dat; //数据字
sbit CSA = P1^4; //*cs-1*/
sbit CSB = P1^3; //*cs-2*/
sbit RS = P1^2; //*rs*/
sbit RW = P1^1; //*r/w*/
sbit EN = P1^0; //*enable*/
void ReadStatus() //*判断"忙"状态*/
{
uchar busy;
uchar temp;
RS = 0; //*读时序控制1; RS=0表示进行的是指令操作*/
RW = 1; //*读时序控制2; RW=1表示进行的是读操作*/
do
{
P0 = 0xff; //*P0作输入*/
EN = 1; //*读时序控制3; 使能信号置高*/
busy = P0; //*P0代表端口1的内容*/
EN = 0; //*读时序控制4; 使能信号置低*/
temp=busy&0x80;
}while (temp!=0);
}
void WrLeftCom() //*左屏写命令*/
{
CSA = 0; //选中左屏,0有效;
CSB = 1; //右屏不被选中,1无效;
ReadStatus();
RS = 0;
RW = 0;
P0 = com; //*com表示命令的内容*/
EN = 1;
EN = 0;
}
void WrRightCom() //*写右屏命令*/
{
CSA = 1;
CSB = 0;
ReadStatus();
RS = 0;
RW = 0;
P0 = com;
EN = 1;
EN = 0;
}
void WrLeftData() //*左屏写数据*/
{
CSA = 0;
CSB = 1;
ReadStatus();
RS = 1;
RW = 0;
P0 = dat;
EN = 1;
EN = 0;
}
void WrRightData() //*右屏写数据*/
{
CSA = 1;
CSB = 0;
ReadStatus();
RS = 1;
RW = 0;
P0 = dat;
EN = 1;
EN = 0;
}
void ClrFullScr() //清全屏
{
uchar page=0;
uchar column=0;
for(page=0;page<8;page++)
{
com =(0xb8 + page); //页地址设置
WrLeftCom();
WrRightCom();
com =0x40; //列地址设置
WrLeftCom();
WrRightCom();
for( column=0; column<64; column++) //RAM清"0"
{
dat =0x00; //由于列地址在操作完后会自动加1,
//因此只用设置初地址就行了
WrLeftData();
WrRightData(); //RAM清0就是在所在单元写上数据0
}
}
}
void LCDInit() //液晶初始化
{
com =0xc0; //显示从第0行开始
WrLeftCom();
WrRightCom();
com =0x3F ; //液晶显示开关打开
WrLeftCom();
WrRightCom();
ClrFullScr(); //清全屏
}
void Display88Dot(uchar Row, uchar Col, uchar* Lib, uint Addr) //Display a 8*8 dot array;
{ //Row:0~7 Col:0~15
uchar OffsetCol = 0;
Addr <<= 3;
if((Row>7)||(Col>15)) //防止越界
return;
else if(Col>7)
{
com = 0xb8 + Row;
WrRightCom();
Col -= 8;
Col <<= 3;
com = 0x40 + Col;
WrRightCom();
for(OffsetCol=0; OffsetCol<8; OffsetCol++)
{
dat = Lib[OffsetCol + Addr];
WrRightData();
}
}
else
{
com = 0xb8 + Row;
WrLeftCom();
Col <<= 3;
com = 0x40 + Col;
WrLeftCom();
for(OffsetCol=0; OffsetCol<8; OffsetCol++)
{
dat = Lib[OffsetCol + Addr];
WrLeftData();
}
}
}
void DisplayChar(uchar Row, uchar Col, uchar* Lib, uint Addr) //*Display a 8*16 dot array;
{ //Row:0~3 Col:0~15
if((Row>3)||(Col>15)) //防止越界
return;
Row <<= 1;
Addr <<= 1;
Display88Dot(Row, Col, Lib, Addr);
Display88Dot(Row+1, Col, Lib, Addr+1);
}
void DisplayWord(uchar Row, uchar Col, uchar* Lib, uint Addr) //Display a 16*16 dot array;
{ //Row:0~3 Col:0~7
if((Row>3)||(Col>7)) //防止越界
return;
Row <<= 1;
Col <<= 1;
Addr <<= 2;
Display88Dot(Row, Col, Lib, Addr);
Display88Dot(Row, Col+1, Lib, Addr+1);
Display88Dot(Row+1, Col, Lib, Addr+2);
Display88Dot(Row+1, Col+1, Lib, Addr+3);
}
void DisplayLog(uchar* Lib)
{
uchar page=0;
uchar column=0;
for(page=0;page<8;page++)
{
com =(0xb8 + page); //页地址设置
WrLeftCom();
WrRightCom();
com =0x40; //列地址设置
WrLeftCom();
WrRightCom();
for(column=0; column<64; column++) //先写左半屏某行
{
dat = Lib[page*128+column];
WrLeftData();
}
for(column=64; column<128; column++)//
{
dat = Lib[page*128+column]; //由于列地址在操作完后会自动加1,
//因此只用设置初地址就行了
//WrLeftData();
WrRightData(); //RAM清0就是在所在单元写上数据0
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -