📄 lcd.c
字号:
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#include <string.h>
#include "lcd.h"
#include "font.h"
sbit LCD_WR =P3^5; //Data Write into T6963C,L有效
sbit LCD_RD =P3^6; //Data Read from T6963C,L有效
sbit LCD_CE =P3^4; //使能信号,L有效
sbit LCD_CD =P3^7; //当wr=L,LCD_CD=H:写命令,LCD_CD=L:写数据;当rd=L,LCD_CD=H:读状态,LCD_CD=L:读数据
sbit LCD_RST=P3^3; //Lcm reset,低有效
sbit LCD_FS =P3^2; //字体选择,H:6*8点阵;L:8*8点阵
sbit bf0 = P1^0;
sbit bf1 = P1^1;
sbit bf3 = P1^3;
uchar code HexTable[]="0123456789ABCEDF";
uchar code Num_Tab[]=
{
/* 48 0x30 '0' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x38, /* 00 000 */
0x44, /* 0 000 00 */
0x4c, /* 0 00 00 */
0x54, /* 0 0 0 00 */
0x64, /* 0 00 00 */
0x44, /* 0 000 00 */
0x38, /* 00 000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
/* 49 0x31 '1' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x08, /* 0000 000 */
0x18, /* 000 000 */
0x08, /* 0000 000 */
0x08, /* 0000 000 */
0x08, /* 0000 000 */
0x08, /* 0000 000 */
0x1c, /* 000 00 */
0x00, /* 00000000 */
0x00, /* 00000000 */
/* 50 0x32 '2' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x38, /* 00 000 */
0x44, /* 0 000 00 */
0x04, /* 00000 00 */
0x08, /* 0000 000 */
0x10, /* 000 0000 */
0x20, /* 00 00000 */
0x7c, /* 0 00 */
0x00, /* 00000000 */
0x00, /* 00000000 */
/* 51 0x33 '3' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x38, /* 00 000 */
0x44, /* 0 000 00 */
0x04, /* 00000 00 */
0x18, /* 000 000 */
0x04, /* 00000 00 */
0x44, /* 0 000 00 */
0x38, /* 00 000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
/* 52 0x34 '4' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x08, /* 0000 000 */
0x18, /* 000 000 */
0x28, /* 00 0 000 */
0x48, /* 0 00 000 */
0x7c, /* 0 00 */
0x08, /* 0000 000 */
0x1c, /* 000 00 */
0x00, /* 00000000 */
0x00, /* 00000000 */
/* 53 0x35 '5' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x7c, /* 0 00 */
0x40, /* 0 000000 */
0x78, /* 0 000 */
0x04, /* 00000 00 */
0x04, /* 00000 00 */
0x44, /* 0 000 00 */
0x38, /* 00 000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
/* 54 0x36 '6' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x38, /* 00 000 */
0x40, /* 0 000000 */
0x78, /* 0 000 */
0x44, /* 0 000 00 */
0x44, /* 0 000 00 */
0x44, /* 0 000 00 */
0x38, /* 00 000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
/* 55 0x37 '7' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x7c, /* 0 00 */
0x04, /* 00000 00 */
0x04, /* 00000 00 */
0x08, /* 0000 000 */
0x10, /* 000 0000 */
0x10, /* 000 0000 */
0x10, /* 000 0000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
/* 56 0x38 '8' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x38, /* 00 000 */
0x44, /* 0 000 00 */
0x44, /* 0 000 00 */
0x38, /* 00 000 */
0x44, /* 0 000 00 */
0x44, /* 0 000 00 */
0x38, /* 00 000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
/* 57 0x39 '9' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x38, /* 00 000 */
0x44, /* 0 000 00 */
0x44, /* 0 000 00 */
0x44, /* 0 000 00 */
0x3c, /* 00 00 */
0x04, /* 00000 00 */
0x38, /* 00 000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
};
//6x10的方块
uchar code BlockTab[]={
/* 57 0x39 '9' */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x7C, /* 0 00 */
0x7C, /* 0 00 */
0x7C, /* 0 00 */
0x7C, /* 0 00 */
0x7C, /* 0 00 */
0x7C, /* 0 00 */
0x7C, /* 0 00 */
0x00, /* 00000000 */
0x00, /* 00000000 */
//empty block
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
};
void LCD_Busy (uchar autowr) //测状态
{
LCD_CE = 0;
LCD_DATA_BUS=0xff;
LCD_CD=1;
LCD_WR=1;
LCD_RD=0;
if(autowr)
{
while(bf3==0)
;
}
else
{
while((bf0==0)||(bf1==0))
;
}
LCD_RD=1;
}
uchar LCD_BusyStatus () //测状态
{
uchar dat;
LCD_CE = 0;
LCD_CD=1;
LCD_RD=1;
LCD_WR=1;
LCD_DATA_BUS=0xff;
LCD_RD=0;
dat=LCD_DATA_BUS;
LCD_RD=1;
return dat;
}
/* 数据,指令读写判别 */
void LCD_CheckBusy1(void)
{
while ((LCD_BusyStatus()&3)!=3) {}
}
/* 数据自动读判别 */
/*
void LCD_CheckBusy2(void)
{
while ((LCD_BusyStatus()&4)!=4) {}
}
*/
/* 数据自动写判别 */
/*
void LCD_CheckBusy3(void)
{
while ((LCD_BusyStatus()&8)!=8) {}
}
*/
/*------------写命令或数据到LCD--------------*/
void LCD_Write1 (uchar dat,uchar comm) //写一个数据和一个命令
{
LCD_Data(dat);
LCD_Comm(comm);
}
void LCD_Write2 (uchar datl,uchar dath,uchar comm) //写两个数据和一个命令
{
LCD_Data(datl);
LCD_Data(dath);
LCD_Comm(comm);
}
void LCD_WriteInt (uint dat,uchar comm) //写一个16进制数据和一个命令
{
uchar datl,dath;
datl=dat;
dath=dat>>8;
LCD_Data(datl);
LCD_Data(dath);
LCD_Comm(comm);
}
void LCD_AutoWrite (uchar dat) //自动写数据
{
LCD_CE = 0;
LCD_Busy (1);
LCD_CD=0;
LCD_RD=1;
LCD_DATA_BUS=dat;
LCD_WR=0;
LCD_WR=1;
}
/* 读数据 */
uchar LCD_Read(void)
{
uchar dat;
LCD_CE = 0;
LCD_CheckBusy1();
LCD_CD=0;
LCD_DATA_BUS = 0xff;
LCD_RD=0;
dat=LCD_DATA_BUS;
LCD_RD=1;
LCD_CD=1;
return dat;
}
/* 自动读数据 */
/*
uchar LCD_AutoRead(void)
{
uchar dat;
LCD_CE = 0;
LCD_CheckBusy2();
LCD_CD=0;
LCD_DATA_BUS = 0xff;
LCD_RD=0;
dat=LCD_DATA_BUS;
LCD_RD=1;
LCD_CD=1;
return dat;
}
*/
void LCD_Comm (uchar comm) //写命令
{
LCD_CE = 0;
LCD_Busy (0);
LCD_CD=1;
LCD_RD=1;
LCD_DATA_BUS=comm;
LCD_WR=0;
LCD_WR=1;
}
void LCD_Data (uchar dat) //写数据
{
LCD_CE = 0;
LCD_Busy (0);
LCD_CD=0;
LCD_RD=1;
LCD_DATA_BUS=dat;
LCD_WR=0;
LCD_WR=1;
}
/*------------------初始化-----------------*/
void LCD_Init (void)
{
//LCD_RST=0;
//;
//LCD_RST=1;
//LCD_FS=0;
//LCD_CE=0;
//LCD_CE = 0;
LCD_WR=1;
LCD_RD=1;
LCD_WriteInt(LCD_TEXT_HOME_ADDR,0x40); //文本显示区首地址
LCD_WriteInt(LCD_GRAPH_HOME_ADDR,0x42); //图形显示区首地址
LCD_Write2(LCD_WIDTH,0x00,0x41); //文本显示区宽度
LCD_Write2(LCD_WIDTH,0x00,0x43); //图形显示区宽度
LCD_Comm(0x81); //逻辑"异或"
LCD_Write2(0x02,0x00,0x22); //CGRAM偏置地址设置
LCD_Comm(0x9c); //启用文本显示,启用图形显示
//LCD_Comm(0x98); //启用文本显示,启用图形显示
LCD_Cls();
}
/********************************************************/
/* 清屏 */
/********************************************************/
void LCD_Cls(void)
{
uint i;
//LCD_CE = 0;
//LCD_Write2(0x00,0x00,LC_ADD_POS);// 置地址指针为从零开始
LCD_WriteInt(LCD_TEXT_HOME_ADDR,LC_ADD_POS);
LCD_Comm(LC_AUT_WR); // 自动写
for(i=0;i< 144*LCD_WIDTH;i++) // 清一屏
{
LCD_Data(0x00); // 写数据0x00
}
LCD_Comm(LC_AUT_OVR); // 自动写结束
LCD_Write2(0x00,0x00,LC_ADD_POS);// 重置地址指针
}
void LCD_ClsBlock(uchar x1,uchar y1,uchar x2,uchar y2)
{
uint addr;
uchar h,w;
uchar i,j;
//x坐标要8字节对齐
x1 =(x1 / 8) * 8;
x2 =(x2 / 8) * 8;
h = y2 - y1;
w = (x2 - x1)/8;
addr = LCD_GRAPH_HOME_ADDR + LCD_WIDTH * y1 + x1/8;
for(j=0;j<h;j++)
{
LCD_WriteInt(addr,0x24);
LCD_Comm(0xb0);
for(i=0;i<w;i++)
{
LCD_AutoWrite(0x00);
}
LCD_Comm(0xb2);
addr += LCD_WIDTH;
}
}
/* 设定图形x,y值*/
/*
void LCD_GraphSetAddr(uchar x,uchar y)
{
uint xy;
xy=y;
xy=xy*16+x+256;
//LCD_CE = 0;
LCD_Write2(xy&0xff,xy/256,0x24);
}
*/
/* 设定文本x,y值 */
/*
void LCD_TextSetAddr(uchar x,uchar y)
{
//LCD_CE = 0;
LCD_Write2(y*16+x,0,0x24);
}
*/
/* 清除一点*/
/*
void LCD_ClrPixel(uchar x,uchar y)
{
uchar b;
uint addr = LCD_GRAPH_HOME_ADDR + y * LCD_WIDTH + x / 8;
b = 7 - (x % 8);
LCD_WriteInt(addr,0x24);
LCD_Comm(0xf0|b);
}
*/
/* 点亮一点 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -