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

📄 19264.c

📁 AVR单片机学习笔记
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
19264 LCD C语言驱动
参考ICCAVR资料和网上的资料改写 
LCD引脚定义
*/
#include <iom16v.h>
#include <macros.h>

/* 当前行、列存储,行高16点,列宽8点 */
unsigned char CurOffset,CurRow,CurPage,CurCol;	
long int j;
unsigned char pages,i;

/*  常量定义  */
#define LCD_STATUS_BUSY 0x80
#define  START_LINE0   0xc0
#define  DISPLAY_ON    0x3f
#define  DISPLAY_OFF   0x3e
#define  PARA1         0x40
//PORTA---数据口  PORTB----控制口
#define LCD_DIR_PORT	DDRB
#define LCD_IP_PORT		PINB
#define LCD_OP_PORT		PORTB

#define LCD_EN_PORT		PORTA
#define LCD_CS2_PORT	PORTA
#define LCD_CS1_PORT	PORTA
#define LCD_CS3_PORT	PORTA
#define LCD_RW_PORT		PORTA
#define LCD_DI_PORT		PORTA

#define LCD_DI_BIT		BIT(0)//0x80
#define LCD_RW_BIT		BIT(1)//0x40
#define LCD_EN_BIT		BIT(2)//0x20
#define LCD_CS1_BIT		BIT(3)//0x10
#define LCD_CS2_BIT		BIT(4)//0x08
#define LCD_CS3_BIT		BIT(5)//0x10

#define SET_LCD_E		LCD_EN_PORT |= LCD_EN_BIT    //LCD使能
#define CLEAR_LCD_E		LCD_EN_PORT &= ~LCD_EN_BIT   //LCD禁止

#define SET_LCD_DATA	LCD_DI_PORT |= LCD_DI_BIT    //选择数据端口
#define SET_LCD_CMD		LCD_DI_PORT &= ~LCD_DI_BIT   //选择指令端口

#define SET_LCD_READ	LCD_RW_PORT |= LCD_RW_BIT    //读模式
#define SET_LCD_WRITE	LCD_RW_PORT &= ~LCD_RW_BIT   //写模式

#define SET_LCD_CS2     LCD_CS2_PORT |= LCD_CS2_BIT  //左屏选择禁止
#define CLEAR_LCD_CS2   LCD_CS2_PORT &= ~LCD_CS2_BIT //左屏选择使能

#define SET_LCD_CS1     LCD_CS1_PORT |= LCD_CS1_BIT  //左屏选择禁止
#define CLEAR_LCD_CS1   LCD_CS1_PORT &= ~LCD_CS1_BIT //左屏选择使能

#define SET_LCD_CS3     LCD_CS3_PORT |= LCD_CS3_BIT  //左屏选择禁止
#define CLEAR_LCD_CS3   LCD_CS3_PORT &= ~LCD_CS3_BIT //左屏选择使能

#define LEFT 10
#define MID 01
#define RIGHT 11
#define CMD 0
#define DATA 1
unsigned char num;

void LCD_BUSY(unsigned char lr) //判断忙标志
{
	unsigned char status;
    CLI();
	if(lr==LEFT)
	{	
		SET_LCD_CS2;   //cs1=1
		SET_LCD_CS3;	
	    CLEAR_LCD_CS1; //cs2=0
		
	}
	
	else if(lr==MID)
	{
	 	 SET_LCD_CS1;
		 SET_LCD_CS3;
		 CLEAR_LCD_CS2;
	}
	
	else if(lr==RIGHT)
	{
		SET_LCD_CS1;   //cs2=1
    	SET_LCD_CS2;
		CLEAR_LCD_CS3; //cs1=0
	}	
	SET_LCD_CMD;
    LCD_DIR_PORT = 0x00;
    //LCD_OP_PORT = 0xff;		
    SET_LCD_READ;
    SET_LCD_E;					
    asm("nop");	asm("nop");
    asm("nop");	asm("nop");
	asm("nop");	asm("nop");
    while((LCD_IP_PORT) & LCD_STATUS_BUSY)
    {
        CLEAR_LCD_E;	   		
		asm("nop");	asm("nop");
		asm("nop");	asm("nop");
		asm("nop");	asm("nop");
		SET_LCD_E;
		asm("nop");	asm("nop");
		asm("nop");	asm("nop");
		asm("nop");	asm("nop");
    }
    CLEAR_LCD_E;
    SET_LCD_WRITE;
    //LCD_OP_PORT = 0xff;
    SEI();
}

