📄 display.c
字号:
#include "Includes.h"
/*--------------------------------变量定义------------------------------------*/
INT8U DispBuf[4][16]; // 显示缓冲区
INT8U SignBuf[4][16]; // 反显标志
INT8U BoolBuf[4][8]; // 全角标志
INT8U Buf[5]; // 数字缓存区
/*------------------------向DB0~DB7三态数据线写数据--------------------------*/
void LCD_Write( INT8U flag,INT8U val )
{
INT8U temp;
temp = LCD_IO_PORT; // 记下LCD对应端口方向
CS_L(); // 液晶屏驱动芯片使能
asm("nop");asm("nop");asm("nop");
if( flag ) // flag 1:val为指令;0:val为数据
{
A0_L(); // 写指令
}
else
{
A0_H(); // 写数据
}
LCD_IO_PORT = 0xff; // 将口线置为输出
asm("nop");asm("nop");asm("nop");
LCD_W_PORT = val; // 将显示数据送出
asm("nop");asm("nop");asm("nop");
WR_L();
asm("nop");asm("nop");asm("nop");
WR_H(); // 数据被写到DB0~DB7
asm("nop");asm("nop");asm("nop");
CS_H();
LCD_IO_PORT = temp; // 还原LCD对应端口方向
}
/*-------------------------------初始化液晶屏---------------------------------*/
void LCD_Init ( void )
{
LCD_Write ( COMMAND, 0xae ); // 关显示 0xae:关显示;0xaf:开显示
LCD_Write ( COMMAND, 0xe2 ); // 软件复位
LCD_Write ( COMMAND, 0xa2 ); // 设置液晶驱动电压偏压比
LCD_Write ( COMMAND, 0xa0 ); // 选择屏列扫描方式 0xa0:SEG0-SEG127;0xa1:SEG127-SEG0
LCD_Write ( COMMAND, 0xc8 ); // 选择屏列扫描方式 0xc0:COM0-COM63 ;0xc8:COM63-COM0
LCD_Write ( COMMAND, 0x2f ); // 选择内部操作电压为VCC
LCD_Write ( COMMAND, 0xa4 ); // 0xa4:正常显示;0xa5:所有点不显示
LCD_Write ( COMMAND, 0x23 ); // 选择内部电阻比Rb/Ra=0x20~0x27(调节液晶对比度)
LCD_Write ( COMMAND, 0x81 ); // 设置可编程电压调整模式
LCD_Write ( COMMAND, 0x38 ); // 设置电压编程寄存器 0x00~0x3f(调节液晶亮度)
LCD_Write ( COMMAND, 0xa6 ); // 图像显示方式 0xa6:正常;0xa7:反显
LCD_Write ( COMMAND, 0xaf ); // 关显示 0xae:关显示;0xaf:开显示
}
/*-----------------------------------清屏-------------------------------------*/
void LCD_Clr( void )
{
INT8U i,j;
LCD_Write(COMMAND,0xae); // 关显示
for (i=0; i<PAGE; i++)
{
LCD_Write(COMMAND,0x40 ); // 初始行
LCD_Write(COMMAND,0xb0+i);
LCD_Write(COMMAND,0x10 ); // 初始列
LCD_Write(COMMAND,0x00 );
for (j=0; j<COLUMN; j++)
{
LCD_Write(DATA,0); // 清零
}
}
LCD_Write(COMMAND,0xaf); // 开显示
}
/*--------------------------------行(页)设置--------------------------------*/
void Setpage(INT8U page)
{
if(page > (PAGE-1)) // 此屏有8页
{
return;
}
LCD_Write(COMMAND,0x40); // 初始行
LCD_Write(COMMAND,0xb0+page);
}
/*-----------------------------------列设置-----------------------------------*/
void Setcolumn(INT8U column, INT8U hz)
{
if(hz)
{
column<<=4; // 相当于column=column*16 液晶屏幕16列为汉字显示1列
}
else
{
column<<=3; // 相当于column=column*8 液晶屏幕 8列为字符显示1列
}
if(column > COLUMN) // 此屏有128列
{
return;
}
LCD_Write(COMMAND,0x10); // 初始列
LCD_Write(COMMAND,0x10 +((column>>4)&0x0f)); // 写列址高4位
LCD_Write(COMMAND,0x00 + (column&0x0f)); // 写列址低4位
}
/*-----------------------------------显示处理---------------------------------*/
void SendDot(INT8U page,INT8U column,INT8U value,INT8U type,INT8U fan)
{
INT8U i;
Setpage(page);
if (type==SBCcase) // 全角(汉字)
{
Setcolumn(column,1);
for (i=0; i<16; i++) // 上半部分
{
if (fan)
{
LCD_Write(DATA,~gb16Dot[value].Msk[2*i]); // 反显
}
else
{
LCD_Write(DATA,gb16Dot[value].Msk[2*i]);
}
}
Setpage(page + 1);
Setcolumn(column,1);
for (i=0;i<16;i++) // 下半部分
{
if (fan)
{
LCD_Write(DATA,~gb16Dot[value].Msk[2*i+1]); // 反显
}
else
{
LCD_Write(DATA,gb16Dot[value].Msk[2*i+1]);
}
}
}
else // 半角(字符)
{
value -= ' '; // 首字空格ASIIC码
Setcolumn(column,0);
for (i=0; i<8; i++)
{
if (fan)
{
LCD_Write(DATA,~nAsciiDot[value*16+2*i]); // 反显
}
else
{
LCD_Write(DATA,nAsciiDot[value*16+2*i]);
}
}
Setpage(page + 1);
Setcolumn (column,0);
for (i=0; i<8; i++ )
{
if (fan)
{
LCD_Write(DATA,~nAsciiDot[value*16+2*i+1]); // 反显
}
else
{
LCD_Write(DATA,nAsciiDot[value*16+2*i+1]);
}
}
}
}
/*------------------------------显示缓存初始化--------------------------------*/
void DispInit(void)
{
INT8U i,j;
for (i=0;i<4;i++)
{
for (j=0;j<8;j++)
{
DispBuf[i][j*2] = ' '; // 空白
DispBuf[i][j*2+1] = ' ';
SignBuf[i][j*2] = 0;
SignBuf[i][j*2+1] = 0;
BoolBuf[i][j] = 0;
}
}
}
/*-------------------------------将缓存内容显示-------------------------------*/
void DispAll(void)
{
INT8U i,j;
for (i=0; i<4; i++)
{
for (j=0; j<8; j++)
{
if(BoolBuf[i][j]==SBCcase) // 全角(汉字)
{
SendDot(2*i,j,DispBuf[i][j*2+1],SBCcase,SignBuf[i][j*2+1]);
}
else // 半角(字符)
{
SendDot(2*i,2*j,DispBuf[i][j*2],DBCcase,SignBuf[i][j*2]);
SendDot(2*i,2*j+1,DispBuf[i][j*2+1],DBCcase,SignBuf[i][j*2+1]);
}
}
}
}
/*----------------------------------单字符处理--------------------------------*/
void MakeChar(INT8U x,INT8U y,INT8U value,INT8U fan)
{
if ((x>4)||(y>16)){return;}
DispBuf[x-1][y-1] = value;
SignBuf[x-1][y-1] = fan;
}
/*--------------------------------字符串处理----------------------------------*/
void MakeText(INT8U x,INT8U y,INT8U *ptr,INT8U fan)
{
INT8U uLen,n;
uLen=0;
while ( *(ptr+uLen) >= 0x10 ){WDR();uLen++;}; // 探测字串长度
n=0;
while (n<uLen)
{
WDR();
/*ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码*/
if ( *(ptr+n) <= 128) // ASCII
{
//if ( *(ptr+n) >= 0x10 ) // 换行符ASCII码
MakeChar(x,y,ptr[n],fan);
}
else // 中文
{
if ((x>4)||((2*y)>16)){return;}
DispBuf[x-1][2*y-1] = GetWordAddress(ptr+n); // 查找汉字地址
SignBuf[x-1][2*y-1] = fan;
BoolBuf[x-1][y-1] = SBCcase; // 全角(汉字)
n++;
}
n++;
y++;
}
}
/*-----------------------------------图形显示处理-----------------------------*/
void DispBmp ( void )
{
INT8U i,j;
for( i=0; i<PAGE; i++ )
{
LCD_Write ( 1, 0x40 ); // 初始行
LCD_Write ( 1, 0xb0+i );
LCD_Write ( 1, 0x10 ); // 初始列
LCD_Write ( 1, 0x00 );
for ( j=0; j<COLUMN; j++ )
{
LCD_Write ( 0, FaceBmp[ 128 * i + j ] );
}
}
}
/*-------------------------------显示数据转换---------------------------------*/
void HextoBcd ( INT16U count, INT8U zero )
{
INT8U i;
for ( i=0; i<5; i++ )
{
Buf[i] = count % 10 + '0';
count /= 10;
}
if(!zero)
{
for ( i=4; i!=0; i-- )
{
if ( Buf[i] == '0' ){Buf[i] = ' ';}
else {break;}
}
}
}
/*------------------------------------------------------------------------------
0ooo
ooo0 ( )
( ) ) /
\ ( (_/
\_)
------------------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -