📄 lcd_library.c
字号:
#include <atmel/AT89X51.H>
#include <math.h>
#include "LCD_Library.h"
#include "stdlib.h"
#include "STDARG.H"
sbit SCLK = P1^3;
sbit LCD_A0 = P1^6;
sbit LCD_RST = P1^7;
sbit LCD_CS = P1^5;
sbit LCD_MOSI = P1^2;
typedef unsigned char Bool;
typedef unsigned char U8 ;
typedef unsigned short U16;
typedef unsigned long U32;
typedef signed char S8 ;
typedef signed short S16;
typedef signed long S32;
//Plot Buffer
#ifndef TRUE
#define TRUE 1
#endif
#define DATA_BUF_LEN 100
#ifndef FALSE
#define FALSE 0
#endif
//ASCII Table
static const char LCD_Table[480] = { 0x00,0x00,0x00,0x00,0x00, // 20 space
0x00,0x00,0x5f,0x00,0x00, // 21 !
0x00,0x07,0x00,0x07,0x00, // 22 "
0x14,0x7f,0x14,0x7f,0x14, // 23 #
0x24,0x2a,0x7f,0x2a,0x12, // 24 $
0x23,0x13,0x08,0x64,0x62, // 25 %
0x36,0x49,0x55,0x22,0x50, // 26 &
0x00,0x05,0x03,0x00,0x00, // 27 '
0x00,0x1c,0x22,0x41,0x00, // 28 (
0x00,0x41,0x22,0x1c,0x00, // 29 )
0x14,0x08,0x3e,0x08,0x14, // 2a *
0x08,0x08,0x3e,0x08,0x08, // 2b +
0x00,0x50,0x30,0x00,0x00, // 2c ,
0x08,0x08,0x08,0x08,0x08, // 2d -
0x00,0x60,0x60,0x00,0x00, // 2e .
0x20,0x10,0x08,0x04,0x02, // 2f /
0x3e,0x51,0x49,0x45,0x3e, // 30 0
0x00,0x42,0x7f,0x40,0x00, // 31 1
0x42,0x61,0x51,0x49,0x46, // 32 2
0x21,0x41,0x45,0x4b,0x31, // 33 3
0x18,0x14,0x12,0x7f,0x10, // 34 4
0x27,0x45,0x45,0x45,0x39, // 35 5
0x3c,0x4a,0x49,0x49,0x30, // 36 6
0x01,0x71,0x09,0x05,0x03, // 37 7
0x36,0x49,0x49,0x49,0x36, // 38 8
0x06,0x49,0x49,0x29,0x1e, // 39 9
0x00,0x36,0x36,0x00,0x00, // 3a :
0x00,0x56,0x36,0x00,0x00, // 3b ;
0x08,0x14,0x22,0x41,0x00, // 3c <
0x14,0x14,0x14,0x14,0x14, // 3d =
0x00,0x41,0x22,0x14,0x08, // 3e >
0x02,0x01,0x51,0x09,0x06, // 3f ?
0x32,0x49,0x79,0x41,0x3e, // 40 @
0x7e,0x11,0x11,0x11,0x7e, // 41 A
0x7f,0x49,0x49,0x49,0x36, // 42 B
0x3e,0x41,0x41,0x41,0x22, // 43 C
0x7f,0x41,0x41,0x22,0x1c, // 44 D
0x7f,0x49,0x49,0x49,0x41, // 45 E
0x7f,0x09,0x09,0x09,0x01, // 46 F
0x3e,0x41,0x49,0x49,0x7a, // 47 G
0x7f,0x08,0x08,0x08,0x7f, // 48 H
0x00,0x41,0x7f,0x41,0x00, // 49 I
0x20,0x40,0x41,0x3f,0x01, // 4a J
0x7f,0x08,0x14,0x22,0x41, // 4b K
0x7f,0x40,0x40,0x40,0x40, // 4c L
0x7f,0x02,0x0c,0x02,0x7f, // 4d M
0x7f,0x04,0x08,0x10,0x7f, // 4e N
0x3e,0x41,0x41,0x41,0x3e, // 4f O
0x7f,0x09,0x09,0x09,0x06, // 50 P
0x3e,0x41,0x51,0x21,0x5e, // 51 Q
0x7f,0x09,0x19,0x29,0x46, // 52 R
0x46,0x49,0x49,0x49,0x31, // 53 S
0x01,0x01,0x7f,0x01,0x01, // 54 T
0x3f,0x40,0x40,0x40,0x3f, // 55 U
0x1f,0x20,0x40,0x20,0x1f, // 56 V
0x3f,0x40,0x38,0x40,0x3f, // 57 W
0x63,0x14,0x08,0x14,0x63, // 58 X
0x07,0x08,0x70,0x08,0x07, // 59 Y
0x61,0x51,0x49,0x45,0x43, // 5a Z
0x00,0x7f,0x41,0x41,0x00, // 5b [
0x02,0x04,0x08,0x10,0x20, // 5c Yen Currency Sign
0x00,0x41,0x41,0x7f,0x00, // 5d ]
0x04,0x02,0x01,0x02,0x04, // 5e ^
0x40,0x40,0x40,0x40,0x40, // 5f _
0x00,0x01,0x02,0x04,0x00, // 60 `
0x20,0x54,0x54,0x54,0x78, // 61 a
0x7f,0x48,0x44,0x44,0x38, // 62 b
0x38,0x44,0x44,0x44,0x20, // 63 c
0x38,0x44,0x44,0x48,0x7f, // 64 d
0x38,0x54,0x54,0x54,0x18, // 65 e
0x08,0x7e,0x09,0x01,0x02, // 66 f
0x0c,0x52,0x52,0x52,0x3e, // 67 g
0x7f,0x08,0x04,0x04,0x78, // 68 h
0x00,0x44,0x7d,0x40,0x00, // 69 i
0x20,0x40,0x44,0x3d,0x00, // 6a j
0x7f,0x10,0x28,0x44,0x00, // 6b k
0x00,0x41,0x7f,0x40,0x00, // 6c l
0x7c,0x04,0x18,0x04,0x78, // 6d m
0x7c,0x08,0x04,0x04,0x78, // 6e n
0x38,0x44,0x44,0x44,0x38, // 6f o
0x7c,0x14,0x14,0x14,0x08, // 70 p
0x08,0x14,0x14,0x18,0x7c, // 71 q
0x7c,0x08,0x04,0x04,0x08, // 72 r
0x48,0x54,0x54,0x54,0x20, // 73 s
0x04,0x3f,0x44,0x40,0x20, // 74 t
0x3c,0x40,0x40,0x20,0x7c, // 75 u
0x1c,0x20,0x40,0x20,0x1c, // 76 v
0x3c,0x40,0x30,0x40,0x3c, // 77 w
0x44,0x28,0x10,0x28,0x44, // 78 x
0x0c,0x50,0x50,0x50,0x3c, // 79 y
0x44,0x64,0x54,0x4c,0x44, // 7a z
0x00,0x08,0x36,0x41,0x00, // 7b <
0x00,0x00,0x7f,0x00,0x00, // 7c |
0x00,0x41,0x36,0x08,0x00, // 7d >
0x10,0x08,0x08,0x10,0x08, // 7e Right Arrow ->
0x08,0x1c,0x2a,0x08,0x08}; // 7f Left Arrow <-
/**********************************************
* Function: data_send(unsigned char dat)
* Input Variables: unsigned char dat
* Return Variables: void
* Usage:LCD底层通讯时序
**********************************************/
void data_send(unsigned char dat)
{
unsigned char sData,temp;
int i;
SCLK = 0;
sData=dat;
for(i=8;i>0;i--)
{
SCLK=0;
nop();
nop();
nop();
nop();
temp=sData & 0x80;
if(temp)
{
LCD_MOSI = 1;
}
else
{
LCD_MOSI = 0;
}
SCLK=1;
sData=sData<<1;
}
}
/**********************************************
* Function: LCD_Delay(unsigned int i)
* Input Variables: unsigned int i
* Return Variables: void
* Usage:LCD延时函数
**********************************************/
void LCD_Delay(unsigned int i) // Delay function
{
for(;i>0;i--);
}
/**********************************************
* Function: LCD_WRT_CTL(unsigned char x)
* Input Variables: unsigned char x
* Return Variables: void
* Usage:LCD写控制命令函数
**********************************************/
void LCD_WRT_CTL(unsigned char x)
{
LCD_A0 = 0;
LCD_CS = 0;
data_send(x);
LCD_CS = 1;
}
/**********************************************
* Function: LCD_WRT_DAT(unsigned char x)
* Input Variables: unsigned char x
* Return Variables: void
* Usage:LCD写数据函数
**********************************************/
void LCD_WRT_DAT(unsigned char x)
{
LCD_A0 = 1;
LCD_CS = 0;
data_send(x);
LCD_CS = 1;
}
/**********************************************
* Function: InitLCD()
* Input Variables: void
* Return Variables: void
* Usage:LCD初始化
**********************************************/
void InitLCD()
{
_LCD_RESET(); // LCD 复位
LCD_Delay(5000); // Delay for LCD Reset
_LCD_RESET_FINISH(); // 复位结束
LCD_Delay(5000); // 延时
_LCD_SET_DISPLINE(LCD_INIT_DISP_LINE); // 初始化Line
LCD_WRT_CTL(LCD_DISP_ON); // LCD开
LCD_WRT_CTL(LCD_ENTIREDISP_OFF); // LCD满屏显示关
LCD_WRT_CTL(LCD_REVERSDISP_OFF); // LCD反色显示关
LCD_WRT_CTL(LCD_SHLSELECT_0); // 选择SHL为0
LCD_WRT_CTL(LCD_ADCSEL_NORMAL); // ADC选择为Normal
LCD_WRT_CTL(LCD_REFVOLT_MODE); // 选择参考电压
LCD_WRT_CTL(LCD_INIT_REFVOLT); // 初始化参考电压
LCD_WRT_CTL(LCD_LCDBIAS_1); // 选择BIAS1
LCD_WRT_CTL(LCD_POWERCTRL_INTERN); // 内部Power控制
LCD_WRT_CTL(LCD_REGRESISTOR); // 选择线性电阻
}
/**********************************************
* Function: LCD_Cursor2yx(unsigned char yPage,unsigned char xColumn)
* Input Variables: unsigned char yPage,unsigned char xColumn
* Return Variables: void
* Usage:LCD显示坐标控制
**********************************************/
void LCD_Cursor2yx(unsigned char yPage,unsigned char xColumn)
{
if((xColumn>131)||(yPage>7))
return;
_LCD_SET_PAGE(yPage);
_LCD_SET_COLUMN(xColumn);
}
/**********************************************
* Function: ClearLCD()
* Input Variables:void
* Return Variables: void
* Usage:LCD清屏
**********************************************/
void ClearLCD()
{
unsigned char iPage, iColumn;
for(iPage=0;iPage<8;iPage++)
{
LCD_Cursor2yx(iPage,0);
for(iColumn=0;iColumn<132;iColumn++)
LCD_WRT_DAT(0x00);
}
}
/**********************************************
* Function: LCD_Putchar(char Char_BYT)
* Input Variables: char Char_BYT
* Return Variables: void
* Usage:在当前坐标输出一个字符
**********************************************/
void LCD_Putchar(char Char_BYT)
{
int pTable;
unsigned char i;
if ((Char_BYT<0x20)||(Char_BYT>0x7f)) // if input char is invalid
return;
pTable = (( 5*Char_BYT ) - 160); // from ascii to index of char array
for(i=0;i<5;i++)
LCD_WRT_DAT(LCD_Table[pTable+i]);
LCD_WRT_DAT(0x00); //Space between 2 Characters
}
/**********************************************
* Function: LCD_Putstr(char *Str)
* Input Variables: char *Str
* Return Variables: void
* Usage:在当前坐标输出一个字符
**********************************************/
void LCD_Putstr(char *Str)
{
while(*Str)
LCD_Putchar(*Str++);
}
/**********************************************
* Function: LCD_PutStrSz(char *Str, int Sz)
* Input Variables: char *Str int Sz
* Return Variables: void
* Usage:在当前坐标输出Sz个字符
**********************************************/
void LCD_PutStrSz(char *Str, int Sz)
{
for(;Sz>0;Sz--)
LCD_Putchar(*Str++);
}
/**********************************************
* Function: void LCD_DISPLAY_MODE(unsigned char dMode)
* Input Variables: unsigned char dMode
* Return Variables: void
* Usage:设置LCD显示模式
**********************************************/
void LCD_DISPLAY_MODE(unsigned char dMode)
{
if(dMode > 1) return;
if(dMode == 1)
{
LCD_WRT_CTL(LCD_ADCSEL_NORMAL);
LCD_WRT_CTL(LCD_SHLSELECT_1);
}
else
{
LCD_WRT_CTL(LCD_ADCSEL_REVERS);
LCD_WRT_CTL(LCD_SHLSELECT_0);
}
}
/**********************************************
* Function: LCD_PutBigchar(char Char_BYT, unsigned char y,unsigned char x)
* Input Variables: char Char_BYT, unsigned char y,unsigned char x
* Return Variables: void
* Usage:显示4倍大的字符
**********************************************/
void LCD_PutBigchar(char Char_BYT, unsigned char y,unsigned char x)
{
int pTable;
unsigned char i,j,k,m;
char BigChar[4][6];
char temp;
if ((Char_BYT<0x20)||(Char_BYT>0x7f))
return;
pTable = (( 5*Char_BYT ) - 160);
for(k=0;k<2;k++)
{
for(j=0;j<2;j++)
{
for(i=0;i<3;i++)
{
temp = 0;
BigChar[j+2*k][2*i] = (0x0f&(LCD_Table[pTable+i+2*k]>>(j*4)));
for(m=0;m<4;m++)
{
temp = temp + (((0x01<<m)&BigChar[j+2*k][2*i])<<m);
temp = temp + (((0x01<<m)&BigChar[j+2*k][2*i])<<(m+1));
}
BigChar[j+2*k][2*i] = temp;
BigChar[j+2*k][2*i+1] = temp;
}
} //LCD_WRT_DAT(LCD_Table[pTable+i]);
}
for(k=0;k<2;k++)
{
for(j=0;j<2;j++)
{
LCD_Cursor2yx(y+j,x+k*5);
for(i=0;i<5;i++)
{
LCD_WRT_DAT(BigChar[j+2*k][i+k]);
}
if(k==1);
LCD_WRT_DAT(0x00);
}
}
}
/**********************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -