📄 lcd.h
字号:
#include <absacc.h>
#include <intrins.h>
#include <reg51.h>
#include "CharCode.h"
#include "Common.h"
#include "1302.h"
#define dataPort P1 //定义P1口为数据口
sbit di = P2^0; //数据/命令选择
sbit en = P2^1; //使能
sbit rw = P2^2; //读写选择
sbit cs1 = P2^3; //左屏片选(低有效)
sbit cs2 = P2^4; //右屏片选(低有效)
uint currentYear = 0;
uchar currentMonth = 0;
uchar currentDay = 0;
uchar n_currentMon = 0; //当前月的天数
uchar n_lastMon = 0; //上月的天数
uchar dataBuf[8];//存储1032的数据
//状态检查
void CheckState(void)
{
uchar dat;
dat = 0x00;
di=0;
rw=1;
/* do
{
P1=0xff;
en=1;
dat=P1;
en=0;
dat&=0x80; //仅当第7位为0时才可操作
}while(dat);*/
}
void nop(void)
{
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}
//显示数据,写一个直接数据
void WriteByte(uchar wdata)
{
CheckState();
di = 1;
rw = 0;
dataPort = wdata;
en = 1;
en = 0;
}
//发送命令
void SendCMD(uchar cmd)
{
CheckState();
di = 0;
rw = 0;
dataPort = cmd;
en = 1;
en = 0;
}
//设定行地址(页)--X 0-7
void SetLine(uchar line)
{
line &= 0x07; // 0<=line<=7
line |= 0xb8; //1011 1xxx
SendCMD(line);
}
//设定列地址--Y 0-63
void SetColumn(uchar column)
{
column &= 0x3f; // 0=<column<=63
column |= 0x40; //01xx xxxx
SendCMD(column);
}
//设定显示开始行--XX
void SetStartLine(uchar startline) //0--63
{
//startline &= 0x07;
startline |= 0xc0; //1100 0000
SendCMD(startline);
}
//开关显示
void SetOnOff(uchar onoff)
{
onoff |= 0x3e; //0011 111x
SendCMD(onoff);
}
//选择屏幕
//screen: 0-全屏,1-左屏,2-右屏
void SelectScreen(uchar screen)
{ //北京显示器:负有效 cs1: 0--右; cs2: 0--左
switch(screen)
{
case 0:
cs1 = 0;//全屏
nop();
cs2 = 0;
nop();
break;
case 1:
cs1 = 1;//左屏
nop();
cs2 = 0;
nop();
break;
case 2:
cs1 = 0;//右屏
nop();
cs2 = 1;
nop();
break;
default:
break;
}
}
//清屏 screen: 0-全屏,1-左屏,2-右
void ClearScreen(uchar screen)
{
uchar i = 0;
uchar j = 0;
SelectScreen(screen);
for (i = 0; i < 8; i++)
{
SetLine(i);
for (j = 0; j < 64; j++)
{
WriteByte(0x00);
}
}
}
//初始化屏幕
void InitLCD(void)
{
uchar i = 2000; //延时
while (i--);
SetOnOff(1); //开显示
ClearScreen(1);//清屏
ClearScreen(2);
SetStartLine(0); //开始行:0
}
/*
//显示8*8点阵
//lin:行(0-7), column: 列(0-127)
//address : 字模区首地址
void Show8x8(uchar line, uchar column, uchar *addr)
{
uchar i = 0;
if (column < 64 ) //如果列数<64则从第一屏上开始写
{
SelectScreen(1);
SetLine(line);
SetColumn(column);
for (i = 0; i < 8; i++)
{
if ((column + i) < 64)
{
WriteByte( *(addr + i) );
}
else
{
SelectScreen(2);
SetLine(line);
SetColumn(column - 64 + i);
WriteByte( *(addr + i) );
}
}
}
else //如果列数>64则从第二屏上开始写
{
SelectScreen(2);
SetLine(line);
column = column - 64;
SetColumn(column);
for (i = 0; i < 8; i++)
{
if ((column + i) < 64)
{
WriteByte( *(addr + i) );
}
else
{
SelectScreen(1);
SetLine(line);
SetColumn(column - 64 + i);
WriteByte( *(addr + i) );
}
}
}
}*/
//显示6*6点阵
//lin:行(0-10), column: 列(0-127)
//address : 字模区首地址
void Show6x6(uchar line, uchar column, uchar *addr)
{
uchar i = 0;
if (column < 64 ) //如果列数<64则从第一屏上开始写
{
SelectScreen(1);
SetLine(line);
SetColumn(column);
for (i = 0; i < 6; i++)
{
if ((column + i) < 64)
{
WriteByte( *(addr + i) );
}
else
{
SelectScreen(2);
SetLine(line);
SetColumn(column - 64 + i);
WriteByte( *(addr + i) );
}
}
}
else //如果列数>64则从第二屏上开始写
{
SelectScreen(2);
SetLine(line);
column = column - 64;
SetColumn(column);
for (i = 0; i < 6; i++)
{
if ((column + i) < 64)
{
WriteByte( *(addr + i) );
}
else
{
SelectScreen(1);
SetLine(line);
SetColumn(column - 64 + i);
WriteByte( *(addr + i) );
}
}
}
}
//显示6*6点阵
//lin:行(0-10), column: 列(0-127)
//address : 字模区首地址
void ShowOpposite(uchar line, uchar column, uchar *addr)
{
uchar i = 0;
if (column < 64 ) //如果列数<64则从第一屏上开始写
{
SelectScreen(1);
SetLine(line);
SetColumn(column);
for (i = 0; i < 6; i++)
{
if ((column + i) < 64)
{
WriteByte( ~(*(addr + i)) );
}
else
{
SelectScreen(2);
SetLine(line);
SetColumn(column - 64 + i);
WriteByte( ~(*(addr + i)) );
}
}
}
else //如果列数>64则从第二屏上开始写
{
SelectScreen(2);
SetLine(line);
column = column - 64;
SetColumn(column);
for (i = 0; i < 6; i++)
{
if ((column + i) < 64)
{
WriteByte( ~(*(addr + i)) );
}
else
{
SelectScreen(1);
SetLine(line);
SetColumn(column - 64 + i);
WriteByte( ~(*(addr + i)) );
}
}
}
}
//显示汉字8*8
/*
void ShowChina8(uchar line, uchar column, uchar num)
{
uchar *address;
address = &ChinaCode8[num][0];
Show8x8(line, column, address);
Show8x8(line, column + 8, address + 8);
Show8x8(line + 1, column, address + 16);
Show8x8(line + 1, column + 8, address + 24);
}
*/
//显示汉字6*6
void ShowChina6(uchar line, uchar column, uchar num)
{
uchar *address;
address = &ChinaCode6[num][0];
Show6x6(line, column, address);
Show6x6(line, column + 6, address + 6);
Show6x6(line + 1, column, address + 12);
Show6x6(line + 1, column + 6, address + 18);
}
//显示数字或字母8*8
/*
void ShowNumber8(uchar line, uchar column, uchar num)
{
uchar *address;
address = &NumCode8[num][0];
Show8x8(line, column, address);
Show8x8(line + 1, column, address + 8);
}
*/
//显示数字或字母6*6
void ShowNumber6(uchar line, uchar column, uchar num)
{
uchar *address;
address = &NumCode6[num][0];
Show6x6(line, column, address);
Show6x6(line + 1, column, address + 6);
}
//显示数字或字母12*12
void ShowNumber12(uchar line, uchar column, uchar num)
{
uint highNum = 0;
uint lowNum = 0;
uchar *Addr;
if (num < 10)
{
highNum = 11;
lowNum = num;
Addr = &NumCode6[lowNum][0];
Show6x6(line, column + 6, Addr);
Show6x6(line + 1, column + 6, Addr + 6);
}
else
{
highNum = num / 10;
lowNum = num % 10;
Addr = &NumCode6[highNum][0];
Show6x6(line, column, Addr);
Show6x6(line + 1, column, Addr + 6);
Addr = &NumCode6[lowNum][0];
Show6x6(line, column + 6, Addr);
Show6x6(line + 1, column + 6, Addr + 6);
}
}
//显示反色数字12*12
void ShowOppositeNumber(uchar line, uchar column, uchar num)
{
uchar *Addr;
uint highNum = 0;
uint lowNum = 0;
if (num < 10)
{
highNum = 11;
lowNum = num;
Addr = &NumCode6[lowNum][0];
ShowOpposite(line, column + 6, Addr);
ShowOpposite(line + 1, column + 6, Addr + 6);
}
else
{
highNum = num / 10;
lowNum = num % 10;
Addr = &NumCode6[highNum][0];
ShowOpposite(line, column, Addr);
ShowOpposite(line + 1, column, Addr + 6);
Addr = &NumCode6[lowNum][0];
ShowOpposite(line, column + 6, Addr);
ShowOpposite(line + 1, column + 6, Addr + 6);
}
}
//清屏固定区域
void ClearScreenSome()
{
uchar i = 0;
uchar j = 0;
uchar *address;
address = &SpaceCode[0];
for (i = 3; i < 7; i++)
{
for (j = 0; j < 128; j++)
{
Show6x6(i, j, address);
}
}
}
//清全屏
void ClearScreenAll()
{
uchar i = 0;
uchar j = 0;
uchar *address;
address = &SpaceCode[0];
for (i = 0; i < 8; i++)
{
for (j = 0; j < 128; j++)
{
Show6x6(i, j, address);
}
}
}
//显示线条
void ShowLine(uchar line)
{
uchar i = 0;
uchar *address;
address = &LineCode[0];
for (i = 0; i < 128; i++)
{
Show6x6(line, i, address);
}
}
//显示系统时间
void ShowSysDay()
{
uchar highYear = 0;
uchar lowYear = 0;
highYear = currentYear / 100;
lowYear = currentYear % 100;
ShowNumber12(3, 12 + 10 , highYear);
if (lowYear < 10)
{
ShowNumber6(3, 24 + 10, 0);
ShowNumber6(3, 30 + 10, lowYear);
}
else
{
ShowNumber12(3, 12 * 2 + 10, lowYear);
}
ShowChina6(3, 12 * 3 + 10, 8);
ShowNumber12(3, 12 * 4 + 10, currentMonth);
ShowChina6(3, 12 * 5 + 10, 9);
ShowNumber12(3, 12 * 6 + 10, currentDay);
ShowChina6(3, 12 * 7 + 10, 10);
delay(2000);
ClearScreenAll();
}
//显示日历
void ShowCalendar(uint year, uchar month, uchar day)
{
uchar i = 0;
uchar j = 0;
uchar m = 0;
uchar line = 0;
uchar column = 0;
uchar outDay = 1; // 输出日期
uchar leapFlag = 0; // 是否闰年标志位
uchar dayLastMon = 0; // 本月第一个星期中在上月的天数
uchar week = 0; // 周
uchar a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; // 每月天数数组
ShowSysDay();
for (m = 0; m < 7; m++)
{
ShowChina6(0, (19 * m), m);
}
ShowLine(2);
ShowLine(7);
leapFlag = isLeapyear( year ); // 判断给定年份是否闰年
if ( leapFlag == 1 ) // 如果是闰年,2月为29天
{
a[2]++;
}
if(day > a[month])
{
year = currentYear;
month = currentMonth;
day = currentDay;
}
dayLastMon = GetWeek(year, month, 1);
for (outDay = 1; outDay <= a[month]; outDay++)
{
if (outDay == day)
{
ShowOppositeNumber(2 * (j + 1) + 1, (dayLastMon + i) * 19, outDay);
}
else
{
ShowNumber12(2 * (j + 1) + 1, (dayLastMon + i) * 19 , outDay);
}
week = GetWeek(year, month, outDay);
i++;
if (week == 6)
{
i = 0;
j++;
if (j == 2)
{
delay(2000);
ClearScreenSome();
j = 0;
}
dayLastMon = 0;
}
}
delay(2000);
ClearScreenAll();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -