📄 lcd.c
字号:
/**********************************************************************
LCD.C file
类型定义
作者:
建立日期:
修改日期:
版本:V1.0
版权所有,盗版必究。
Copyright(C)
All rights reserved
**********************************************************************/
#include <reg51.h>
#include <lcd.h>
#include <HzCode.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD12864DataPort P1
/******************************LCD I/O define*************************/
sbit DI=P2^0; //data or command select
sbit RW=P2^2; //read or write select
sbit EN=P2^1 ; //enable read or write
sbit CS1=P2^3 ; // 0
sbit CS2=P2^4; // 0
/*******************************函数*********************************/
void nop()
{
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}
/******************************************************************/
void CheckState(void)
{
// uchar dat;
DI=0;
RW=1;
/*do{
P1=0xFF;
EN=1;
dat=P1;
EN=0;
dat=dat&0x80; //status read DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 DB7=0时表示已经准备好
}while(dat); */ // busy 0 on/off Rest 0 0 0 0
}
/******************************************************************/
void WriteByte(uchar dat)
{
CheckState();
DI=1;
RW=0;
LCD12864DataPort=dat;
EN=1;
EN=0;
}
/*****************************************************************/
void SendComToLcd(uchar command)
{
CheckState();
DI=0;
RW=0;
LCD12864DataPort=command;
EN=1;
EN=0;
}
/****************************************************************/
//设定行地址(页)--X 0-7
void SetLine(uchar line)
{
line=line&0x07;
line=line|0xB8;
SendComToLcd(line);
}
//设定列地址--Y 0-63
void SetColumn(uchar column)
{
column=column&0x3f;
column=column|0x40;
SendComToLcd(column);
}
//设定显示开始行--XX
void SetStartLine(uchar startline)
{
startline=startline|0xC0;
SendComToLcd(startline);
}
//开关显示
void SetOnOFF(uchar OnOff)
{
OnOff=OnOff|0x3E;
SendComToLcd(OnOff);
}
/*******************************************************************/
//选择屏幕
//0 全屏 1 左屏 2 右屏
void SelectScreen(uchar Screen)
{
switch(Screen)
{
case 0:
CS1=0;
nop();
CS1=0;
nop();
break;
case 1:
CS1=1;
nop();
CS2=0;
nop();
break;
case 2:
CS1=0;
nop();
CS2=1;
nop();
break;
default:
break;
}
}
/****************************************************************************/
// clear screen
void ClearScreen(uchar screen)
{
uchar i,j;
SelectScreen(screen);
for(i=0;i<8;i++)
{ SetLine(i);
for(j=0;j<64;j++)
{
WriteByte(0x00);
}
}
}
/***************************************************************************/
//show 8*8
//lin(0--7) col(0--127)
//address 字模首地址
void Show8X8(uchar lin,uchar column,uchar *address)
{
uchar i;
if(column<64)
{
SelectScreen(1);
SetLine(lin);
SetColumn(column);
for(i=0;i<8;i++)
{
if((column+i)<64)
{
WriteByte(*(address+i));
}
else
{
SelectScreen(2);
SetLine(lin);
SetColumn(column-64+i);
WriteByte(*(address+i));
}
}
}
else
{
SelectScreen(2);
column=column-64;
SetLine(lin);
SetColumn(column);
for(i=0;i<8;i++)
{
if(i+column<64)
{
WriteByte(*(address+i));
}
else
{
SelectScreen(1);
SetLine(lin);
SetColumn(column-64+i);
WriteByte(*(address+i));
}
}
}
}
/*******************************************************************************/
//显示数字8*16
//入口参数:lin 行值;column 列值;num 码表中的位置
void ShowNumber(uchar lin,uchar column,uchar num)
{
uchar *address;
address=&NumCode[num][0];
Show8X8(lin,column,address);
Show8X8(lin+1,column,address+8);
}
/******************************************************************************/
//显示汉字16*16
//入口参数:lin 行值;column 列值;num 码表中的位置
void ShowChina(uchar lin,uchar column,uchar num)
{
uchar *address;
address=&HzCode[num][0];
Show8X8(lin,column,address);
Show8X8(lin,column+8,address+8);
Show8X8(lin+1,column,address+16);
Show8X8(lin+1,column+8,address+24);
}
/*****************************************************************************/
void InitLCD()
{
uchar i=2000;
while(i--);
SetOnOFF(1);
ClearScreen(1);
ClearScreen(2);
SetStartLine(0);
}
/*************************************************************************/
void r_show8x8(uchar lin,uchar column,uchar *address)
{
uchar i,r_data;
if(column<64)
{
SelectScreen(1); //如果列数<64则从第一屏上开始写
SetLine(lin);
SetColumn(column);
for(i=0;i<8;i++)
{
if(column+i<64)
{
r_data = ~(*(address+i));
WriteByte(r_data);
}
else
{
SelectScreen(2);
SetLine(lin);
SetColumn(column-64+i);
r_data = ~(*(address+i));
WriteByte(r_data);
}
}
}
else
{
SelectScreen(2); //否则从第二屏上开始写
column-=64; //防止越界
SetLine(lin);
SetColumn(column);
for(i=0;i<8;i++)
{
if(column+i<64)
{
r_data = ~(*(address+i));
WriteByte(r_data);
}
else
{
SelectScreen(1);
SetLine(lin);
SetColumn(column-64+i);
r_data = ~(*(address+i));
WriteByte(r_data);
}
}
}
}
/**************************************************************************/
void r_ShowNumber(uchar lin,uchar column,uchar num)
{
uchar *address;
address=&NumCode[num][0];
r_show8x8(lin,column,address);
r_show8x8(lin+1,column,address+8);
}
void r_ShowChina(uchar lin,uchar column,uchar num)
{
uchar *address;
address=&HzCode[num][0];
r_show8x8(lin,column,address);
r_show8x8(lin,column+8,address+8);
r_show8x8(lin+1,column,address+16);
r_show8x8(lin+1,column+8,address+24);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -