📄 lcd1602a.c
字号:
//----------------------------------------------------------------------------
//1602A LCD显示程序,运行程序LCD显示"BT F320 V1.0"
//SPI接口方式的NLSF595并行输出控制LCD
//短接J7的1,2引脚,打开LCD背光
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <c8051f310.h> // SFR declarations
#include <INTRINS.H>
#include <stdio.h>
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define uchar unsigned char
#define uint unsigned int
#define SYSCLK 120000000 // 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 PORT_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,0x32,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 = P2^4;
sbit LCDCTRL = P2^5;
//sbit YJDAT = P2^6;
//sbit YJCLK = P2^7;
//sbit LCDRS = P3^3;
//sbit LCDE = P3^4;
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void) {
int i,j;
long k;
PCA0MD &= ~0x40; // WDTE = 0 (watchdog timer enable bit)
OSCICN = 0x83; // Set internal oscillator to highest
// setting (24500000)
PORT_Init (); // initialize crossbar and GPIO
SPI0_Init ();
YJ_Init();
while (1) {
for(i=0;i<16;i++){
Write_CHAR(tab1[i]);
for(k=0;k<5000;k++);}
Write_COM(0xc0);
for(k=0;k<5000;k++);
for(i=0;i<16;i++){
Write_CHAR(Netdata[i]);
for(k=0;k<5000;k++);}
YJ_Init();
}
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports
//
void PORT_Init (void)
{
P0SKIP = 0xFC;;
XBR0 = 0x02; // Enable SMBus pins
XBR1 = 0x40; // Enable crossbar and weak pull-ups
P0MDOUT = 0xFF; // All P0 pins open-drain output
P1MDOUT = 0xFF;
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 = 0x01;//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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -