📄 glcd.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 + -