📄 1602.h
字号:
# define True 0x01
# define False 0x00
# define Enable 0x01
# define Disable 0x00
# define LCD_Write 0x00
# define LCD_Read 0x01
# define LCD_Command 0x00
# define LCD_Data 0x01
# define LCD_CMD_Init 0x28
# define LCD_CMD_DispCtr 0x0c
# define LCD_CMD_CLS 0x01
# define LCD_CMD_EnterSet 0x06
# define LCD_CMD_IconShow 0x0f
# define LCD_CMD_IconHide 0x0c
# define LCD_RS _PB4
# define LCD_RW _PB7
# define LCD_E _PB5
# define LCD_BF Read_PB3
# define LCD_HalfData_Port PORTB
# define LCD_HalfData_DDR DDRB
# define LCD_SetWriteData LCD_HalfData_DDR |= 0x0f;LCD_HalfData_Port &= 0xf0;
# define LCD_SetReadData LCD_HalfData_DDR &= 0xf0;LCD_HalfData_Port |= 0x0f;
# define LCD_SendHalfCharHigh(a) LCD_HalfData_Port &= 0xf0; LCD_HalfData_Port |= (a>>4);
# define LCD_SendHalfCharLow(a) LCD_HalfData_Port &= 0xf0; LCD_HalfData_Port |= (a<<4>>4);
/*---------------------*
* 动 作 宏 定 义 *
*---------------------*/
# define SetReadState LCD_SetReadData;LCD_RS = LCD_Command;LCD_RW = LCD_Read;
# define SetRead LCD_SetReadData;LCD_RW = LCD_Read;
# define SetWrite LCD_SetWriteData;LCD_RW = LCD_Write;
# define SetCommand LCD_RS = LCD_Command;
# define SetData LCD_RS = LCD_Data;
# define RunLeft 0x00
# define RunRight 0x01
# define Print(a) LCDDisplayString(a);
# define Locate(x,y) LCDSetXY(x-1,y-1);
# define CLS LCDWaitForReady();LCDSendCommand(LCD_CMD_CLS);
# define PrintN(a,b) LCDDisplayNum((unsigned long)a,b);
# define ShowIcon LCDWaitForReady();LCDSendCommand(LCD_CMD_IconShow);
# define HideIcon LCDWaitForReady();LCDSendCommand(LCD_CMD_IconHide);
/***********************
* 全局变量声明区 *
***********************/
const char CHR[10] = {"0123456789"};
/***********************
* 系统函数声明区 *
***********************/
void LCDInit(void);
void LCDSendCommand(char Command);
void LCDSendData(char Data);
void LCDWaitForReady(void);
void LCDSetXY(char X,char Y);
void LCDDisplayString(char *String);
void LCDDisplayNum(unsigned int Num);
void delay_nms(unsigned int n);
void RunString(char *String,char Direction,char Y,char StartX,char EndX);
char StringLenth(char *String);
void Flash(char *String,char Icon,char X,char Y);
/*
void Flash(char *String,char Icon,char X,char Y)
{
char a = 0;
char StringLong = StringLenth(String);
if (SystemTimeCounter > 499)
{
Locate(X,Y)
Print(String)
}
else
{
for (a = X ;a < X+StringLong;a++)
{
Locate(a,Y)
Print(&Icon)
}
}
}
*/
char StringLenth(char *String)
{
char n = 0;
while (*String)
{
n++;
String ++;
}
return n;
}
/********************************************************
* 函数说明:LCD初始化函数 *
********************************************************/
void LCDInit(void)
{
delay_nms(15);
LCDWaitForReady();
LCDSendCommand(LCD_CMD_Init);
LCDWaitForReady();
LCDSendCommand(LCD_CMD_DispCtr);
LCDWaitForReady();
LCDSendCommand(LCD_CMD_CLS);
delay_nms(2);
LCDSendCommand(LCD_CMD_EnterSet);
}
/********************************************************
* 函数说明:向LCD发送指令函数 *
* 输入: 需要发送的指令 *
********************************************************/
void LCDSendCommand(char Command)
{
SetWrite;
SetCommand;
{
LCD_E = Enable;
LCD_SendHalfCharHigh(Command);
LCD_E = Disable;
}
{
LCD_E = Enable;
LCD_SendHalfCharLow(Command);
LCD_E = Disable;
}
SetRead;
SetCommand;
}
/********************************************************
* 函数说明:向LCD发送数据函数 *
********************************************************/
void LCDSendData(char Data)
{
SetWrite;
SetData;
{
LCD_E = Enable;
LCD_SendHalfCharHigh(Data);
LCD_E = Disable;
}
{
LCD_E = Enable;
LCD_SendHalfCharLow(Data);
LCD_E = Disable;
}
SetRead;
SetCommand;
}
/********************************************************
* 函数说明:等待LCD空闲状态函数 *
********************************************************/
void LCDWaitForReady(void)
{
//DelayUs(30);
SetRead;
SetCommand;
LCD_E = Enable;
while (LCD_BF == Enable); //RW=1,读PD7,为0表示空闲;
LCD_E = Disable;
}
/********************************************************
* 函数说明:设置显示坐标函数 *
********************************************************/
void LCDSetXY(char X,char Y)
{
char Address;
if (Y == 0)
{
Address = 0x80 + X;
}
else
{
Address = 0xc0 + X;
}
LCDWaitForReady();
LCDSendCommand(Address);
}
/********************************************************
* 函数说明:LCD字符串显示函数 *
********************************************************/
void LCDDisplayString(char *String)
{
while(*String)
{
LCDWaitForReady();
LCDSendData(*String);
String++;
}
}
/********************************************************
* 函数说明:数值显示函数(HEX) *
* 输入: 需要显示的数字 *
********************************************************/
void LCDDisplayNum(unsigned int Num)
{
char showtext[8]="0";
unsigned long temp;
unsigned int a1,a2,a3,a4,a5,a6,a7,a8;
char nn;
char a;
temp=Num;
a1=temp/10000000;
a2=temp/1000000-a1*10;
a3=temp/100000-(a2*10+a1*100);
a4=temp/10000-(a3*10+a2*100+a1*1000);
a5=temp/1000-(a4*10+a3*100+a2*1000+a1*10000);
a6=temp/100-(a5*10+a4*100+a3*1000+a2*10000+a1*100000);
a7=temp/10-(a6*10+a5*100+a4*1000+a3*10000+a2*100000+a1*1000000);
a8=temp-(a7*10+a6*100+a5*1000+a4*10000+a3*100000+a2*1000000+a1*10000000);
if (a1>0)nn=8;
else if (a2>0)nn=7;
else if (a3>0)nn=6;
else if (a4>0)nn=5;
else if (a5>0)nn=4;
else if (a6>0)nn=3;
else if (a7>0)nn=2;
else if (a8>0)nn=1;
else nn=0;
switch(nn){
case 8:
showtext[0]=a1+0x30;
showtext[1]=a2+0x30;
showtext[2]=a3+0x30;
showtext[3]=a4+0x30;
showtext[4]=a5+0x30;
showtext[5]=a6+0x30;
showtext[6]=a7+0x30;
showtext[7]=a8+0x30;
for(a=0;a<8;a++)
{
LCDWaitForReady();
LCDSendData(showtext[a]);
}
break;
case 7:
showtext[0]=a2+0x30;
showtext[1]=a3+0x30;
showtext[2]=a4+0x30;
showtext[3]=a5+0x30;
showtext[4]=a6+0x30;
showtext[5]=a7+0x30;
showtext[6]=a8+0x30;
for(a=0;a<7;a++)
{
LCDWaitForReady();
LCDSendData(showtext[a]);
}
break;
case 6:
showtext[0]=a3+0x30;
showtext[1]=a4+0x30;
showtext[2]=a5+0x30;
showtext[3]=a6+0x30;
showtext[4]=a7+0x30;
showtext[5]=a8+0x30;
for(a=0;a<6;a++)
{
LCDWaitForReady();
LCDSendData(showtext[a]);
}
break;
case 5:
showtext[0]=a4+0x30;
showtext[1]=a5+0x30;
showtext[2]=a6+0x30;
showtext[3]=a7+0x30;
showtext[4]=a8+0x30;
for(a=0;a<5;a++)
{
LCDWaitForReady();
LCDSendData(showtext[a]);
}
break;
case 4:
showtext[0]=a5+0x30;
showtext[1]=a6+0x30;
showtext[2]=a7+0x30;
showtext[3]=a8+0x30;
for(a=0;a<4;a++)
{
LCDWaitForReady();
LCDSendData(showtext[a]);
}
break;
case 3:
showtext[0]=a6+0x30;
showtext[1]=a7+0x30;
showtext[2]=a8+0x30;
showtext[3]=0x20;
for(a=0;a<4;a++)
{
LCDWaitForReady();
LCDSendData(showtext[a]);
}
break;
case 2:
showtext[0]=a7+0x30;
showtext[1]=a8+0x30;
showtext[2]=0x20;
showtext[3]=0x20;
for(a=0;a<4;a++)
{
LCDWaitForReady();
LCDSendData(showtext[a]);
}
break;
case 1:
showtext[0]=a8+0x30;
showtext[1]=0x20;
showtext[2]=0x20;
showtext[3]=0x20;
for(a=0;a<4;a++)
{
LCDWaitForReady();
LCDSendData(showtext[a]);
}
break;
case 0:
showtext[0]=0x30;
showtext[1]=0x20;
showtext[2]=0x20;
showtext[3]=0x20;
for(a=0;a<4;a++)
{
LCDWaitForReady();
LCDSendData(showtext[a]);
}
break;
}
}
void RunString(char *String,char Direction,char Y,char StartX,char EndX)
{
static char StringHead = 0;
char SCREEN[17];
char a = 0;
char Point = StringHead;
char StringLong = StringLenth(String);
static int RunTimeCounter = 0;
for (a = 0;a<EndX - StartX + 1;a++)
{
SCREEN[a] = String[Point];
Point ++;
if (Point == StringLong)
{
Point = 0;
}
}
for (;a < 17;a++)
{
SCREEN[a] =' ';
}
RunTimeCounter ++;
if (RunTimeCounter >50)
{
StringHead ++;
RunTimeCounter = 0;
if (StringHead == StringLong)
{
StringHead = 0;
}
}
Locate(StartX,Y)
Print(SCREEN)
}
void delay_1us(void) //1us延时函数
{
asm("nop");
}
void delay_nus(unsigned int n) //N us延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1us();
}
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<1140;i++);
}
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -