📄 screensol.c
字号:
/******************************************************************************************
* 目的:显示及人机交互模块
* 功能:利用现有的位图资源提供基本的图形,菜单显示
屏幕基本动作
屏幕缓存操作接口
* 模块依赖:Screensol.h
* 思路日志:该模块所需实现的功能可以理解为
1.该屏幕的主要用途为对16*16文字和8*6文字的显示,对屏幕的控制以当前的一个字宽为单
位,对屏幕的控制流程理解为:[初始化屏幕并送入待显示信息] -> [屏幕动作] ->
[响应一个用户对屏幕的操作]?。
2.屏幕动作的编写
必须首先整理来自与屏幕的信息及元素:
人机交互的入口为 [键盘按键] 需要先整理出对屏幕产生有效影响的按键有哪些:
上键,下键,[NO]键,[YES]键。
然后根据这些按键对屏幕残生的影响收集屏幕存在的元素,即对象体:
反显光标,屏幕文字
再然后根据以上搜集的每一个元素针对按键有可能产生的动作编写每一个对象的对象动作:
光标初始化及复位,光标上移,光标下移,光标左移,光标右移
屏幕文字初始化及复位,屏幕上翻屏,屏幕下翻屏
3.初始化屏幕的编写
首先确定外部对屏幕所产生的所有需求,即需要多少种类型的屏幕边框,此处对于屏幕需求
的分类有可能会随着屏幕显示方式而不断改变,当前的理解有不确定性
******************************************************************************************/
#include <ctype.h>
#include <string.h>
#include "Screensol.h"
#include "compiler.h"
//////////////////////////////////////////////////////////////////////////
// Define of ScreenCHmode()
//////////////////////////////////////////////////////////////////////////
#define CH_16x16 20 //汉字
#define CH_8x6 21 //英文
//////////////////////////////////////////////////////////////////////////
// Define of CursorInit()
//////////////////////////////////////////////////////////////////////////
#define CURSORFORSTR 1 //初始化为光标条
//////////////////////////////////////////////////////////////////////////
// Define of CursorMove()
//////////////////////////////////////////////////////////////////////////
#define CURSORUP 0 //光标上移
#define CURSORDOWN 1 //光标下移
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// Define of ScreenMove()
//////////////////////////////////////////////////////////////////////////
#define SCREENUP 0 //屏幕上移
#define SCREENDOWN 1 //屏幕下移
//////////////////////////////////////////////////////////////////////////
// Define of PutBuf()
//////////////////////////////////////////////////////////////////////////
#define LEFTSIDE 0 //居左显示
#define MIDSIDE 1 //居中显示
//////////////////////////////////////////////////////////////////////////
#define MENUMAX 80
//#define MAXR 20
#define MAXR 20
#define MAXL 16
struct ScrWide
{
unsigned char *MenuBuf[MENUMAX]; //菜单缓存
unsigned char Couserx; //当前列
unsigned char Cousery; //当前行
unsigned char Ch_X; //字符宽
unsigned char Ch_Y; //字符高
unsigned char Ch_Color; //字符颜色
unsigned char WinMode; //当前的屏幕窗口模式
unsigned char CHMode; //当前的字库模式
unsigned char Start; //当前显示文本起始行
unsigned char Max; //当前显示文本最大行
unsigned char UserLine; //光标所在行
unsigned char ScreenFlash; //屏幕刷新标记
unsigned char ScreenBuf[MAXR][MAXL];//屏幕缓存
unsigned char UserRip; //屏幕返回
unsigned char Count; //特殊记数
unsigned char MaxCount; //特殊记数
} TagScr;
/*
**-------------------------------------------------------------------------------------
** 初始化屏幕 - 添加菜单到屏幕
** 输入:Wmode - 窗口类别
** 输出:无
** 返回:添加成功标记
** 说明:
**-------------------------------------------------------------------------------------
*/
void ScreenInit( unsigned char Wmode )
{
#ifdef DEBUGMODE
DebugString( "ScreenInit()" );
#endif
unsigned char i;
//清屏和清除屏幕缓存
ClrBuf();
//初始化模块数据
TagScr.WinMode = Wmode;
TagScr.Start = 0;
TagScr.UserLine = 0;
TagScr.Couserx = 0; //坐标清0
TagScr.Cousery = 0;
TagScr.Max = 0; //最大行清0
TagScr.ScreenFlash = 1;
TagScr.Count = 0;
TagScr.Ch_Color = BLACK; //默认颜色黑色
//根据屏幕类型初始化屏幕
for( i=0; i<MAXR; i++ ) //内部的可供操作屏幕缓存
{
TagScr.MenuBuf[i] = TagScr.ScreenBuf[i]; //指向内部缓存
}
switch( Wmode )
{
//初始化字库模式
case W_STREAM:
ScreenCHMode( CH_8x6 );
break;
default:
ScreenCHMode( CH_16x16 );
break;
}
}
/*
**-------------------------------------------------------------------------------------
** 清除屏幕缓存
**-------------------------------------------------------------------------------------
*/
void ClrBuf( )
{
#ifdef DEBUGMODE
DebugString( "ClrBuf()" );
#endif
unsigned char i,j;
for( i=0; i<MAXR; i++ )
{
for( j=0; j<MAXL; j++ )
{
TagScr.ScreenBuf[i][j] = ' ';
}
TagScr.ScreenBuf[i][j] = '\0';
}
for( i=0; i<TagScr.Max; i++ )
{
TagScr.MenuBuf[i] = NULL;
}
TagScr.Max = 0;
}
/*
**-------------------------------------------------------------------------------------
** 添加新行到屏幕缓存
** string:入口串
** 返回:当前最大行
**-------------------------------------------------------------------------------------
*/
unsigned char AddString( unsigned char *StringIn )
{
#ifdef DEBUGMODE
DebugString( "AddString()" );
#endif
unsigned int i,j;
if( TagScr.Max >= MAXR ) return 0; //已经不可再添加了
i=0;
j=0;
while( StringIn[i]!='\0' && i< ( MAXR* LCDLEN/TagScr.Ch_X ) ) //字符串最大字符个数 不能超过屏幕缓存
{
if(StringIn[i]>160)
{
TagScr.ScreenBuf[TagScr.Max][j] = StringIn[i];
i++;
j++;
}
else
{
//NULL
}
TagScr.ScreenBuf[TagScr.Max][j]= StringIn[i];
i++;
j++;
if(StringIn[i]=='\\'&&StringIn[i+1]=='n') //换行标记
{
i += 2;
j = 0;
TagScr.Max++;
}
else if( j >= (LCDLEN/TagScr.Ch_X - 2) )
{
if(isalpha(StringIn[i-1])&&isalpha(StringIn[i]))
{
TagScr.ScreenBuf[TagScr.Max][j] = '-';
}
else
{
//NULL
}
TagScr.ScreenBuf[TagScr.Max][j+1]='\0';
j = 0;
TagScr.Max++;
if( TagScr.Max >= MAXR ) return 0; //已经不可再添加了
}
else
{
//NULL
}
}
TagScr.ScreenBuf[TagScr.Max][j]='\0';
if( j ) //内容长度刚好为一行的倍数时不应换行
{
TagScr.Max++;
}
return TagScr.Max;
}
/*
**-------------------------------------------------------------------------------------
** 初始化屏幕 - 添加菜单到屏幕
** 输入:menu - 待显示文本
Maxl - 文本行数
** 输出:无
** 返回:添加成功标记
**-------------------------------------------------------------------------------------
*/
char AddMenu( unsigned char *Menu[], unsigned char Maxl )
{
#ifdef DEBUGMODE
DebugString( "AddMenu()" );
#endif
unsigned char i;
if( Menu )
{
for( i=0; i<Maxl ; i++ )
{
TagScr.MenuBuf[TagScr.Max++] = Menu[i];
if( TagScr.Max >= MENUMAX ) return FAIL;
}
return SUCCESS;
}
else
{
//NULL
}
return FAIL;
}
/*
**-------------------------------------------------------------------------------------
** 初始化屏幕 - 添加菜单到屏幕
** 输入:Mode - 文字宽度格式
** 输出:无
** 返回:添加成功标记
** 说明:
**-------------------------------------------------------------------------------------
*/
void ScreenCHMode( unsigned char Mode )
{
#ifdef DEBUGMODE
DebugString( "ScreenCHMode()" );
#endif
TagScr.CHMode = Mode;
if( Mode == CH_16x16 )
{
TagScr.Ch_X = 8;
TagScr.Ch_Y = 16;
}
else if( Mode == CH_8x6 )
{
TagScr.Ch_X = 6;
TagScr.Ch_Y = 8;
}
else
{
//NULL
}
}
/*
**-------------------------------------------------------------------------------------
** 屏幕动作 - 初始化光标
** 输入:CursorMode - 初始化模式
** 输出:无
** 返回:初始化成功标记
** 说明:在当前位置初始化光标,必须在屏幕初始化完成后进行
**-------------------------------------------------------------------------------------
*/
char CursorInit( char CursorMode )
{
#ifdef DEBUGMODE
DebugString( "CursorInit()" );
#endif
if( CursorMode == CURSORFORSTR )
{
SetColor( WHITE );
SetCursor( 0,TagScr.UserLine );
PutStr( TagScr.MenuBuf[ TagScr.UserLine + TagScr.Start ] );
SetColor( BLACK );
}
else
{
//NULL
}
return SUCCESS;
}
/*
**-------------------------------------------------------------------------------------
** 屏幕动作 - 光标移动
** 输入:Action - 光标动作宏
** 输出:无
** 返回:移动成功标记
** 说明:根据当前需求编写的光标移动动作,在模块中将此动作结合按键响应完成当前屏幕的人机
交互过程
**-------------------------------------------------------------------------------------
*/
char CursorMove( char Action )
{
#ifdef DEBUGMODE
DebugString( "CursorMove()" );
#endif
if( Action == CURSORUP ) //光标向上
{
if( TagScr.UserLine == 0 )
{
return FAIL;
}
//正常显示当前行
SetColor( BLACK );
SetCursor( 0,TagScr.UserLine );
PutStr( TagScr.MenuBuf[ TagScr.UserLine + TagScr.Start ] );
//反显上一行
TagScr.UserLine--;
SetColor( WHITE );
SetCursor( 0,TagScr.UserLine );
PutStr( TagScr.MenuBuf[ TagScr.UserLine + TagScr.Start ] );
SetColor( BLACK );
}
else if( Action == CURSORDOWN )
{
//正常显示当前行
if( (TagScr.UserLine+1) ==(UCHAR)( LCDROUT/TagScr.Ch_Y ) )
{
return FAIL;
}
else if( (TagScr.UserLine + TagScr.Start + 1) == TagScr.Max )
{
return FAIL;
}
SetColor( BLACK );
SetCursor( 0,TagScr.UserLine );
PutStr( TagScr.MenuBuf[ TagScr.UserLine + TagScr.Start ] );
//反显下一行
TagScr.UserLine++;
SetColor( WHITE );
SetCursor( 0,TagScr.UserLine );
PutStr( TagScr.MenuBuf[ TagScr.UserLine + TagScr.Start ] );
SetColor( BLACK );
}
else
{
return FAIL;
}
return SUCCESS;
}
/*
**-------------------------------------------------------------------------------------
** 屏幕动作 - 文本移动
** 输入:Action - 文本动作宏
** 输出:无
** 返回:移动成功标记
** 说明:根据当前需求编写的屏幕移动动作,在模块中将此动作结合按键响应完成当前屏幕的人机
交互过程
**-------------------------------------------------------------------------------------
*/
char ScreenMove( char Action )
{
#ifdef DEBUGMODE
DebugString( "ScreenMove()" );
#endif
if( Action == SCREENUP ) //处理向上翻页
{
if( TagScr.Start ) //可向上翻
{
TagScr.Start--;
PutScreen( LEFTSIDE );
return SUCCESS;
}
else
{
return FAIL;
}
}
else if( Action == SCREENDOWN ) //处理向下翻页
{
if( TagScr.Max - TagScr.Start > (UCHAR)( LCDROUT/TagScr.Ch_Y ) ) //可向下翻
{
TagScr.Start++;
PutScreen( LEFTSIDE );
return SUCCESS;
}
else
{
return FAIL;
}
}
else
{
return FAIL;
}
}
/*
**-------------------------------------------------------------------------------------
** 显示驱动 - 设定当前显示位置,光标宽度等于字宽
** 输入:CursorX - 代表第几列字符,0xff代表保持当前列
CursorY - 代表第几行字符,0xff代表保持当前行
** 输出:无
** 返回:
** 说明:
**-------------------------------------------------------------------------------------
*/
void SetCursor( unsigned char CursorX, unsigned char CursorY )
{
#ifdef DEBUGMODE
DebugString( "SetCursor()" );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -