📄 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 YJ_Init(void);
void writelcd(uchar disdata);
void SPI0_Init (void);
void PORT_Init (void);
unsigned char xdata discode; //开关显示、光标、闪烁的命令字暂存单元
unsigned long x;
unsigned char virt_port;
sbit LCDCS = P3^3;
//sbit YJDAT = P2^6;
//sbit YJCLK = P2^7;
//sbit LCDRS = P3^3;
//sbit LCDE = P3^4;
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void key (void) {
PCA0MD &= ~0x40; // WDTE = 0 (watchdog timer enable bit)
OSCICN |= 0x03; // Set internal oscillator to highest
// setting (24500000)
PORT_Init (); // initialize crossbar and GPIO
SPI0_Init ();
YJ_Init();
while (1) {
}
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports
//
void PORT_Init (void)
{
P0SKIP = 0xFE;
P1SKIP = 0x7F;
XBR0 = 0x02; // Enable SMBus pins
XBR1 = 0x40; // Enable crossbar and weak pull-ups
P0MDOUT = 0xFF; // All P0 pins open-drain output
P2MDOUT = 0xFF;
P3MDOUT |= 0x04; // P3.3 push-pull output
}
//-----------------------------------------------------------------------------
//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 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -