📄 lcd1602a.c
字号:
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <c8051f310.h> // SFR declarations
#include <INTRINS.H>
#include <stdio.h>
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define uchar unsigned char
#define uint unsigned int
#define SYSCLK 24500000 // SYSCLK frequency in Hz
//----------------------------------------------------------------------------
void Write_COM(uchar ins);
void Write_CHAR(uchar d);
//void lcdchar (uchar ch);
//void lcdaddr(uchar DDRAM);
//void cursoropen(uchar position); //开光标,关闪烁
//void flickeropen(uchar position); //开光标、开闪烁
//void cursorclose(void); //关光标、关闪烁
void YJ_Init(void);
void writelcd(uchar disdata);
void SPI0_Init (void);
void PORT1_Init (void);
unsigned char xdata discode; //开关显示、光标、闪烁的命令字暂存单元
unsigned long x;
unsigned char virt_port;
unsigned char xdata tab1[16] ={0x20,0x20,0x42,0x54,0x20,0x46,0x33,0x31,0x30,0x20,0x56,0x31,0x2e,0x30
,0x20,0x20};
unsigned char xdata Netdata[16]={0x77,0x77,0x77,0x2e,0x78,0x68,0x6c,0x2e,0x63,0x6f,
0x6d,0x2e,0x63,0x6e,0x20,0x20};
sbit LCDCS = P3^3;
//-----------------------------------------------------------------------------
//SPI_INIT
//-----------------------------------------------------------------------------
void SPI0_Init (void)
{
SPI0CFG = 0x70; // data sampled on 1st SCK rising edge
// 8-bit data words
SPI0CN = 0x09; // Master mode; SPI enabled; flags
// cleared
SPI0CKR = 0x03;//SYSCLK/2/3000000-1;// SPI clock <= 8MHz (limited by
// EEPROM spec.)
}
//-----------------------------------------------------------------------------
//write com
//-----------------------------------------------------------------------------
void Write_COM(uchar ins)
{
uchar xdata i,t;
uint xdata j;
for(j=0;j<500;j++); //用延时代替查询
virt_port|=ins&0xf0;
writelcd(virt_port);
//LCDE=1;
virt_port|=0x08;
writelcd(virt_port);
for(i=3;i>0;i--);
//LCDE=0;
virt_port&=~0x08;
writelcd(virt_port);
virt_port&=0x07;
writelcd(virt_port);
t=ins<<4;
virt_port|=t&0xf0;
writelcd(virt_port);
//LCDE=1;
virt_port|=0x08;
writelcd(virt_port);
for(i=3;i>0;i--);
//LCDE=0;
virt_port&=~0x08;
writelcd(virt_port);
virt_port=0;
writelcd(virt_port);
}
//----------------------------------------------------------------------------------
//write data
//----------------------------------------------------------------------------------
void Write_CHAR(uchar d)
{
uchar xdata i,t;
uint xdata j;
for(j=0;j<500;j++); //用延时代替查询
virt_port|=0x02;
writelcd(virt_port);
virt_port|=d&0xf0;
writelcd(virt_port);
virt_port|=0x08;//E=1
writelcd(virt_port);
for(i=3;i>0;i--);
virt_port&=0xf7; //E=0
writelcd(virt_port);
virt_port&=0x07;
writelcd(virt_port);
t=d&0x0f;
virt_port|=t<<4;
writelcd(virt_port);
virt_port|=0x08; //E=1
writelcd(virt_port);
for(i=3;i>0;i--);
virt_port&=0xf7; //E=0
writelcd(virt_port);
virt_port=0;
writelcd(virt_port);
}
/*
//---------------------------------------------------------------------------------------
void lcdaddr(uchar DDRAM)
{
if (DDRAM<=16)
{
Write_COM(0x80+DDRAM-1);
}
else
{
Write_COM(0x80+DDRAM+0x2f);
}
}
//---------------------------------------------------------------------------------------
void cursoropen(uchar position)//开光标,关闪烁
{
lcdaddr(position);
discode|=0x02;
discode&=~0x01;
Write_COM(discode);
}
//----------------------------------------------------------------------------------------
void flickeropen(uchar position)//开光标、开闪烁
{
//lcdaddr(position);
//Write_COM(0x0f);
lcdaddr(position);
discode|=0x02;
discode|=0x01;
Write_COM(discode);
}
//-----------------------------------------------------------------------------------------
void cursorclose(void) //关光标、关闪烁
{
//Write_COM(0x0c);
discode&=~0x02;
discode&=~0x01;
Write_COM(discode);
}
*/
//------------------------------------------------------------------------------------------
void YJ_Init(void)
{
uint xdata i;
virt_port=0;
writelcd(virt_port);
virt_port|=0x08; //E=1,第一步
writelcd(virt_port);
virt_port|=0x30;
writelcd(virt_port);
for(i=20;i>0;i--);
virt_port&=0xf7; //E=0
writelcd(virt_port);
virt_port=0;
writelcd(virt_port);
for(i=20000;i>0;i--);
for(i=20000;i>0;i--);
virt_port|=0x08; //E=1,第二步
writelcd(virt_port);
virt_port|=0x30;
writelcd(virt_port);
for(i=20;i>0;i--);
virt_port&=0xf7; //E=0
writelcd(virt_port);
virt_port=0;
writelcd(virt_port);
for(i=1000;i>0;i--);
virt_port|=0x08; //E=1,第三步
writelcd(virt_port);
virt_port|=0x30;
writelcd(virt_port);
for(i=20;i>0;i--);
virt_port&=0xf7; //E=0
writelcd(virt_port);
virt_port=0;
writelcd(virt_port);
for(i=1000;i>0;i--); //3次延时,重要!
for(i=8000;i>0;i--); //用延时代替查询
virt_port=0; //第五步,写入20码,设置为4位总线方式,非常重要!!!!!
writelcd(virt_port);
virt_port|=0x20; //只写高字节
writelcd(virt_port);
virt_port|=0x08; //E=1
writelcd(virt_port);
for(i=20;i>0;i--);
virt_port&=0xf7; //E=0
writelcd(virt_port);
for(i=10;i>0;i--);
virt_port=0;
writelcd(virt_port);
Write_COM(0x28); //第六步。。。。
for(i=50;i>0;i--);
Write_COM(0x01);
for(i=50;i>0;i--);
Write_COM(0x0e);
for(i=50;i>0;i--);
Write_COM(0x06);
for(i=50;i>0;i--);
}
//-----------------------------------------------------
void writelcd(uchar disdata) //write 595
{
uint xdata i;
for(i=0;i<3;i++);
LCDCS=1;
SPIF = 0;
for(x=0;x<50;x++);
SPI0DAT=disdata;
while (SPIF == 0); // 等待写结束
for(x=0;x<500;x++);
LCDCS=0;
for(x=0;x<500;x++);
}
//----------------------------------------------------------
//end of file
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -