?? 340_lcd.c
字號:
/******************************************************************************
由于LV595芯片片選引腳與以太網(wǎng)控制芯片CP2200中斷引腳復用因些在此例程中加入了將
CP2200芯片中斷關(guān)閉的代碼。還要在建立工程文件時將CP220X_REG.C文件包含到工程中.
******************************************************************************/
#include "C8051F340.h"
#include <intrins.h>
#include "cp220x_reg.h"
#define uchar unsigned char
#define uint unsigned int
#define BASE_ADDRESS 0x10
#define EMIF_TIMING 0x9E
//sbit spi_mosi=P0^0;
//sbit SPICLK=P0^1;
sbit LcdCs=P0^3;
sbit led=P2^4;
bit SPI_BUSY;
uchar xdata virt_port;
uchar xdata discode;//開關(guān)顯示、光標、閃爍的命令字暫存單元
uint Count1ms;
signed char xdata tab1[16]={0x20,0x20,0x42,0x54,0x20,0x46,0x33,0x34,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};
void delay(uint timer);
void writelcd(uchar spi_data);
void writecode(uchar ins);
void writedata(uchar d);
void lcdinit();
void lcdchar (void);
void lcdaddr(uchar DDRAM);
void cursoropen(uchar position);//開光標,關(guān)閃爍
void displayopen(void); //開顯示,光標、閃爍不變
void ether_reset_low();
void ether_reset_high (void);
void Delay1ms(uint T);
void EMIF_Init (void);
uint da;
void delay1us(void)
{
uchar xdata i;
for(i=10;i>0;i--);
}
void SPI_Init()
{
SPI0CFG = 0x70;
SPI0CN = 0x01;
SPI0CKR = 0x3B;
}
void writelcd(uchar spi_data) //向LV595寫數(shù)據(jù)以SPI方式
{
uint xdata i,j;
for(i=0;i<3;i++)
LcdCs=0;
SPI_BUSY=1;
delay1us();
SPI0DAT=spi_data;
for(j=0;j<500;j++)
{
if(!SPI_BUSY)break;
}
delay1us();
LcdCs=1;
delay1us();
delay1us();
delay1us();
delay1us();
delay1us();
delay1us();
delay1us();
for(j=0;j<5000;j++);
}
void writecode(uchar ins) //向液晶控制模塊寫命令
{
uchar xdata t;
uint xdata j;
for(j=0;j<500;j++);
virt_port|=ins&0xf0; //取高字節(jié)向1602寫數(shù)據(jù)
writelcd(virt_port); //先寫高4位后再寫低4位 這是在選擇四個數(shù)據(jù)線的時候
virt_port|=0x08;
writelcd(virt_port); //使能E腳為高電平
virt_port&=~0x08;
writelcd(virt_port); //使能E腳為低電平
t=ins<<4;
virt_port|=t&0xf0; //取低字節(jié)向1602寫數(shù)據(jù)
writelcd(virt_port);
virt_port|=0x08; //使能E腳為高電平
writelcd(virt_port);
virt_port&=~0x08; //使能E腳為低電平
writelcd(virt_port);
virt_port=0;
writelcd(virt_port);
}
void writedata(uchar d) //寫數(shù)據(jù)到1602
{
uchar xdata i,t;
uint xdata j;
for(j=0;j<500;j++);
virt_port|=0x02; //光標返回指令
writelcd(virt_port);
virt_port|=d&0xf0; //取高字節(jié)數(shù)據(jù)給數(shù)據(jù)寄存器
writelcd(virt_port);
virt_port|=0x08; //使能E腳為高電平
writelcd(virt_port);
virt_port&=0xf7; //使能E腳為低電平
writelcd(virt_port);
virt_port&=0x07; //設(shè)置光標右移,文字也右移
writelcd(virt_port);
t=d&0x0f;
virt_port|=t<<4; //取低字節(jié)數(shù)據(jù)給數(shù)據(jù)寄存器
writelcd(virt_port);
virt_port|=0x08; //使能E腳為高電平
writelcd(virt_port);
for(i=3;i>0;i--);
virt_port&=0xf7; //使能E腳為低電平
writelcd(virt_port);
virt_port=0; //數(shù)據(jù)清零
writelcd(virt_port);
}
void lcdchar (void)
{
uint xdata i,j,k;
for(j=0;j<5000;j++); //數(shù)據(jù)讀、寫操作,畫面不動
for(k=0;k<5000;k++);
for(i=0;i<16;i++){
writedata(tab1[i]);
for(j=0;j<1000;j++);
for(k=0;k<1000;k++);
for(k=0;k<5000;k++);
for(k=0;k<1000;k++);
}
writecode(0xb0); //換行指令
for(j=0;j<5000;j++);
for(k=0;k<5000;k++);
discode=0xb0;
for(i=0;i<16;i++){
writedata(Netdata[i]);
for(j=0;j<5000;j++);
for(k=0;k<5000;k++);
for(k=0;k<5000;k++);
};
}
void lcdinit()
{
uint xdata i;
virt_port=0x00;
writelcd(virt_port); //RS腳為零寫指令寄存器 RW為低電平
virt_port|=0x08; //使能腳E=1
writelcd(virt_port);
virt_port&=0xf7; //使E=0使能腳發(fā)生跳變高--低
writelcd(virt_port);
for(i=1000;i>0;i--); //3次延時,重要!
for(i=8000;i>0;i--); //用延時代替查詢
virt_port=0; //寫入20碼,設(shè)置為4位總線方式,非常重要!?。。?!
writelcd(virt_port);
virt_port|=0x20; //只寫高字節(jié)
writelcd(virt_port);
virt_port|=0x08; //E=1
writelcd(virt_port);
for(i=20;i>0;i--); //使命令執(zhí)行
virt_port&=0xf7; //E=0
writelcd(virt_port);
for(i=10;i>0;i--);
virt_port=0;
writelcd(virt_port);
writecode(0x38); //設(shè)兩行顯示,4線方式5*10字符顯示
for(i=50;i>0;i--);
writecode(0x06); //光標右移
for(i=50;i>0;i--);
writecode(0x0c); //開顯示指令
for(i=50;i>0;i--);
writecode(0x02); //光標返回指令
for(i=50;i>0;i--);
writecode(0x01); //清屏指令
for(i=50;i>0;i--);
}
void port_init()
{
P0MDOUT=0xff;
XBR0 = 0x02;
XBR1 = 0x40;
P1MDOUT |= 0xD8; // /WR and /RD are push-pull P2MDOUT |= 0xFF; P3MDOUT |= 0xFF; P4MDOUT |= 0xFF;
}
void main(void)
{
uint j;
PCA0MD &= ~0x40; //關(guān)閉看門狗定時器
OSCICN |= 0x03; //內(nèi)部高頻振蕩器12M晶振做為系統(tǒng)時鐘
port_init(); //端口初始化
EMIF_Init ();
ether_reset_low();
for(j=0;j<5000;j++);
ether_reset_high ();
INT0EN = 0x00;
INT1EN = 0x00;
SPI_Init();
IE = 0x40;
EA=1;
while(1)
{
lcdinit(); //液晶初始化
lcdchar();
}
}
void spi_isr(void) interrupt 6
{
if(SPIF)
{
SPIF=0;
SPI_BUSY=0;
}
if(WCOL)
{
WCOL=0;
}
}
void ether_reset_low(){ P1 &= ~0x01; // Pull reset low}void ether_reset_high (void){ P1 |= 0x01; // Allow /RST to rise while(!(P1 & 0x01)); // Wait for /RST to go high}
void EMIF_Init (void){ EMI0CF = 0x1B; // non-muxed mode; split mode // with bank select EMI0TC = EMIF_TIMING; // This constant may be modified // according to SYSCLK to meet the // timing requirements for the CP2200 EMI0CN = BASE_ADDRESS; // Page of XRAM accessed by EMIF}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -