📄 lcd.c
字号:
#include <reg52.h>
#include <absacc.h>
#include <stdio.h>
#include "lcd.h"
#define LINECHARS 0x1e //30
#define DATA XBYTE[0X8000] /*显示屏数据端口地址*/
#define COMMAND XBYTE[0X8100] /*显示屏命令端口地址*/
#define CHARBLANK 0
sbit flag0 = ACC^0 ; /* command r/w flag */
sbit flag1 = ACC^1 ; /* DATA R/W flag */
sbit flag2 = ACC^2 ; /* AUTO read */
sbit flag3 = ACC^3 ; /* AUTO write */
/* 一次读写状态判断 */
void wait()
{
while( flag0 != 1 )
{
ACC = COMMAND ;
}
while( flag1 != 1 )
{
ACC = COMMAND ;
}
}
/* 连续读写状态判断*/
void waits( )
{
while( flag3 != 1 )
{
ACC = COMMAND ;
}
}
/* 一次写数据 */
void writedata( uchar da )
{
wait();
DATA = da;
}
/* 连续写数据 */
void writedatas( uchar da )
{
waits();
DATA = da;
}
/* 写命令 */
void writecom ( uchar com )
{
wait();
COMMAND = com;
}
/* 写双参数命令 */
void writedc ( uchar data1, uchar data2, uchar com )
{
writedata( data1 );
writedata( data2 );
writecom ( com );
}
/*写单参数命令 */
void writesdc ( uchar data1,uchar com )
{
writedata (data1) ;
writecom (com);
}
/****************************************************************
显示一个汉字在X,Y位置,其中X必须为8的倍数
S指向一个长度为32的字模数组,start_base为整个缓冲区在RAM中的位置
******************************************************************/
void display32( uchar start_base, uchar x,uchar y, char *s )
{
uint start;
uchar i;
uchar high,low;
for( i = 0; i < 16 ; i++ ) //把字模写入LCD
{
start = x + (y*i)*LINECHARS*8;
low = (start/8)&0x00ff;
high = (start/8)>>8;
writedc( low, high + start_base, 0x24 );
writesdc( s[i] , 0xc0 ); //数据写入LCD地址加1
writesdc( s[i+16] ,0xc0 ); //数据写入LCD地址加1
}
}
/************************************************
显示一个字符,在X,Y位置,其中X必须为8的倍数
S指向一个长度为16的字模数组。
************************************************/
void display16( uchar start_base, uchar x,uchar y, char *s )
{
uint start;
uchar i;
uchar high,low;
for( i = 0; i < 16 ; i++ ) //把字模写入LCD
{
start = x + (y*i)*LINECHARS*8;
low = (start/8)&0x00ff;
high = (start/8)>>8;
writedc( low, high + start_base, 0x24 );
writesdc( s[i] , 0xc0 );
}
}
/************************************************************
反显某一区域,X方向必须为8的倍数,Y方向无限制
X,Y,由起始到终止,X_lenght,y_length为反显的X,Y方向的长度
如果X_length和y_length任何一个为0,则不会反显。
注意,由于不含判断所以如果参数不合法会导致程序错误。
start_base_为写入的显存的首地址。
**************************************************************/
void hightlight_lec( uchar start_base , uchar start_x ,uchar start_y ,
uchar x_length, uchar y_length )
{
uint start;
uchar i;
uchar high,low;
while( y_length != 0 )
{
start = ( start_x/8 +start_y*(LINECHARS) );
low = start & 0x00ff;
high = start >> 8;
writedc( low, high+start_base ,0x24 );
i = x_length/8 ;
while( i != 0 )
{
writecom( 0xc5 );
writesdc( ~DATA, 0XC0 );
i--;
}
start_y ++ ;
y_length -- ;
}
}
/************************************************************
清除某一区域,X方向必须为8的倍数,Y方向无限制
X,Y,由起始到终止,X_lenght,y_length为反显的X,Y方向的长度
如果X_length和y_length任何一个为0,则不会清除。
注意,由于不含判断所以如果参数不合法会导致程序错误。
start_base_为写入的显存的首地址。
**************************************************************/
void clear_lcd( uchar start_base , uchar start_x ,uchar start_y ,
uchar x_length, uchar y_length )
{
uint start;
uchar i;
uchar high,low;
while( y_length != 0 )
{
start = ( start_x/8 +start_y*(LINECHARS) );
low = start & 0x00ff;
high = start >> 8;
writedc( low, high+start_base, 0x24 );
writecom( 0xb0 );
i = x_length/8 ;
while( i != 0 )
{
writecom( 0x00 );
i--;
}
start_y ++ ;
y_length -- ;
}
}
/************************************************************
覆盖某一区域,X方向必须为8的倍数,Y方向无限制
X,Y,由起始到终止,X_lenght,y_length为反显的X,Y方向的长度
如果X_length和y_length任何一个为0,则不会清除。
注意,由于不含判断所以如果参数不合法会导致程序错误。
start_base_为写入的显存的首地址。
**************************************************************/
void cover_lcd( uchar start_base , uchar start_x ,uchar start_y ,
uchar x_length, uchar y_length )
{
uint start;
uchar i;
uchar high,low;
while( y_length != 0 )
{
start = ( start_x/8 +start_y*(LINECHARS) );
low = start & 0x00ff;
high = start >> 8;
writedc( low, high+start_base, 0x24 );
writecom( 0xb0 );
i = x_length/8 ;
while( i != 0 )
{
writecom( 0xff );
i--;
}
start_y ++ ;
y_length -- ;
}
}
/* 初始化LCD */
void lcd_init()
{
writecom( 0x98 ); //仅开图形显示方式
writecom( 0x88 ); //显示方式设置为外部RAM方式
writedc( 0x00, 0x00, 0x42 ); //图形区首地址
writedc( LINECHARS, 0x00, 0x43 ); //设图形区每行字节数
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -