/*
================================================================================
File Name : GUI_Basic.c
Author : LiYOng
Date : 2008-12-12 15:51
Version : 1.0
Decription: This file contains some basic functions for GUI, It need the LCD
Drive functions
================================================================================
*/
#include "GUI_Basic.H"
#include "GUI_Type.H"
#include "fontlib.h"
/*
================================================================================
Function : GUI_DrawRectangle( )
Description : Draw a rectangle
Input : -pRect, point to a rectangle structure
output : None
================================================================================
*/
void GUI_DrawRectangle( RECT* pRect )
{
LINE line;
line.xs = pRect->xs;
line.xe = pRect->xe;
line.ys = pRect->ys;
line.ye = pRect->ys;
line.Color = pRect->Color;
LCDDrawHRLine( &line );
line.xe = pRect->xs;
line.ye = pRect->ye;
LCDDrawHRLine( &line );
line.xs = pRect->xe;
line.ys = pRect->ye;
LCDDrawHRLine( &line );
line.xe = pRect->xe;
line.ye = pRect->ys;
LCDDrawHRLine( &line );
}
/*
================================================================================
Function : GUI_DrawLine( )
Description : Draw a line
Input : -pLine, point to a line structure
output : None
================================================================================
*/
void GUI_DrawLine( LINE* pLine )
{
INT32S dx; // 直线x轴差值变量
INT32S dy; // 直线y轴差值变量
INT32S dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向
INT32S dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向
INT32S dx_x2; // dx*2值变量,用于加快运算速度
INT32S dy_x2; // dy*2值变量,用于加快运算速度
INT32S di; // 决策变量
POINT point;
LINE line;
line.xs = pLine->xs;
line.ys = pLine->ys;
line.xe = pLine->xe;
line.ye = pLine->ye;
line.Color = pLine->Color;
point.Color = pLine->Color;
dx = line.xe - line.xs;
dy = line.ye - line.ys;
/* 判断增长方向,或是否为水平线、垂直线、点 */
if( dx > 0 ) // 判断x轴方向
{
dx_sym = 1; // dx>0,设置dx_sym=1
}
else
{
if( dx < 0 )
{
dx_sym = -1; // dx<0,设置dx_sym=-1
}
else
{
LCDDrawHRLine( &line );
return;
}
}
if( dy > 0 ) // 判断y轴方向
{
dy_sym = 1; // dy>0,设置dy_sym=1
}
else
{
if( dy < 0 )
{
dy_sym = -1; // dy<0,设置dy_sym=-1
}
else
{ // dy==0,画水平线,或一点
LCDDrawHRLine( &line );
return;
}
}
/* 将dx、dy取绝对值 */
dx = dx_sym * dx;
dy = dy_sym * dy;
/* 计算2倍的dx及dy值 */
dx_x2 = dx*2;
dy_x2 = dy*2;
/* 使用Bresenham法进行画直线 */
if( dx >= dy ) // 对于dx>=dy,则使用x轴为基准
{
di = dy_x2 - dx;
while( line.xs != line.xe )
{
point.x = line.xs;
point.y = line.ys;
LCDDrawPoint( &point );
line.xs += dx_sym;
if( di < 0 )
{
di += dy_x2; // 计算出下一步的决策值
}
else
{
di += dy_x2 - dx_x2;
line.ys += dy_sym;
}
}
LCDDrawPoint( &point ); // 显示最后一点
}
else // 对于dx<dy,则使用y轴为基准
{
di = dx_x2 - dy;
while( line.ys != line.ye )
{
point.x = line.xs;
point.y = line.ys;
LCDDrawPoint( &point );
line.ys += dy_sym;
if(di<0)
{
di += dx_x2;
}
else
{
di += dx_x2 - dy_x2;
line.xs += dx_sym;
}
}
LCDDrawPoint( &point ); // 显示最后一点
}
}
/*
================================================================================
Name: PrintFont
Function: Display a character at a special area
Input: 1.Xs : Start position X
2.Ys : Start position Y
3.pFont : A pointer of a font structure
4.Character : The ASCII code of the character.
Output: None
Note: The start position is inputted as a parameter, And the end position is calculated by the FONT
structure.
Author: LiYong
Date : 2008.08.09
================================================================================
*/
void GUI_DisplayFont( INT8U Xs, INT8U Ys, FONT* pFont, char Character )
{
BitBlock Block;
INT32U Bytes;
INT8U DataBuffer[64];
INT8U i;
const unsigned char *offset;
Block.Height = pFont->Height;
Block.Width = pFont->Width;
Block.Color = pFont->Color;
Block.BackColor = pFont->BackColor;
Block.xs = Xs;
Block.ys = Ys;
Bytes = pFont->Width >> 3;
if( pFont->Width & 0x07 )
{
Bytes ++;
}
Bytes *= pFont->Height;
Bytes *= Character - ' ';
if( pFont->Height == 18 )
{
offset = (const unsigned char*)&FontLib_18;
}
else if( pFont->Height == 14 )
{
offset = (const unsigned char*)&FontLib_14;
}
else
{
return;
}
offset += Bytes;
for( i = 0; i < 36; i ++ )
{
//DataBuffer[i] = pgm_read_byte( offset + i );
}
Block.pData = DataBuffer;
PrintBitBlock( &Block );
}
/*
========================================================================================================
Name: DisplayStr
Function: Display a character at a special area
Input:
1.Xs : Start position X
2.Ys : Start position Y
3.pFont : A pointer of a font structure
4.Str : The start address of a string
Output: None
Note: The start position is inputted as a parameter, And the end position is calculated by the FONT
structure.
Author: LiYong
Date : 2008.08.09
========================================================================================================
*/
void GUI_DisplayStr( INT8U xs, INT8U ys, FONT* pFont, char* Str )
{
while( *Str )
{
GUI_DisplayFont( xs, ys, pFont, *Str );
Str ++;
xs += pFont->Width;
}
}
/*
================================================================================
Name: GUI_DrawCircle( )
Function: Display a cycle at a special area
Input: -pCycle, A pinter point to a cycle structure
Output: None
Author: LiYong
Date : 2008.08.09
================================================================================
*/
void GUI_DrawCircle( CIRCLE* pCircle )
{
INT8S draw_x0, draw_y0; // 刽图点坐标变量
INT8S draw_x1, draw_y1;
INT8S draw_x2, draw_y2;
INT8S draw_x3, draw_y3;
INT8S draw_x4, draw_y4;
INT8S draw_x5, draw_y5;
INT8S draw_x6, draw_y6;
INT8S draw_x7, draw_y7;
INT8S xx, yy; // 画圆控制变量
INT8S di; // 决策变量
POINT point;
point.Color = pCircle->Color;
/* 参数过滤 */
if(0 == pCircle->r ) return;
/* 计算出8个特殊点(0、45、90、135、180、225、270度),进行显示 */
point.x = draw_x0 = draw_x1 = pCircle->x;
point.y = draw_y0 = draw_y1 = pCircle->y + pCircle->r;
if( draw_y0 < GUI_LCM_YMAX ) LCDDrawPoint( &point ); // 90度
point.x = draw_x2 = draw_x3 = pCircle->x;
point.y = draw_y2 = draw_y3 = pCircle->y - pCircle->r;
if( draw_y2 >= 0 ) LCDDrawPoint( &point ); // 270度
point.x = draw_x4 = draw_x6 = pCircle->x + pCircle->r;
point.y = draw_y4 = draw_y6 = pCircle->y;
if(draw_x4<GUI_LCM_XMAX) LCDDrawPoint( &point ); // 0度
point.x = draw_x5 = draw_x7 = pCircle->x - pCircle->r;
point.y = draw_y5 = draw_y7 = pCircle->y;
if(draw_x5>=0) LCDDrawPoint( &point ); // 180度
if(1==pCircle->r) return; // 若半径为1,则已圆画完
/* 使用Bresenham法进行画圆 */
di = 3 - 2*pCircle->r; // 初始化决策变量
xx = 0;
yy = pCircle->r;
while(xx<yy)
{ if(di<0)
{ di += 4*xx + 6;
}
else
{ di += 4*(xx - yy) + 10;
yy--;
draw_y0--;
draw_y1--;
draw_y2++;
draw_y3++;
draw_x4--;
draw_x5++;
draw_x6--;
draw_x7++;
}
xx++;
draw_x0++;
draw_x1--;
draw_x2++;
draw_x3--;
draw_y4++;
draw_y5++;
draw_y6--;
draw_y7--;
/* 要判断当前点是否在有效范围内 */
if( (draw_x0<=GUI_LCM_XMAX)&&(draw_y0>
KEILLCD C语言 程序
需积分: 0 128 浏览量
更新于2023-05-17
收藏 111KB RAR 举报
KEILLCD程序是基于C语言开发的一个项目,它可能是一个用于控制或操作KEILLCD设备的软件。C语言是一种强大的、通用的编程语言,尤其适用于系统级编程和嵌入式领域,如驱动程序开发和硬件控制。在这个项目中,开发者使用C语言的特性来编写指令,实现与KEILLCD设备的交互。
我们需要了解C语言的基本概念。C语言是一种结构化编程语言,它的语法简洁明了,允许直接访问硬件资源,因此在嵌入式系统中广泛应用。C语言的关键元素包括变量、数据类型(如int、char、float等)、运算符、控制结构(如if-else、for、while循环)、函数以及指针。通过这些基本元素,开发者可以构建复杂的程序逻辑。
KEILLCD可能是某种特定的LCD显示屏,可能被用于显示文本、图形或者其他形式的信息。为了与这样的硬件设备通信,C语言程序通常会使用I/O操作,例如读取和写入特定的端口或内存地址。这通常涉及到操作系统提供的系统调用,比如在Unix系统中的`inb()`和`outb()`函数,用于输入和输出端口数据。
在KEILLCD程序中,可能会有以下几个关键部分:
1. **初始化**:程序开始时,会进行必要的硬件初始化,如设置波特率、数据格式、控制信号等,以确保与KEILLCD的正确通信。
2. **命令发送**:程序会发送特定的指令序列到LCD控制器,以配置显示模式、清屏、设置光标位置等。
3. **数据传输**:一旦初始化完成,程序会将要显示的数据(如字符、字符串或像素值)写入LCD设备。
4. **控制逻辑**:可能包含动态更新显示的逻辑,如计时器或事件驱动的更新机制。
5. **错误处理**:为了确保程序的健壮性,通常会有错误检查和异常处理代码,以应对硬件故障或通信问题。
6. **用户接口**:如果程序具有交互性,可能还包含了接收用户输入并响应的代码。
在学习和分析这个项目时,开发者需要熟悉C语言的语法,理解LCD显示屏的工作原理,以及可能涉及的任何特定硬件接口标准。同时,使用调试工具(如GDB)和阅读文档是理解代码行为和解决潜在问题的关键。
总结来说,KEILLCD C语言程序是一个利用C语言编程技术与特定硬件(KEILLCD)交互的应用实例。它涵盖了C语言的基本元素,以及嵌入式系统中的I/O操作和硬件控制,对于想要深入理解和实践C语言在嵌入式领域的应用的人来说,是一个很好的学习资源。
毕业季zwlzyhzylzyl
- 粉丝: 523
- 资源: 5659
最新资源
- AutoTrack的Matlab v10实现.zip
- BB_PD是用MATLAB和C语言开发的基于三维键合的周动力学代码.zip
- BeMoBIL Pipeline是一个用于分析和可视化移动脑体成像数据的MATLAB工具箱,它包括EEGLAB和MOB.zip
- BP神经网络预测实例matlab.zip
- CALFEM一个有限元工具箱的MATLAB.zip
- brainPlot是一个MATLAB函数,用于创建简单的线性脑图.zip
- CSTMATLABAPI.zip
- C和MATLAB实现的Polar编码和解码.zip
- CST微波工作室MATLAB接口.zip
- Dirichlet过程混合模型的Matlab采样和变分代码.zip
- Defocus画像利用深度推定.zip
- DCTFFT压缩与均值滤波中值滤波高斯滤波二维统计滤波自适应中值滤波维纳滤波kNN滤波NLMeans滤波的matlab.zip
- DistMesh简单的2D和3D网格生成器的MATLAB和Octave与GUI支持.zip
- G Bacci L Sanguinetti和M Luise中使用的图形和示例的Matlab代码,通过无线电源控制理解博.zip
- EigTool是开放的MATLAB软件,用于分析矩阵的特征值、伪谱和相关的谱特性.zip
- GISMO地震数据分析工具箱的MATLAB.zip