📄 lcd_bk.c
字号:
/*
* BK Project no.1 AVR Library
*
* Start day : 2006. 04. 14.
* File name : lcd_bk.c lcd_bk.h
* Designed by BK.
*
*
* If you want to know a full detail of these functions, See my blog(www.naver.blog.gemini525)
* This library support LCD Device. Graphic 128 x 64 and Character 16 x 2.
* Function index in this file.
* name[date].........Simple Description
* SetPort()[06.04.13].........Set a Port In and Out.
* Setb()[06.04.13]..........Set a bit of Port.
*
*/
#include <avr/io.h>
#include "lcd_bk.h"
#include <avr/stdlib.h>
uint8_t font[95][5] = { /* 5x7 ASCII character font prog_uchar type ?*/
{0x00, 0x00, 0x00, 0x00, 0x00}, // 0x20 space
{0x00, 0x00, 0x4f, 0x00, 0x00}, // 0x21 !
{0x00, 0x07, 0x00, 0x07, 0x00}, // 0x22 "
{0x14, 0x7f, 0x14, 0x7f, 0x14}, // 0x23 #
{0x24, 0x2a, 0x7f, 0x2a, 0x12}, // 0x24 $
{0x23, 0x13, 0x08, 0x64, 0x62}, // 0x25 %
{0x36, 0x49, 0x55, 0x22, 0x50}, // 0x26 &
{0x00, 0x05, 0x03, 0x00, 0x00}, // 0x27 '
{0x00, 0x1c, 0x22, 0x41, 0x00}, // 0x28 (
{0x00, 0x41, 0x22, 0x1c, 0x00}, // 0x29 )
{0x14, 0x08, 0x3e, 0x08, 0x14}, // 0x2a *
{0x08, 0x08, 0x3e, 0x08, 0x08}, // 0x2b +
{0x00, 0x50, 0x30, 0x00, 0x00}, // 0x2c ,
{0x08, 0x08, 0x08, 0x08, 0x08}, // 0x2d -
{0x00, 0x60, 0x60, 0x00, 0x00}, // 0x2e .
{0x20, 0x10, 0x08, 0x04, 0x02}, // 0x2f /
{0x3e, 0x51, 0x49, 0x45, 0x3e}, // 0x30 0
{0x00, 0x42, 0x7f, 0x40, 0x00}, // 0x31 1
{0x42, 0x61, 0x51, 0x49, 0x46}, // 0x32 2
{0x21, 0x41, 0x45, 0x4b, 0x31}, // 0x33 3
{0x18, 0x14, 0x12, 0x7f, 0x10}, // 0x34 4
{0x27, 0x45, 0x45, 0x45, 0x39}, // 0x35 5
{0x3c, 0x4a, 0x49, 0x49, 0x30}, // 0x36 6
{0x01, 0x71, 0x09, 0x05, 0x03}, // 0x37 7
{0x36, 0x49, 0x49, 0x49, 0x36}, // 0x38 8
{0x06, 0x49, 0x49, 0x29, 0x1e}, // 0x39 9
{0x00, 0x36, 0x36, 0x00, 0x00}, // 0x3a :
{0x00, 0x56, 0x36, 0x00, 0x00}, // 0x3b ;
{0x08, 0x14, 0x22, 0x41, 0x00}, // 0x3c <
{0x14, 0x14, 0x14, 0x14, 0x14}, // 0x3d =
{0x00, 0x41, 0x22, 0x14, 0x08}, // 0x3e >
{0x02, 0x01, 0x51, 0x09, 0x06}, // 0x3f ?
{0x32, 0x49, 0x79, 0x41, 0x3e}, // 0x40 @
{0x7e, 0x11, 0x11, 0x11, 0x7e}, // 0x41 A
{0x7f, 0x49, 0x49, 0x49, 0x36}, // 0x42 B
{0x3e, 0x41, 0x41, 0x41, 0x22}, // 0x43 C
{0x7f, 0x41, 0x41, 0x22, 0x1c}, // 0x44 D
{0x7f, 0x49, 0x49, 0x49, 0x41}, // 0x45 E
{0x7f, 0x09, 0x09, 0x09, 0x01}, // 0x46 F
{0x3e, 0x41, 0x49, 0x49, 0x7a}, // 0x47 G
{0x7f, 0x08, 0x08, 0x08, 0x7f}, // 0x48 H
{0x00, 0x41, 0x7f, 0x41, 0x00}, // 0x49 I
{0x20, 0x40, 0x41, 0x3f, 0x01}, // 0x4a J
{0x7f, 0x08, 0x14, 0x22, 0x41}, // 0x4b K
{0x7f, 0x40, 0x40, 0x40, 0x40}, // 0x4c L
{0x7f, 0x02, 0x0c, 0x02, 0x7f}, // 0x4d M
{0x7f, 0x04, 0x08, 0x10, 0x7f}, // 0x4e N
{0x3e, 0x41, 0x41, 0x41, 0x3e}, // 0x4f O
{0x7f, 0x09, 0x09, 0x09, 0x06}, // 0x50 P
{0x3e, 0x41, 0x51, 0x21, 0x5e}, // 0x51 Q
{0x7f, 0x09, 0x19, 0x29, 0x46}, // 0x52 R
{0x26, 0x49, 0x49, 0x49, 0x32}, // 0x53 S
{0x01, 0x01, 0x7f, 0x01, 0x01}, // 0x54 T
{0x3f, 0x40, 0x40, 0x40, 0x3f}, // 0x55 U
{0x1f, 0x20, 0x40, 0x20, 0x1f}, // 0x56 V
{0x3f, 0x40, 0x38, 0x40, 0x3f}, // 0x57 W
{0x63, 0x14, 0x08, 0x14, 0x63}, // 0x58 X
{0x07, 0x08, 0x70, 0x08, 0x07}, // 0x59 Y
{0x61, 0x51, 0x49, 0x45, 0x43}, // 0x5a Z
{0x00, 0x7f, 0x41, 0x41, 0x00}, // 0x5b [
{0x02, 0x04, 0x08, 0x10, 0x20}, // 0x5c (\)
{0x00, 0x41, 0x41, 0x7f, 0x00}, // 0x5d ]
{0x04, 0x02, 0x01, 0x02, 0x04}, // 0x5e ^
{0x40, 0x40, 0x40, 0x40, 0x40}, // 0x5f _
{0x00, 0x01, 0x02, 0x04, 0x00}, // 0x60 `
{0x20, 0x54, 0x54, 0x54, 0x78}, // 0x61 a
{0x7f, 0x48, 0x44, 0x44, 0x38}, // 0x62 b
{0x38, 0x44, 0x44, 0x44, 0x20}, // 0x63 c
{0x38, 0x44, 0x44, 0x48, 0x7f}, // 0x64 d
{0x38, 0x54, 0x54, 0x54, 0x18}, // 0x65 e
{0x08, 0x7e, 0x09, 0x01, 0x02}, // 0x66 f
{0x0c, 0x52, 0x52, 0x52, 0x3e}, // 0x67 g
{0x7f, 0x08, 0x04, 0x04, 0x78}, // 0x68 h
{0x00, 0x04, 0x7d, 0x00, 0x00}, // 0x69 i
{0x20, 0x40, 0x44, 0x3d, 0x00}, // 0x6a j
{0x7f, 0x10, 0x28, 0x44, 0x00}, // 0x6b k
{0x00, 0x41, 0x7f, 0x40, 0x00}, // 0x6c l
{0x7c, 0x04, 0x18, 0x04, 0x7c}, // 0x6d m
{0x7c, 0x08, 0x04, 0x04, 0x78}, // 0x6e n
{0x38, 0x44, 0x44, 0x44, 0x38}, // 0x6f o
{0x7c, 0x14, 0x14, 0x14, 0x08}, // 0x70 p
{0x08, 0x14, 0x14, 0x18, 0x7c}, // 0x71 q
{0x7c, 0x08, 0x04, 0x04, 0x08}, // 0x72 r
{0x48, 0x54, 0x54, 0x54, 0x20}, // 0x73 s
{0x04, 0x3f, 0x44, 0x40, 0x20}, // 0x74 t
{0x3c, 0x40, 0x40, 0x20, 0x7c}, // 0x75 u
{0x1c, 0x20, 0x40, 0x20, 0x1c}, // 0x76 v
{0x3c, 0x40, 0x30, 0x40, 0x3c}, // 0x77 w
{0x44, 0x28, 0x10, 0x28, 0x44}, // 0x78 x
{0x0c, 0x50, 0x50, 0x50, 0x3c}, // 0x79 y
{0x44, 0x64, 0x54, 0x4c, 0x44}, // 0x7a z
{0x00, 0x08, 0x36, 0x41, 0x00}, // 0x7b {
{0x00, 0x00, 0x77, 0x00, 0x00}, // 0x7c |
{0x00, 0x41, 0x36, 0x08, 0x00}, // 0x7d }
{0x08, 0x04, 0x08, 0x10, 0x08}}; // 0x7e ~
#define CLI_LED PORTD = PORTD | 0x04 //PORTD 2 LED
#define SET_LED PORTD = PORTD & 0xfb
uint8_t MaskTbl[5] = {0x04, 0x08, 0x10, 0x20, 0x40};
void RotChar(uint8_t *InputFont, uint8_t *ConvFont) //
{
uint8_t i, buff;
for(i = 0;i < 5 ;i++){
if((InputFont[i] & 0x01)>0)
ConvFont[7] |= MaskTbl[i];
if((InputFont[i] & 0x02)>0)
ConvFont[6] |= MaskTbl[i];
if((InputFont[i] & 0x04)>0)
ConvFont[5] |= MaskTbl[i];
if((InputFont[i] & 0x08)>0)
ConvFont[4] |= MaskTbl[i];
if((InputFont[i] & 0x10)>0)
ConvFont[3] |= MaskTbl[i];
if((InputFont[i] & 0x20)>0)
ConvFont[2] |= MaskTbl[i];
if((InputFont[i] & 0x40)>0)
ConvFont[1] |= MaskTbl[i];
if((InputFont[i] & 0x80)>0)
ConvFont[0] |= MaskTbl[i];
}
}
void GLCDString(uint8_t x, uint8_t y, uint8_t *string)
{
uint8_t i, len;
len = strlen(string);
for(i=x;i<(len+x);i++)
GLCDChar(i, y, string[i-x]);
}
void GLCDChar(uint8_t x, uint8_t y, uint8_t character)
{
uint8_t i;
uint8_t ConvFont[8];
ConvFont[0] =0;
ConvFont[1] =0;
ConvFont[2] =0;
ConvFont[3] =0;
ConvFont[4] =0;
ConvFont[5] =0;
ConvFont[6] =0;
ConvFont[7] =0;
if(y < 8){
WriteInstruct('0', GLCD_SET_ADDR + (y * 8)); //rotate y
WriteInstruct('0', GLCD_PAGE_ADDR + x); //rotate x
}else{
WriteInstruct('1', GLCD_SET_ADDR + ((y - 8) * 8)); //rotate y
WriteInstruct('1', GLCD_PAGE_ADDR + x); //rotate x
}
RotChar(&font[character-0x20][0],ConvFont);
for(i = 0; i < 8; i++){
if(y < 8)
WriteData('0',ConvFont[i] );
else
WriteData('1',ConvFont[i] );
}
}
void WriteCom(uint8_t LcdCS, uint8_t LcdData)
{
uint8_t x,y;
WriteInstruct(LcdCS,GLCD_START_LINE);
if(LcdCS == '0'){
for(y=0;y<8;y++){
WriteInstruct('0', GLCD_PAGE_ADDR+y); //y
WriteInstruct('0', GLCD_SET_ADDR); //x
for(x=0;x<64;x++){
WriteData('0', LcdData);
}
}
}else if(LcdCS == '1'){
for(y=0;y<8;y++){
WriteInstruct('1', GLCD_PAGE_ADDR+y);
WriteInstruct('1', GLCD_SET_ADDR);
for(x=0;x<64;x++){
WriteData('1', LcdData);
}
}
}
}
void ForceDly(uint8_t i)
{
uint8_t k;
for(k=0;k<i;k++){
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
}
void WriteInstruct(uint8_t LcdCS, uint8_t Command)
{
#ifdef ADDRESS
if(LcdCS == '0') GLCD_IW_CS1 = Command;
if(LcdCS == '1') GLCD_IW_CS2 = Command;
PORTD |= 0x80;
asm("nop");
PORTD &= 0x80;
#ifdef UCOSII
OSTimeDlyHMSM(0, 0, 0, 2);
#else
TimeDly(2);
#endif //UCOSII
#else
PORTF = Command;
if(LcdCS == '0'){
PORTD &= GLCD_I_MASK;
PORTD |= GLCD_IW_H_1;
asm("nop");
PORTD &= GLCD_I_MASK;
PORTD |= GLCD_IW_L_1;
}else if(LcdCS == '1'){
PORTD &= GLCD_I_MASK;
PORTD |= GLCD_IW_H_2;
asm("nop");
PORTD &= GLCD_I_MASK;
PORTD |= GLCD_IW_L_2;
}
#ifdef UCOSII
OSTimeDlyHMSM(0, 0, 0, 2);
#else
TimeDly(2);
#endif //UCOSII
#endif //ADDRESS
}
void WriteData(uint8_t LcdCS, uint8_t Data)
{
#ifdef ADDRESS
if(LcdCS == '0') GLCD_DW_CS1 = Data;
if(LcdCS == '1') GLCD_DW_CS2 = Data;
PORTD |= 0x80;
asm("nop");
PORTD &= 0x80;
#ifdef UCOSII
OSTimeDlyHMSM(0, 0, 0, 2);
#else
TimeDly(1);
#endif //UCOSII
#else
PORTF = Data; //Set Addr
if(LcdCS == '0'){
PORTD &= GLCD_I_MASK;
PORTD |= GLCD_DW_H_1; // Instruction Write
asm("nop");
PORTD &= GLCD_I_MASK;
PORTD |= GLCD_DW_L_1;
}else if(LcdCS == '1'){
PORTD &= GLCD_I_MASK;
PORTD |= GLCD_DW_H_2; // Instruction Write
asm("nop");
PORTD &= GLCD_I_MASK;
PORTD |= GLCD_DW_L_2;
}
#ifdef UCOSII
OSTimeDlyHMSM(0, 0, 0, 2);
#else
TimeDly(1);
#endif //UCOSII
#endif //ADDRESS
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -