⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 glcd.c

📁 Mp3 Player using ATmega128, VS1003B, Character LCD. Test OK.Good Sound.
💻 C
字号:
/*! \file glcd.c \brief Graphic LCD API functions. */
//*****************************************************************************
//
// File Name	: 'glcd.c'
// Title		: Graphic LCD API functions
// Author		: Pascal Stang - Copyright (C) 2002
// Date			: 5/30/2002
// Revised		: 5/30/2002
// Version		: 0.5
// Target MCU	: Atmel AVR
// Editor Tabs	: 4
//
// NOTE: This code is currently below version 1.0, and therefore is considered
// to be lacking in some functionality or documentation, or may not be fully
// tested.  Nonetheless, you can expect most functions to work.
//
// This code is distributed under the GNU Public License
//		which can be found at http://www.gnu.org/licenses/gpl.txt
//
//*****************************************************************************

#include <avr/io.h>
#include <avr/pgmspace.h>

#include "glcd.h"

// include hardware support
#include "ks0108.h"

// include fonts
// 康巩 fonts
#include "font5x7.h"		// 扁夯臂揪眉
#include "font8x16.h"		// 康巩臂揪眉绰 咯扁俊 沥狼登绢 乐澜

// 茄臂 fonts
#include "font16x16.h"		// 茄臂臂揪眉绰 咯扁俊 沥狼登绢 乐澜

// 酒捞能
#include "bmp_icon.h"

extern GrLcdStateType GrLcdState;


// ********************************************************************** //
//                              弊府扁 包访                               //
// ********************************************************************** //

// set dot
void glcdSetDot(U8 x, U8 y)
{
	U8 temp;

	glcdSetAddress(x, y/8);
	temp = glcdDataRead();	// dummy read
	temp = glcdDataRead();	// read back current value
	glcdSetAddress(x, y/8);
	glcdDataWrite(temp | (1 << (y % 8)));	// 扁粮狼 单捞磐甫 蜡瘤茄盲 茄 侨伎父 眠啊窍扁 困秦 OR窃

	glcdStartLine(0);
}

// clear dot
void glcdClearDot(U8 x, U8 y)
{
	U8 temp;

	glcdSetAddress(x, y/8);
	temp = glcdDataRead();	// dummy read
	temp = glcdDataRead();	// read back current value
	glcdSetAddress(x, y/8);
	glcdDataWrite(temp & ~(1 << (y % 8)));

	glcdStartLine(0);
}

// draw line
void glcdLine(U8 x1, U8 y1, U8 x2, U8 y2)
{
	U8 i;

	if(x1 == x2)	// 技肺急捞搁
	{
		for (i = y1; i <= y2; i++)
			glcdSetDot(x1, i);
	}
	else if(y1 == y2)	// 啊肺急捞搁
	{
		for (i = x1; i <= x2; i++)
			glcdSetDot(i, y1);
	}
}


// draw rectangle
void glcdRectangle(U8 x1, U8 y1, U8 x2, U8 y2)
{
	U8 i;
	
	for (i = x1; i <= x2; i++)
	{
		glcdSetDot(i, y1);
		glcdSetDot(i, y2);
	}
	
	for (i = y1; i <= y2; i++)
	{
		glcdSetDot(x1, i);
		glcdSetDot(x2, i);
	}
}

// draw circle
void glcdCircle(U8 xcenter, U8 ycenter, U8 radius)
{
	int tswitch, y, x = 0;
	U8 d;

	d = ycenter - xcenter;
	y = radius;
	tswitch = 3 - 2 * radius;

	while (x <= y)
	{
		glcdSetDot(xcenter + x, ycenter + y);
		glcdSetDot(xcenter + x, ycenter - y);
		glcdSetDot(xcenter - x, ycenter + y);		
		glcdSetDot(xcenter - x, ycenter - y);
		glcdSetDot(ycenter + y - d, ycenter + x);	
		glcdSetDot(ycenter + y - d, ycenter - x);
		glcdSetDot(ycenter - y - d, ycenter + x);	
		glcdSetDot(ycenter - y - d, ycenter - x);

		if(tswitch < 0)
			tswitch += (4 * x + 6);
		else
		{
			tswitch += (4 * (x - y) + 10);
			y--;
		}
		x++;
	}
}


// ********************************************************************** //
//                             康巩 免仿包访                              //
// ********************************************************************** //

//------------------------------------------------------------------------//
// 泅犁 困摹俊 茄臂磊(5x7) 静扁
void glcdWriteChar(U8 c)
{
	U8 i = 0;

	for(i=0; i<5; i++)
	{
		glcdDataWrite(pgm_read_byte(&Font5x7[((c - 0x20) * 5) + i]));		                   
	}
	// write a spacer line
	glcdDataWrite(0x00);
	glcdStartLine(0);
}

//------------------------------------------------------------------------//
// 5x7 巩磊凯 静扁
void glcdPutStr(U8 *data)
{
  while (*data) {
    glcdWriteChar(*data);
    data++;
  }
}

//------------------------------------------------------------------------//
// 8x16 巩磊凯 静扁
// attr篮 焊烹(NORMAL), 开惑臂揪(INVERSE) 急琶
void glcdPutEngChar(U8 c, U8 attr)
{
	U8 i = 0;
	GrLcdStateType grlcdState;

	for(i=0; i<8; i++)	// display upper row
	{
		if(attr == NORMAL)
			glcdDataWrite(pgm_read_byte(&E_font[c][i]));
		else
			glcdDataWrite(~pgm_read_byte(&E_font[c][i]));
	}

	grlcdState = GrLcdState;

	if(grlcdState.lcdXAddr == 0)	// 巩磊 免仿 饶 促澜 临肺 逞绢 艾栏搁,
		glcdSetAddress(GLCD_XPIXELS-8, grlcdState.lcdYAddr);
	else
		glcdSetAddress(grlcdState.lcdXAddr-8, grlcdState.lcdYAddr+1);

	for(i=8; i<16; i++)	// display lower row
	{
		if(attr == NORMAL)
			glcdDataWrite(pgm_read_byte(&E_font[c][i]));
		else
			glcdDataWrite(~pgm_read_byte(&E_font[c][i]));
	}

	if(grlcdState.lcdXAddr == 0)	// 巩磊 免仿 饶 促澜 临肺 逞绢 艾栏搁,
		glcdSetAddress(grlcdState.lcdXAddr, grlcdState.lcdYAddr+1);
	else
		glcdSetAddress(grlcdState.lcdXAddr, grlcdState.lcdYAddr);
}


// ********************************************************************** //
//                             茄臂 免仿包访                              //
// ********************************************************************** //

//------------------------------------------------------------------------//
// 迄飘抛捞喉阑 曼炼窍咯 16x16 茄臂 1磊甫 父甸绢 晨
void glcdGetFont(U16 c, U8 *fontBuffer)
{
	U8 i;
	U8 cho_5bit, joong_5bit, jong_5bit;
	U8 cho_bul, joong_bul, jong_bul=0, jong_flag;
	U16 ch;

	cho_5bit = pgm_read_byte(&table_cho[(c >> 10) & 0x001F]);		// 檬己: 14-10 5bit甫 眠免
	joong_5bit = pgm_read_byte(&table_joong[(c >> 5) & 0x001F]);	// 吝己: 09-05 5bit甫 眠免
	jong_5bit = pgm_read_byte(&table_jong[c & 0x001F]);				// 辆己: 04-00 5bit甫 眠免

	if(jong_5bit == 0)	// 辆己捞 绝栏搁
	{
		jong_flag = 0;
		cho_bul = pgm_read_byte(&bul_cho1[joong_5bit]);
		if((cho_5bit == 1) || (cho_5bit == 16))			// 1: Fill Code, 16: ず
			joong_bul = 0;
		else
			joong_bul = 1;
    }
	else				// 辆己捞 乐栏搁
    {
		jong_flag = 1;
		cho_bul = pgm_read_byte(&bul_cho2[joong_5bit]);
		if((cho_5bit == 1) || (cho_5bit == 16))			// 1: Fill Code, 16: ず
			joong_bul = 2;
		else
			joong_bul = 3;
		jong_bul = pgm_read_byte(&bul_jong[joong_5bit]);
	}

	// 迄飘甫 滚欺肺 汗荤
	ch = cho_bul*20 + cho_5bit;				// 檬己 迄飘 汗荤 
	for(i = 0; i < 32; i++)
	    fontBuffer[i] = pgm_read_byte(&K_font[ch][i]);

	ch = 8*20 + joong_bul*22 + joong_5bit;	// 吝己 迄飘甫 OR
	for(i = 0; i < 32; i++)
	    fontBuffer[i] |= pgm_read_byte(&K_font[ch][i]);

	if(jong_flag)							// 辆己捞 粮犁窍搁 OR
    {
		ch = 8*20 + 4*22 + jong_bul*28 + jong_5bit;
		for(i = 0; i < 32; i++)
			fontBuffer[i] |= pgm_read_byte(&K_font[ch][i]);
    }
}