void write_LCD(unsigned char lr,unsigned char cd,unsigned char data) /*写入指令或数据*/
{	
    CLI();
	LCD_BUSY(lr);
	if(cd==CMD)	SET_LCD_CMD;
	else SET_LCD_DATA;
    SET_LCD_WRITE; 
	SET_LCD_E;
    LCD_DIR_PORT = 0xff;
    LCD_OP_PORT = data;
    asm("nop");	asm("nop");
    asm("nop");	asm("nop");
    CLEAR_LCD_E;
	asm("nop");	asm("nop");
    asm("nop");	asm("nop");
  //  //LCD_OP_PORT = 0xff;
    SEI();
}
unsigned char read_LCD(unsigned char lr)	  /*  读显示数据 */
{
	unsigned char data;

    CLI();
	LCD_BUSY(lr);
	SET_LCD_DATA;
    LCD_DIR_PORT = 0x00;
    ////LCD_OP_PORT = 0xff;
    SET_LCD_READ;
	SET_LCD_E;
	asm("nop");	asm("nop");
    asm("nop");	asm("nop");
	asm("nop");	asm("nop");
    data=LCD_IP_PORT;
    CLEAR_LCD_E;
	asm("nop");	asm("nop");
	asm("nop");	asm("nop");
    SET_LCD_WRITE;

	LCD_BUSY(lr);
	SET_LCD_DATA; 
    LCD_DIR_PORT = 0x00;
    ////LCD_OP_PORT = 0xff;
    SET_LCD_READ; 
	SET_LCD_E;
    asm("nop");	asm("nop");
	asm("nop");	asm("nop");
	asm("nop");	asm("nop");
    data=LCD_IP_PORT;
    CLEAR_LCD_E;
	asm("nop");	asm("nop");
	asm("nop");	asm("nop");
    SET_LCD_WRITE;

    SEI();
	return data;
}

void set_start_line_L(unsigned char line) /*设置显示起始行*/ //0-63
{
	write_LCD(LEFT,CMD,0xc0|line); 
}

void set_start_line_R(unsigned char line) /*设置显示起始行*/ //0-63
{
	write_LCD(RIGHT,CMD,0xc0|line); 
}

void set_start_line_M(unsigned char line) /*设置显示起始行*/ //0-63
{
	write_LCD(MID,CMD,0xc0|line); 
}

void set_page_L(unsigned char page)	/*设置X地址 设置页*/ //0-7
{
	write_LCD(LEFT,CMD,0xb8|page);                     
}

void set_page_M(unsigned char page)	/*设置X地址 设置页*/  //0-7
{
	write_LCD(MID,CMD,0xb8|page);                     
}
void set_page_R(unsigned char page)	/*设置X地址 设置页*/ //0-7
{
	write_LCD(RIGHT,CMD,0xb8|page);                     
}

void set_col_addr_L(unsigned char col) /*设置Y地址*/ //0-63
{
	write_LCD(LEFT,CMD,0x40|col);                     
}
void set_col_addr_M(unsigned char col) /*设置Y地址*/ //0-63
{
	write_LCD(MID,CMD,0x40|col);                     
}

void set_col_addr_R(unsigned char col) /*设置Y地址*/ //0-63
{
	write_LCD(RIGHT,CMD,0x40|col);                     
}

void init_lcd(void) /*初始化函数*/
{   set_start_line_M(0); /*显示起始行为0*/
	set_start_line_L(0); /*显示起始行为0*/
	set_start_line_R(0); /*显示起始行为0*/
	write_LCD(MID,CMD,DISPLAY_ON); /*  开显示  */
	write_LCD(LEFT,CMD,DISPLAY_ON); /*  开显示  */
	write_LCD(RIGHT,CMD,DISPLAY_ON); /*  开显示  */
	
}

void clr_lcd(void) /*清屏函数*/
{
	unsigned char pages,i;
	for(pages=0;pages<8;pages++)
		{
			
			set_page_M(pages);   /* X 页地址 */
			set_page_R(pages);  /* X 页地址 */
			set_page_L(pages);  /* X 页地址 */
			for(i=0;i<64;i++)   
				{
					set_col_addr_M(i);//Y
					set_col_addr_R(i);//Y
					set_col_addr_L(i);//Y
					write_LCD(MID,DATA,0x00);
					write_LCD(LEFT,DATA,0x00);
					write_LCD(RIGHT,DATA,0x00);
				}
			
		}
}

/*************************************/
/*             绘点函数              */
/*************************************/

void pixel(unsigned char xx,unsigned char yy,unsigned char flag)
{
	unsigned int y,ch;
	ch=yy%8;  //余数

	y=1;
	for(;ch!=0;)
		{
			y=y*2;
			ch--;
		}
	if(xx>=128)
		{
		    set_page_R(yy/8);
			set_col_addr_R(xx-128);	
			ch=read_LCD(RIGHT);
			set_col_addr_R(xx-128);
			if(flag)
				write_LCD(RIGHT,DATA,ch|y);
			else
			{
				y=~y;
				ch&=y;
				write_LCD(RIGHT,DATA,ch|y);
			}
			}
	else if(xx>=64)
		{
			set_page_M(yy/8);
			set_col_addr_M(xx-64);	
			ch=read_LCD(MID);
			set_col_addr_M(xx-64);
			if(flag)
				write_LCD(MID,DATA,ch|y);
			else
			{
				y=~y;
				ch&=y;
				write_LCD(MID,DATA,ch|y);
			}
		}
	else
		{
			set_page_L(yy/8);
			set_col_addr_L(xx);	
			ch=read_LCD(LEFT);
			set_col_addr_L(xx);	
			if(flag)
				write_LCD(LEFT,DATA,ch|y);
			else
			{
				y=~y;
				ch&=y;
				write_LCD(LEFT,DATA,ch|y);
			}
		}
}

//ASCII 字模宽度及高度
#define ASC_CHR_WIDTH	8
#define ASC_CHR_HEIGHT	12

typedef struct typFNT_ASC16	/* 汉字字模显示数据结构 */
{
	unsigned char Index[1];
  	char Msk[16];
};
struct typFNT_ASC16 const ASC_16[] = {	/* 显示为8*16  Curier 10 常规*/

"1",0x00,0x00,0x08,0x08,0xFC,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x07,0x04,0x04,0x00,
1,0x00,0x00,0x08,0x08,0xFC,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x07,0x04,0x04,0x00,
"2",0x00,0x00,0x08,0x04,0x84,0x44,0x38,0x00,0x00,0x00,0x06,0x05,0x04,0x04,0x04,0x00,
2,0x00,0x00,0x08,0x04,0x84,0x44,0x38,0x00,0x00,0x00,0x06,0x05,0x04,0x04,0x04,0x00,
"3",0x00,0x00,0x08,0x04,0x44,0x44,0xB8,0x00,0x00,0x00,0x02,0x04,0x04,0x04,0x03,0x00,
3,0x00,0x00,0x08,0x04,0x44,0x44,0xB8,0x00,0x00,0x00,0x02,0x04,0x04,0x04,0x03,0x00,
"4",0x00,0x00,0x80,0x60,0x18,0xFC,0x00,0x00,0x00,0x00,0x01,0x01,0x05,0x07,0x05,0x00,
4,0x00,0x00,0x80,0x60,0x18,0xFC,0x00,0x00,0x00,0x00,0x01,0x01,0x05,0x07,0x05,0x00,
"5",0x00,0x00,0x7C,0x44,0x44,0x44,0x84,0x00,0x00,0x00,0x02,0x04,0x04,0x04,0x03,0x00,
5,0x00,0x00,0x7C,0x44,0x44,0x44,0x84,0x00,0x00,0x00,0x02,0x04,0x04,0x04,0x03,0x00,
"6",0x00,0x00,0xF0,0x48,0x44,0x44,0x80,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x00,
6,0x00,0x00,0xF0,0x48,0x44,0x44,0x80,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x00,
"7",0x00,0x00,0x0C,0x04,0x84,0x64,0x1C,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,
7,0x00,0x00,0x0C,0x04,0x84,0x64,0x1C,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,
"8",0x00,0x00,0xB8,0x44,0x44,0x44,0xB8,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x00,
8,0x00,0x00,0xB8,0x44,0x44,0x44,0xB8,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x00,
"9",0x00,0x00,0x38,0x44,0x44,0x44,0xF8,0x00,0x00,0x00,0x00,0x04,0x04,0x02,0x01,0x00,
9,0x00,0x00,0x38,0x44,0x44,0x44,0xF8,0x00,0x00,0x00,0x00,0x04,0x04,0x02,0x01,0x00,
"0",0x00,0x00,0xF8,0x04,0x04,0x04,0xF8,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x00,
0,0x00,0x00,0xF8,0x04,0x04,0x04,0xF8,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x00,
".",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00,0x00,
":",0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,
" ",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
"(",0x00,0x00,0x00,0xE0,0x18,0x04,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x10,0x00,0x00,
")",0x00,0x00,0x00,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x00,0x10,0x0C,0x03,0x00,0x00,

};

#define ASC_HZ_WIDTH	12
//#define ASC_HZ_HEIGHT	12

typedef struct typFNT_GB16	/*12*16 汉字字模显示数据结构 */
{
	char Index[2];
	char Msk[24];

⌨️ 快捷键说明

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