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

📄 lcd_bk.c

📁 ucosii的源代码希望能给予学习嵌入式系统的朋友一定的帮助
💻 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 + -