//------------------------------------------------------------------------//
// 16x16 茄臂 巩磊凯 静扁
// attr篮 焊烹(NORMAL), 开惑臂揪(INVERSE) 急琶
void glcdPutKorChar(U16 c, U8 attr)
{
	U8 i;
	U8 fontBuffer[32];	// 32Byte 茄臂迄飘 滚欺
	GrLcdStateType grlcdState;

	glcdGetFont(c, fontBuffer);

	for(i=0; i<8; i++)		// display upper left row
	{
		if(attr == NORMAL)
			glcdDataWrite(fontBuffer[i]);
		else
			glcdDataWrite(~fontBuffer[i]);
	}

	for(i=8; i<16; i++)		// display upper right row
	{
		if(attr == NORMAL)
			glcdDataWrite(fontBuffer[i]);
		else
			glcdDataWrite(~fontBuffer[i]);
	}

	grlcdState = GrLcdState;

	if(grlcdState.lcdXAddr == 0)	// 巩磊 免仿 饶 促澜 临肺 逞绢 艾栏搁,
		glcdSetAddress(GLCD_XPIXELS-16, grlcdState.lcdYAddr);
	else
		glcdSetAddress(grlcdState.lcdXAddr-16, grlcdState.lcdYAddr+1);
	
	for(i=16; i<24; i++)	// display lower left row
	{
		if(attr == NORMAL)
			glcdDataWrite(fontBuffer[i]);
		else
			glcdDataWrite(~fontBuffer[i]);
	}

	for(i=24; i<32; i++)	// display lower right row
	{
		if(attr == NORMAL)
			glcdDataWrite(fontBuffer[i]);
		else
			glcdDataWrite(~fontBuffer[i]);
	}

	if(grlcdState.lcdXAddr == 0)	// 巩磊 免仿 饶 促澜 临肺 逞绢 艾栏搁,
		glcdSetAddress(grlcdState.lcdXAddr, grlcdState.lcdYAddr+1);
	else
		glcdSetAddress(grlcdState.lcdXAddr, grlcdState.lcdYAddr);
}



//------------------------------------------------------------------------//
// str俊 蝶扼 康巩, 茄臂 急琶窍咯 巩磊凯 免仿
void glcdPutString(U8 *str, U8 attr)
{
	unsigned char ch1;
	unsigned int ch2;

	while(*str)
	{
		ch1 = *str;
		str++;

		if(ch1 < 0x80)
			glcdPutEngChar(ch1, attr);	// 康巩 免仿
		else
		{
			ch2 = 256*ch1 + (*str & 0xFF);
			str++;
			glcdPutKorChar(ch2, attr); // 炼钦屈 茄臂 免仿
		}
	}
}


// ********************************************************************** //
//                             箭磊 免仿包访                              //
// ********************************************************************** //

//------------------------------------------------------------------------//
// 4bit 16柳荐(hex)肺 免仿
void glcdPutU04Hex(U8 data)
{
    U8 c = data & 0x0F;

	if (c > 9)
        c += 'A' - 10;
    else
        c += '0';
  
	glcdWriteChar(c);
}

//------------------------------------------------------------------------//
// 1byte(8bit) 16柳荐(hex)肺 免仿
void glcdPutU8Hex(U8 data)
{
    glcdPutU04Hex(data>>4);
    glcdPutU04Hex(data);
}

//------------------------------------------------------------------------//
// 2byte(16bit) 16柳荐(hex)肺 免仿
void glcdPutU16Hex(U16 data)
{
    glcdPutU8Hex(data>>8);
    glcdPutU8Hex(data);
}

//------------------------------------------------------------------------//
// 4byte(32bit) 16柳荐(hex)肺 免仿
void glcdPutU32Hex(U32 data)
{
    glcdPutU16Hex(data>>16);
    glcdPutU16Hex(data);
}

//------------------------------------------------------------------------//
// 4byte(32bit) 绞柳荐(Dec)肺 免仿(迄飘 5x7)
// digit绰 磊府荐
void glcdPutU32Dec(U32 data, U8 digit)
{
	U32 div = 1;
	U32 c;

	while(--digit)
		div *= 10;

	while(div > 0)
	{
		c = data / div;
		data %= div;
		div /= 10;
		glcdWriteChar((U8)c + '0');
	}
}

//------------------------------------------------------------------------//
// 4byte(32bit) 绞柳荐(Dec)肺 免仿(迄飘 8x16)
// digit绰 磊府荐
// attr篮 焊烹(NORMAL), 开惑臂揪(INVERSE) 急琶
void glcdPutU32Dec16(U32 data, U8 digit, U8 attr)
{
	U32 div = 1;
	U32 c;

	while(--digit)
		div *= 10;

	while(div > 0)
	{
		c = data / div;
		data %= div;
		div /= 10;
		glcdPutEngChar((U8)c + '0', attr);
	}
}



// ********************************************************************** //
//                           酒捞能 免仿包访                              //
// ********************************************************************** //

//------------------------------------------------------------------------//
// 16x16 icon 免仿
void glcdWriteIcon16(U8 icon)
{
	U8 i;
	GrLcdStateType grlcdState;
	// display upper left row
	for(i=1; i<=15; i+=2)
		glcdDataWrite(pgm_read_byte(&BMP_Icon[icon][i]));

	// display upper right row
	for(i=17; i<=31; i+=2)
		glcdDataWrite(pgm_read_byte(&BMP_Icon[icon][i]));

	grlcdState = GrLcdState;

	if(grlcdState.lcdXAddr == 0)	// 巩磊 免仿 饶 促澜 临肺 逞绢 艾栏搁,
		glcdSetAddress(GLCD_XPIXELS-16, grlcdState.lcdYAddr);
	else
		glcdSetAddress(grlcdState.lcdXAddr-16, grlcdState.lcdYAddr+1);
	
	// display lower left row
	for(i=0; i<=14; i+=2)
		glcdDataWrite(pgm_read_byte(&BMP_Icon[icon][i]));

	// display lower right row
	for(i=16; i<=30; i+=2)
		glcdDataWrite(pgm_read_byte(&BMP_Icon[icon][i]));

	if(grlcdState.lcdXAddr == 0)	// 巩磊 免仿 饶 促澜 临肺 逞绢 艾栏搁,
		glcdSetAddress(grlcdState.lcdXAddr, grlcdState.lcdYAddr+1);
	else
		glcdSetAddress(grlcdState.lcdXAddr, grlcdState.lcdYAddr);
}

//------------------------------------------------------------------------//
// 24x16 icon 免仿
void glcdWriteIcon24(U8 icon)
{
	U8 i;
	GrLcdStateType grlcdState;
	// display upper left row
	for(i=1; i<=15; i+=2)
		glcdDataWrite(pgm_read_byte(&BMP_Icon_BPS[icon][i]));

	// display upper middle row
	for(i=17; i<=31; i+=2)
		glcdDataWrite(pgm_read_byte(&BMP_Icon_BPS[icon][i]));
	
	// display upper right row
	for(i=33; i<=47; i+=2)
		glcdDataWrite(pgm_read_byte(&BMP_Icon_BPS[icon][i]));

	grlcdState = GrLcdState;
	glcdSetAddress(grlcdState.lcdXAddr-24, grlcdState.lcdYAddr+1);
	
	// display lower left row
	for(i=0; i<=14; i+=2)
		glcdDataWrite(pgm_read_byte(&BMP_Icon_BPS[icon][i]));

	// display lower middle row
	for(i=16; i<=30; i+=2)
		glcdDataWrite(pgm_read_byte(&BMP_Icon_BPS[icon][i]));
	
	// display lower right row
	for(i=32; i<=46; i+=2)
		glcdDataWrite(pgm_read_byte(&BMP_Icon_BPS[icon][i]));

	glcdSetAddress(grlcdState.lcdXAddr, grlcdState.lcdYAddr);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -