📄 lcd1286418.c
字号:
/***********************************************************************************************
* FILE NAME: lcd1286418.c
* PURPOSE: lcd1286418 drive Firmware
* DESCRIPTION: KS0108
* DEVELOPMENT HISTORY:
* Date Author Release Description Of Change
* -------- ------------ --------- ------------------------------------------------
* 08-04-11 XuGuohong 1.0 Testing Edition
/**********************************************************************************************/
/* Include Global Parameters */
#include <iom128v.h>
#include "avr.h"
/* LCD PORTING ON ATMEGA128 */
/* D0---D7 */
#define LCDPORTDATA PORTF
#define LCDDDRDATA DDRF
#define LCDPINDATA PINF
/* CS1 */
#define LCDPORTCS1 PORTE
#define LCDDDRCS1 DDRE
#define LCDCS1 PE2
/* CS2 */
#define LCDPORTCS2 PORTE
#define LCDDDRCS2 DDRE
#define LCDCS2 PE3
/* RW */
#define LCDPORTRW PORTE
#define LCDDDRRW DDRE
#define LCDRW PE4
/* RS */
#define LCDPORTRS PORTB
#define LCDDDRRS DDRB
#define LCDRS PB2
/* E */
#define LCDPORTEN PORTB
#define LCDDDREN DDRB
#define LCDEN PB3
/* Include Global Parameters */
unsigned char displaybuffer[8][128];
/* Declare Prototypes */
void LcdInit(void);
void LcdWrCmd(unsigned char,unsigned char);
void LcdWrDat(unsigned char,unsigned char);
unsigned char LcdRdSta(unsigned char);
unsigned char LcdRdDat(unsigned char);
unsigned char LcdBusy(void);
void LcdClr(void);
void LcdDisplaySeg(unsigned char,unsigned char,unsigned char);
void LcdDisplayDot(unsigned char,unsigned char,unsigned char);
void LcdDsiplayRefresh(void);
void Delay1ms(void);
/*****************************************
* FUNCTION NAME: LcdInit
* DESCRIPTION: LCD Initialization
/*****************************************/
void LcdInit(void)
{
/* Ports Initialization */
SetBit(LCDPORTCS1,LCDCS1);
SetBit(LCDPORTCS2,LCDCS2);
ClrBit(LCDPORTEN,LCDEN);
SetOutput(LCDDDRRS,LCDRS);
SetOutput(LCDDDRRW,LCDRW);
SetOutput(LCDDDRCS1,LCDCS1);
SetOutput(LCDDDRCS2,LCDCS2);
SetOutput(LCDDDREN,LCDEN);
Delay1ms();
/* Lcd Clear */
LcdClr();
}
/*****************************************
* FUNCTION NAME: LcdWrCmd
* DESCRIPTION: Write Command To LCD
* chiplr = "L" or "R"
* chiplr = " B "同时选中
/*****************************************/
void LcdWrCmd(unsigned char chiplr,unsigned char data)
{
while(LcdBusy() == 0) /* IF LCD BUSY,WAIT... */
;
ClrBit(LCDPORTRS,LCDRS); /* RS = 0 ,COMMAND */
ClrBit(LCDPORTRW,LCDRW); /* RW = 0 ,WRITE */
if(chiplr == 'L') /* CS = 0 ,CHIP SELECT */
ClrBit(LCDPORTCS1,LCDCS1);
else if(chiplr == 'R')
ClrBit(LCDPORTCS2,LCDCS2);
else
{
ClrBit(LCDPORTCS1,LCDCS1);
ClrBit(LCDPORTCS2,LCDCS2);
}
NOP; /* DELAY AT LEAS;T 140ns */
NOP;
SetBit(LCDPORTEN,LCDEN); /* EN = 1 */
NOP; /* DELAY AT LEAST 450ns */
NOP;
NOP;
NOP;
NOP;
LCDDDRDATA = 0XFF; /* WRITE DATA TO LCD */
LCDPORTDATA = data;
ClrBit(LCDPORTEN,LCDEN); /* EN = 0 */
NOP; /* DELAY AT LEAST 10ns */
SetBit(LCDPORTCS1,LCDCS1); /* CHIP DISABLE */
SetBit(LCDPORTCS2,LCDCS2);
NOP;
}
/*****************************************
* FUNCTION NAME: LcdWrDat
* DESCRIPTION: Write Data To LCD
* chiplr = "L" or "R"
/*****************************************/
void LcdWrDat(unsigned char chiplr,unsigned char data)
{
while(LcdBusy() == 0) /* IF LCD BUSY,WAIT... */
;
SetBit(LCDPORTRS,LCDRS); /* RS = 0 ,COMMAND */
ClrBit(LCDPORTRW,LCDRW); /* RW = 0 ,WRITE */
if(chiplr == 'L') /* CS = 0 ,CHIP SELECT */
ClrBit(LCDPORTCS1,LCDCS1);
else if(chiplr == 'R')
ClrBit(LCDPORTCS2,LCDCS2);
else
{
ClrBit(LCDPORTCS1,LCDCS1);
ClrBit(LCDPORTCS2,LCDCS2);
}
NOP; /* DELAY AT LEAST 140ns */
NOP;
SetBit(LCDPORTEN,LCDEN); /* EN = 1 */
NOP; /* DELAY AT LEAST 450ns */
NOP;
NOP;
NOP;
NOP;
LCDDDRDATA = 0XFF; /* WRITE DATA TO LCD */
LCDPORTDATA = data;
ClrBit(LCDPORTEN,LCDEN); /* EN = 0 */
NOP; /* DELAY AT LEAST 10ns */
SetBit(LCDPORTCS1,LCDCS1); /* CHIP DISABLE */
SetBit(LCDPORTCS2,LCDCS2);
NOP;
}
/*****************************************
* FUNCTION NAME: LcdRdSta
* DESCRIPTION: Read Status From LCD
/*****************************************/
unsigned char LcdRdSta(unsigned char chiplr)
{
unsigned char temp;
ClrBit(LCDPORTRS,LCDRS); /* RS = 0 ,COMMAND */
SetBit(LCDPORTRW,LCDRW); /* RW = 1 ,READ */
if(chiplr == 'L') /* CS = 0 ,CHIP SELECT */
ClrBit(LCDPORTCS1,LCDCS1);
else if(chiplr == 'R')
ClrBit(LCDPORTCS2,LCDCS2);
else
{
ClrBit(LCDPORTCS1,LCDCS1);
ClrBit(LCDPORTCS2,LCDCS2);
}
NOP; /* DELAY AT LEAS;T 140ns */
NOP;
SetBit(LCDPORTEN,LCDEN); /* EN = 1 */
NOP; /* DELAY AT LEAST 450ns */
NOP;
NOP;
NOP;
NOP;
LCDDDRDATA = 0X00; /* READ DATA FROM LCD */
temp = LCDPINDATA;
ClrBit(LCDPORTEN,LCDEN); /* EN = 0 */
NOP; /* DELAY AT LEAST 10ns */
SetBit(LCDPORTCS1,LCDCS1); /* CHIP DISABLE */
SetBit(LCDPORTCS2,LCDCS2);
NOP;
return temp;
}
/*****************************************
* FUNCTION NAME: LcdRdDat
* DESCRIPTION: Read Data From LCD
/*****************************************/
unsigned char LcdRdDat(unsigned char chiplr)
{
unsigned char temp;
while(LcdBusy() == 0) /* IF LCD BUSY,WAIT... */
;
SetBit(LCDPORTRS,LCDRS); /* RS = 1 ,DATA */
SetBit(LCDPORTRW,LCDRW); /* RW = 1 ,READ */
if(chiplr == 'L') /* CS = 0 ,CHIP SELECT */
ClrBit(LCDPORTCS1,LCDCS1);
else if(chiplr == 'R')
ClrBit(LCDPORTCS2,LCDCS2);
else
{
ClrBit(LCDPORTCS1,LCDCS1);
ClrBit(LCDPORTCS2,LCDCS2);
}
NOP; /* DELAY AT LEAS;T 140ns */
NOP;
SetBit(LCDPORTEN,LCDEN); /* EN = 1 */
NOP; /* DELAY AT LEAST 450ns */
NOP;
NOP;
NOP;
NOP;
LCDDDRDATA = 0X00; /* READ DATA FROM LCD */
temp = LCDPINDATA;
ClrBit(LCDPORTEN,LCDEN); /* EN = 0 */
NOP; /* DELAY AT LEAST 10ns */
SetBit(LCDPORTCS1,LCDCS1); /* CHIP DISABLE */
SetBit(LCDPORTCS2,LCDCS2);
NOP;
return temp;
}
/*****************************************
* FUNCTION NAME: LcdBusy
* DESCRIPTION: LCD BUSY OR NOT
* BUSY-RETURN 0
* NOT BUSY-RETURN 1
/*****************************************/
unsigned char LcdBusy(void)
{
unsigned char temp1,temp2;
temp1 = LcdRdSta('L'); /* READ LCD STA. */
temp1 = temp1&0X80;
temp2 = LcdRdSta('R');
temp2 = temp2&0X80;
if(temp1|temp2)
return 0;
else
return 1;
}
/*****************************************
* FUNCTION NAME: LcdClr
* DESCRIPTION: CLEAR LCD
/*****************************************/
void LcdClr(void)
{
unsigned char count;
unsigned char temp;
/* CLEAR LEFT&RIGHT SCREEN */
LcdWrCmd('B',0X3E); /* LCD OFF */
LcdWrCmd('B',0XC0); /* SET ROW */
for(count=0; count<8; count++)
{
LcdWrCmd('B',0XB8+count); /* SET PAGE */
LcdWrCmd('B',0X40); /* SET Y */
for(temp=0; temp<64; temp++)
{
LcdWrDat('B',0X00);
}
}
LcdWrCmd('B',0X3F); /* LCD ON */
}
/*****************************************
* FUNCTION NAME: LcdDisplaySeg
* DESCRIPTION: DISPLAY 8-BIT SEGMENT
* <---------offset 0 to 127----------->
* page0
* |
* page7
* <---------offset 0 to 127----------->
/*****************************************/
void LcdDisplaySeg(unsigned char page,unsigned char offset,unsigned char data)
{
/* Display at Left Part */
if(offset < 64)
{
//LcdWrCmd('L',0X3F); /* LCD ON */
LcdWrCmd('L',0XC0); /* SET ROW */
LcdWrCmd('L',0XB8+page); /* SET PAGE */
LcdWrCmd('L',0X40+offset); /* SET Y */
LcdWrDat('L',data); /* WRITE SEGMENT */
}
else
{
LcdWrCmd('R',0X3F); /* LCD ON */
LcdWrCmd('R',0XC0); /* SET ROW */
LcdWrCmd('R',0XB8+page); /* SET PAGE */
LcdWrCmd('R',0X40+offset-64); /* SET Y */
LcdWrDat('R',data); /* WRITE SEGMENT */
}
}
/************************************************
* FUNCTION NAME: LcdDisplayDot
* DESCRIPTION: DISPLAY 1-BIT DOT
* 不在单片机里面开设缓存,直接修改LCD的RAM后显示
* <---------offset 0 to 127----------->
* 0
* |
* 64
* <---------offset 0 to 127----------->
/*************************************************/
void LcdDisplayDot(unsigned char x,unsigned char y,unsigned char data)
{
unsigned char temp1,temp2,a;
if(x>127 | y>63)
return;
temp1 = y / 8; /* GET VALUE OF WHICH PAGE */
temp2 = y % 8; /* GET VALUE OF WHICH Y-OFFSET */
/* IN ORDER TO NOT MODFIY NOW DISPLY VALUE */
if(x < 64) /* GET PRE. SEGMENT VALUE */
{
LcdWrCmd('L',0XC0); /* SET ROW */
LcdWrCmd('L',0XB8+temp1); /* SET PAGE */
LcdWrCmd('L',0X40+x); /* SET X */
a = LcdRdDat('L'); /* READ NOW SEGMENT VALUE */
a = LcdRdDat('L');
if(data == 0) /* DOT ON/OFF */
a&=~(1<<temp2);
else
a|=(1<<temp2);
}
else
{
LcdWrCmd('R',0XC0); /* SET ROW */
LcdWrCmd('R',0XB8+temp1); /* SET PAGE */
LcdWrCmd('R',0X40+x-64); /* SET X*/
a = LcdRdDat('R'); /* READ NOW SEGMENT VALUE */
a = LcdRdDat('R');
if(data == 0) /* DOT ON/OFF */
a&=~(1<<temp2);
else
a|=(1<<temp2);
}
if(x < 64) /* WRITE VALUE AS SEGMENT */
{
//LcdWrCmd('L',0X3F); /* LCD ON */
LcdWrCmd('L',0XC0); /* SET ROW */
LcdWrCmd('L',0XB8+temp1); /* SET PAGE */
LcdWrCmd('L',0X40+x); /* SET X */
LcdWrDat('L',a); /* WRITE SEGMENT */
}
else
{
//LcdWrCmd('R',0X3F); /* LCD ON */
LcdWrCmd('R',0XC0); /* SET ROW */
LcdWrCmd('R',0XB8+temp1); /* SET PAGE */
LcdWrCmd('R',0X40+x-64); /* SET X*/
LcdWrDat('R',a); /* WRITE SEGMENT */
}
}
/*******************************************************
* FUNCTION NAME: LcdDsiplayRefresh *
* DESCRIPTION: 显示内容写入单片机RAM中,再LCD上显示 *
* 为了提高3D图形显示速度。
/******************************************************/
void LcdDsiplayRefresh(void)
{
unsigned char temp1,temp2;
for(temp1=0; temp1<8; temp1++)
{
for(temp2=0; temp2<128; temp2++)
{
LcdDisplaySeg(temp1,temp2,displaybuffer[temp1][temp2]);
}
}
}
/****************************************
* FUNCTION NAME: Delay1ms *
* DESCRIPTION: MCU CLOCK=11.0592Mhz *
/***************************************/
void Delay1ms(void)
{
unsigned int temp;
unsigned char i;
for(i=0;i<10;i++)
{
for(temp=20; temp>0;temp--) /* Delay About 1ms */
{
NOP;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -