📄 lcd.c
字号:
#include "lcd.h"
#include "delaytime.h"
#include "dotarry.h"
#include "uart0.h"
LCD_COM lcdcom ;
/**************************************************************************************
*文件名:LCD延时子函数
*功能:LCD延时子函数
*输入参数:LCD延时time
*输出参数:无
*说明:
***************************************************************************************/
void LCD_SYS_Delay ( uint32 time )
{
while ( time != 0 ) time--;
}
/**************************************************************************************
*文件名:LCD初始化
*功能:配置LCD
*主要函数列表:
*修改纪录:
*说明:
***************************************************************************************/
void LCD_Init ( void )
{
LCD_CONTRL; /* 配置LCD的控制线 */
LCD_DATA; /* 配置LCD的数据线 */
LCD_Clr_Con; /* LCD的控制线清0 */
LCD_Clr_Data; /* LCD的数据线清0 */
LCD_SYS_Delay ( 1 );
LCD_POWER_1; /* 打开LCD的电源 */
delay_ms ( 1 );
LCD_RSET_1;
LCD_Set_Windows ( 0x07 );
LCD_SetCom ( LCD_COM_DisplayKey,0x00 );
LCD_SetCom ( LCD_COM_BeginLine,0x00 );
LCD_Clr_Window ( );
}
/*****************************************************************************************
*文件名:LCD显示数据转化为IO口输出
*功能:显示数据转化为IO口输出
*输入参数:显示数据
*输出参数:无
*说明:
******************************************************************************************/
void LCD_DoData ( uint8 data )
{
uint8 i,j;
i = data;
for ( j = 0;j < 8;j++)
{
switch ( j )
{
case 0:
if ( ( 0x01&i ) == 1 )
LCD_D0_1;
else
LCD_D0_0;
break;
case 1:
if ( ( 0x01&i ) == 1 )
LCD_D1_1;
else
LCD_D1_0;
break;
case 2:
if ( ( 0x01&i ) == 1 )
LCD_D2_1;
else
LCD_D2_0;
break;
case 3:
if ( ( 0x01&i ) == 1 )
LCD_D3_1;
else
LCD_D3_0;
break;
case 4:
if ( ( 0x01&i ) == 1 )
LCD_D4_1;
else
LCD_D4_0;
break;
case 5:
if ( ( 0x01&i ) == 1 )
LCD_D5_1;
else
LCD_D5_0;
break;
case 6:
if ( ( 0x01&i ) == 1 )
LCD_D6_1;
else
LCD_D6_0;
break;
case 7:
if ( ( 0x01&i ) == 1 )
LCD_D7_1;
else
LCD_D7_0;
break;
default: break;
}
i = ( i >> 1 );
}
}
/*****************************************************************************************
*文件名:LCD命令设置
*功能:根据不同的命令执行不同的操作
*输入参数:
*输出参数:无
*说明: 对命令的处理
1,判断是什么命令
2,判断后进入相应的处理程序
3,
******************************************************************************************/
void LCD_SetCom ( LCD_COM lcdcom,uint8 data )
{
uint8 i;
i = data;
switch ( lcdcom )
{
case LCD_COM_DisplayKey:
i = ( 0x3e | i );
LCD_ACOM;
LCD_SYS_Delay ( 1 );
LCD_RS_0;
LCD_DoData ( i );
LCD_SYS_Delay ( 1 );
LCD_E_1;
LCD_SYS_Delay ( 5 );
LCD_E_0;
LCD_SYS_Delay ( 5 );
break;
case LCD_COM_BeginLine:
i = ( 0xc0 | i );
LCD_ACOM;
LCD_SYS_Delay ( 1 );
LCD_RS_0;
LCD_DoData ( i );
LCD_SYS_Delay ( 1 );
LCD_E_1;
LCD_SYS_Delay ( 5 );
LCD_E_0;
LCD_SYS_Delay ( 5 );
break;
case LCD_COM_SetXAddr:
i = ( 0xb8 | i );
LCD_ACOM;
LCD_SYS_Delay ( 1 );
LCD_RS_0;
LCD_DoData ( i );
LCD_SYS_Delay ( 1 );
LCD_E_1;
LCD_SYS_Delay ( 5 );
LCD_E_0;
LCD_SYS_Delay ( 5 );
break;
case LCD_COM_SetYAddr:
i = ( 0x40 | i );
LCD_ACOM;
LCD_SYS_Delay ( 1 );
LCD_RS_0;
LCD_DoData ( i );
LCD_SYS_Delay ( 1 );
LCD_E_1;
LCD_SYS_Delay ( 5 );
LCD_E_0;
LCD_SYS_Delay ( 5 );
break;
case LCD_COM_WRData:
LCD_ACOM;
LCD_SYS_Delay ( 1 );
LCD_RS_1;
LCD_DoData ( i );
LCD_SYS_Delay ( 1 );
LCD_E_1;
LCD_SYS_Delay ( 5 );
LCD_E_0;
LCD_SYS_Delay ( 5 );
break;
case LCD_COM_REData:
break;
default: break;
}
}
/**************************************************************************************
*文件名:LCD全屏清O
*功能:LCD全屏清O
*主要函数列表:
*修改纪录:
*说明:
***************************************************************************************/
void LCD_Clr_Window ( void )
{
uint8 i,j;
for( i = 0; i < 8; i++ )
{
LCD_SetCom ( LCD_COM_SetXAddr,i );
LCD_SetCom ( LCD_COM_SetYAddr,0x00 );
for( j=0; j<64; j++ )
{
LCD_SetCom ( LCD_COM_WRData,0x00 );
}
}
}
/**************************************************************************************
*文件名:设置显示器显示区域
*功能:设置显示器显示区域
*输入参数列表;显示的区域数值
*输出参数列表:无
*主要函数列表:
*修改纪录:
*说明:显示的区域数值是根据"area"的底3位判断;
如果显示左边,右边的屏幕,则数据是xxxx1011,也就是xxxx1101,要显示的屏对应的数值为1,
第3位是表示是否选择屏幕显示区域
***************************************************************************************/
void LCD_Set_Windows ( uint8 area )
{
uint8 i,j;
i = ( 0x07 & area );
for ( j = 0; j < 3; j ++ )
{
switch ( j )
{
case 0:
if ( ( 0x01 & i ) == 1 )
LCD_CS3_0;
else
LCD_CS3_1;
break;
case 1:
if ( ( 0x01 & i ) == 1 )
LCD_CS2_0;
else
LCD_CS2_1;
break;
case 2:
if ( ( 0x01 & i ) == 1 )
LCD_CS1_0;
else
LCD_CS1_1;
break;
default: break;
}
i = ( i >> 1 );
}
}
/**************************************************************************************
*文件名:LCD写显示数据
*功能:LCD写数据
*输入参数列表;
*输出参数列表:无
*主要函数列表:
*修改纪录:
*说明:
***************************************************************************************/
void LCD_WR_Data ( uint8 x_addr,uint8 y_addr,uint8 x_num,uint8 y_num,uint8 *displaydata )
{
uint8 i,j;
for( i = 0; i < x_num; i++ )
{
LCD_SetCom ( LCD_COM_SetXAddr,( x_addr + i ) );
LCD_SetCom ( LCD_COM_SetYAddr,y_addr );
for( j = 0; j < y_num; j++ )
{
LCD_SetCom ( LCD_COM_WRData,*displaydata );
displaydata++;
}
}
}
/**************************************************************************************
*文件名:LCD显示
*功能:LCD显示
*输入参数列表;显示数值
*输出参数列表:无
*主要函数列表:
*修改纪录:
*说明:对于输入的LCD显示参数,x_addr,y_addr,x_num,y_num有一定的输入关系
由于LCD的是192x64的
***************************************************************************************/
void LCD_Display ( uint8 x_addr,uint8 y_addr,uint8 x_num,uint8 y_num,uint8 *displaydata )
{
uint8 y,i,j,k,m;
uint8 count;
if ( ( y_addr >= 64 ) )
{
if ( ( y_addr <= 127 ) )
{
y_addr = y_addr - 64;
y = y_addr + y_num;
if ( ( y >= 1 ) & ( y <= 64 ) )
{
LCD_Set_Windows ( 0x02 );
LCD_WR_Data ( x_addr,y_addr,x_num,y_num,displaydata );
}
else
{
if ( ( y >= 65 ) & ( y <= 128 ) )
{
count = 0;
for ( i = x_addr; i < ( x_addr + x_num ); i ++ )
{
j = 64 - y_addr;
LCD_Set_Windows ( 0x02 );
LCD_WR_Data ( i,y_addr,1,j,( displaydata + count ) );
k = y_num - j;
LCD_Set_Windows ( 0x01 );
LCD_WR_Data ( i,0x00,1,k,( displaydata + count + j ) );
count = count + y_num;
}
}
}
}
else if ( ( y_addr >= 128 ) & ( y_addr <= 191 ) )
{
y_addr = y_addr - 128;
LCD_Set_Windows ( 0x01 );
LCD_WR_Data ( x_addr,y_addr,x_num,y_num,displaydata );
}
}
else if ( ( y_addr <= 63 ) )
{
y = y_addr + y_num;
if ( ( y >= 1 ) & ( y <= 64) )
{
LCD_Set_Windows ( 0x04 );
LCD_WR_Data ( x_addr,y_addr,x_num,y_num,displaydata );
}
else
{
if ( ( y >= 65 ) & ( y <= 128 ) )
{
count = 0;
for ( i = x_addr; i < ( x_addr + x_num ); i ++ )
{
j = 64 - y_addr;
LCD_Set_Windows ( 0x04 );
LCD_WR_Data ( i,y_addr,1,j,( displaydata + count ) );
k = y_num - j;
LCD_Set_Windows ( 0x02 );
LCD_WR_Data ( i,0x00,1,k,( displaydata + count + j ) );
count = count + y_num;
}
}
else if ( ( y >= 129 ) & ( y <= 192 ) )
{
count = 0;
for ( i = x_addr; i < ( x_addr + x_num ); i ++ )
{
j = 64 - y_addr;
LCD_Set_Windows ( 0x04 );
LCD_WR_Data ( i,y_addr,1,j,( displaydata + count ) );
k = 64;
LCD_Set_Windows ( 0x02 );
LCD_WR_Data ( i,0x00,1,k,( displaydata + count + j ) );
m = y_num - ( j + k );
LCD_Set_Windows ( 0x01 );
LCD_WR_Data ( i,0x00,1,m,( displaydata + count + j + k ) );
count = count + y_num;
}
}
}
}
}
/**************************************************************************************
*文件名:LCD显示输出
*功能:LCD显示输出
*输入参数列表;显示数值
*输出参数列表:无
*主要函数列表:
*修改纪录:
*说明:
***************************************************************************************/
void LCD_Output_Windows ( uint8 *outputdata )
{
//uint8 i,j;
uint8 count;
count = 0;
/*
for ( i = 0; i < 2; i++)
{
for ( j = 0; j < 5; j ++ )
{
LCD_Display ( i,0x00 + j*16,1,16,outputdata + j*32 );
}
}
*/
LCD_Display ( 0,64,1,16,outputdata );
LCD_Display ( 0,80,1,16,outputdata + 32 );
LCD_Display ( 0,96,1,16,outputdata + 64 );
LCD_Display ( 0,112,1,16,outputdata + 96 );
LCD_Display ( 0,128,1,16,outputdata + 128 );
LCD_Display ( 1,64,1,16,outputdata + 16 );
LCD_Display ( 1,80,1,16,outputdata + 48 );
LCD_Display ( 1,96,1,16,outputdata + 80 );
LCD_Display ( 1,112,1,16,outputdata + 112 );
LCD_Display ( 1,128,1,16,outputdata + 144 );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -