📄 lcd.c
字号:
// 输入参数: 无
// 输出参数: Push_L Push_R Push_E Push_C键标志位
// 返回值 : 无
void Key_Interrupt (void) interrupt 1 using 1 //10ms扫描一次
{
EA=0;
ET0=0;
TR0=0;
TL0 = 0xA0;
TH0 = 0xC1;
if(Button_P==0)
{ DelayX10ms (12);
if(Button_P==0) { Push_P=1;Push_H=0; Push_A=0; Push_S=0;Push_U=0; Push_D=0;Push_R=0;}
}
else if(Button_D==0)
{ DelayX10ms(12);
if(Button_D==0) { Push_D=1;Push_H=0; Push_A=0; Push_S=0;Push_U=0; Push_D=0;Push_R=0;}
}
else if(Button_U==0)
{ DelayX10ms(12);
if(Button_U==0) {Push_U=1;Push_H=0; Push_A=0; Push_S=0;Push_U=0; Push_D=0;Push_R=0;}
}
else if(Button_U==0)
{ DelayX10ms(12);
if(Button_D==0) {Push_P=1;Push_H=0; Push_A=0; Push_S=0;Push_U=0; Push_D=0;Push_R=0;}
}
else if(Button_U==0)
{ DelayX10ms(12);
if(Button_E==0) {Push_P=1;Push_H=0; Push_A=0; Push_S=0;Push_U=0; Push_D=0;Push_R=0;}
}
else if(Button_R==0)
{ DelayX10ms(12);
if(Button_C==0) { Push_P=1;Push_H=0; Push_A=0; Push_S=0;Push_U=0; Push_D=0;Push_R=0;}
}
EA=1;
ET0=1;
TR0=1;
}
/***************************结束 键盘中断处理 ********************************/
/*******************************开始 延时函数**********************************************************************/
// 函数介绍: 延时10ms
// 输入参数: Delay_Time10 *10ms(8位16进制数 延时时间)
// 输出参数: 无
// 返回值 : 无
void DelayX10ms (UINT8 Delay_Time10)
{ UINT8 t1,t2,t3;
for(t1=0;t1<Delay_Time10;t1++)
for(t2=0;t2<100;t2++)
for(t3=0;t3<120;t3++)
;
}
// 函数介绍: 延时50us
// 输入参数: Delay_Time10 *50us(8位16进制数 延时时间)
// 输出参数: 无
// 返回值 : 无
void DelayX50us (UINT8 Delay_Time50)
{ UINT8 t1,t2;
for(t1=0;t1<Delay_Time50;t1++)
for(t2=0;t2<50;t2++)
;
}
/*******************************结束 延时函数**********************************************************************/
/***************************开始 初始化 LCD ********************************/
// 函数介+绍: 送lcd指令
// 输入参数: Lcd_Inst (8位16进制数送入控制指令)
// 输出参数: 无
// 返回值 : 无
void Send_Instr (UINT8 Lcd_Inst)
{
Lcd_Port =0xFF;
E = 1 ;
RW = 1;
RS = 0;
while(Busy_bit!=0) ;
E = 0 ;
DelayX50us (5) ;
RS=0;
RW=0;
Lcd_Port=Lcd_Inst;
E=1;
DelayX50us (5) ;
E = 0;
Lcd_Port=0xff;
}
/////////////////////////////////////////////////////////////////////////////////
// 函数介绍: 送lcd数据
// 输入参数: Lcd_Data (8位16进制数送入的显示数据)
// 输出参数: 无
// 返回值 : 无
void Send_Data (UINT8 Lcd_Data)
{
Lcd_Port = 0xFF;
RS = 0;
RW = 1;
E = 1 ;
while(Busy_bit!=0) ;
E = 0 ;
DelayX50us (5) ;
RS = 1;
RW = 0;
Lcd_Port = Lcd_Data;
E = 1;
DelayX50us (5) ;
E = 0;
Lcd_Port=0xff;
}
/////////////////////////////////////////////////////////////////////////////////
// 函数介绍: 送行lcd数据
// 输入参数: line (8位16进制数送入的显示行位置)
// x ,y(8位16进制数送入的显示数组位置)
// 输出参数: 无
// 返回值 : 无
void Send_Line_Data(UINT8 line,UINT8 x,UINT8 y)
{ UINT8 i,j;
Send_Instr (0x30); //功能设定 :反显
DelayX50us (5);
Send_Instr (line);
DelayX50us (2) ;
for(i=0;i<Menu_Word_Num;i++)
{ j=Menu_Data[x][y][i];
Send_Data (j);
DelayX50us (2);
}
}
/////////////////////////////////////////////////////////////////////////////////
// 函数介绍: 送34行lcd指定位置数据
// 输入参数: 指定列 y
// 指定行列数组b[][Menu_Row_Num+1][Menu_Word_Num]
// 输出参数: 无
// 返回值 : 无
void Line34_Data(UINT8 Date_Post)
{ Send_Instr (0x30);
DelayX50us (2);
Send_Instr(Date_Post);
DelayX10ms (1);
Send_Data (Conver_Fdata3);
DelayX50us (3);
Send_Data (Conver_Fdata2);
DelayX50us (3);
Send_Data (Conver_Fdata1);
DelayX50us (3);
}
/////////////////////////////////////////////////////////////////////////////////
// 函数介绍: 清显示屏同时位指针归位
// 输入参数: 无
// 输出参数: 无
// 返回值 : 无
void Clr_Disply(void)
{ Send_Instr (0x30); //功能设定 :反显
DelayX50us (5);
Send_Instr(0x01); //清除显示:AC=00H
DelayX10ms (1) ;
Send_Instr(0x80); //设定DDRAM位置:AC=80H
DelayX50us (2) ;
}
*/
/////////////////////////////////////////////////////////////////////////////////
// 函数介绍: 指定行反显
// 输入参数: Revers_Line (8位16进制数LCD反显行位置)
// Revers_Bit (全局变量 1位 反显为1 无反显为0 )
// 返回值 : 无
void Lcd_Revers(UINT8 Revers_Line)
{ if(Revers_Bit==1)
{ Send_Instr (0x34); //功能设定 :扩充指令
DelayX50us (2) ;
Send_Instr (Revers_Address); //功能设定 :清反显
DelayX50us (2);
Revers_Address=Revers_Line;
Send_Instr (0x30); //功能设定 :反显
DelayX50us (5);
Revers_Bit=0;
}
else
{ Send_Instr (0x34); //功能设定 :扩充指令
DelayX50us (2) ;
Send_Instr (Revers_Line); //功能设定 :反显
DelayX50us (2);
Revers_Address=Revers_Line;
Send_Instr(0x30); //功能设定 :反显
DelayX50us (5);
Revers_Bit=1 ;
}
}
/////////////////////////////////////////////////////////////////////////////////
// 函数介绍: 清绘图函数
// 输入参数: Y_Position (8位16进制数LCD绘图y位置)
// X_Position (8位16进制数LCD绘图x位置)
// H_Data (8位16进制数LCD绘图高八位数据)
// L_Data (8位16进制数LCD绘图低八位数据)
// 返回值 : 无
void Clear_Draw_Screen()
{ UINT8 i,j;
Send_Instr (0x30); //功能设定 :绘图开
DelayX50us (2);
for(j=0x80;j<=0x9f;j++)
{ for (i=0x80;i<=0x8f;i++)
{Send_Instr (0x34); //功能设定 :绘图开
DelayX50us (3);
Send_Instr (j); //功能设定 :设定垂直位图范围
DelayX50us (3);
Send_Instr (i); //功能设定 :设定水平位图范围
DelayX50us (3);
Send_Instr (0x30); //功能设定 :绘图开
DelayX50us (3);
Send_Data (0);
DelayX50us (3);
Send_Data (0);
DelayX50us (3);
}
}
Send_Instr (0x36); //功能设定 :绘图开
DelayX50us (3);
}
/////////////////////////////////////////////////////////////////////////////////
// 函数介绍: 绘图函数
// 输入参数: Y_Position (8位16进制数LCD绘图y位置)
// X_Position (8位16进制数LCD绘图x位置)
// H_Data (8位16进制数LCD绘图高八位数据)
// L_Data (8位16进制数LCD绘图低八位数据)
// 返回值 : 无
void Draw_Screen(UINT8 Y_Position,UINT8 X_Position,UINT8 H_Data,UINT8 L_Data)
{
Send_Instr (0x30); //功能设定 :绘图开
DelayX50us (2);
Send_Instr (0x34); //功能设定 :绘图开
DelayX50us (3);
Send_Instr (Y_Position); //功能设定 :设定垂直位图范围
DelayX50us (3);
Send_Instr (X_Position); //功能设定 :设定水平位图范围
DelayX50us (3);
Send_Instr (0x30); //功能设定 :绘图开
DelayX50us (3);
Send_Data (H_Data);
DelayX50us (3);
Send_Data (L_Data);
DelayX50us (3);
Send_Instr (0x36); //功能设定 :绘图开
DelayX50us (3);
}
/////////////////////////////////////////////////////////////////////////////////////////////
// 函数介绍: 初始化LCD的显示、游标、指针
// 输入参数: 无
// 输出参数: 无
// 返回值 : 无
void Init_Lcd (void)
{
Revers_Bit=0;
Send_Instr(0x30); //功能设定 : 8BIT 基本指令
DelayX50us (2) ;
Send_Instr(0x01); //清除显示:AC=00H
DelayX10ms (1) ;
Send_Instr(0x10); //位置归位:AC=00H
DelayX50us (2) ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -