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

📄 lcm_240128.h

📁 基于AVR和51的240*128液晶显示模块驱动程序。很有用的喔~
💻 H
📖 第 1 页 / 共 2 页
字号:
#include <iom16v.h>
#define _LCM_240128_

/*
#ifndef __stdio_h__
	#include <stdio.h>
#endif
*/
//以下头文件只在高级绘图函数中使用
/*
#ifndef __stdlib_h__
	#include <stdlib.h>     // rand()
#endif
#ifndef __string_h__
	#include <string.h>     // strlen()
#endif
#ifndef __math_h__
	#include <math.h>       // cos(),sin()
#endif
*/

//引脚定义
#define LCD_WR		0		//第0脚
#define LCD_RD		1		//第1脚
#define LCD_CE		2		//第2脚
#define LCD_CD		3		//第3脚
#define LCD_CTRL_DDR		DDRB		//控制线连接的端口
#define LCD_CTRL_PORT		PORTB
#define LCD_DATA_PORT 		PORTC		//数据线连接的端口
#define LCD_DATA_PIN		PINC
#define LCD_DATA_DDR		DDRC

/* ----- 定义液晶屏内部RAM  ------ */
#define LCD_TEXT_BASE 0x00            // 文本区内存首地址
#define LCD_GRAPH_BASE 0x300            // 图形区内存首地址
#define LCD_WIDTH 30         // 定义屏幕文本宽度为30字节

// 绘图坐标限制
#define LCD_X_MAX 240        
#define LCD_X_MIN 0
#define LCD_Y_MAX 128
#define LCD_Y_MIN 0

//液晶命令字
#define COMM_SET_CURPOS     0x21        //设置光标地址,双参数,x地址,y地址
#define COMM_SET_OFFSET     0x22        //设置偏移量寄存器,双参数,偏移量,0
#define COMM_SET_POSITION   0x24        //设置地址指针,双参数,低地址,高地址
#define COMM_SET_CBUFFER    0x40        //设置文本区起始地址,双参数,低地址,高地址
#define COMM_SET_CWIDTH     0x41        //设置文本区宽度,单参数,宽度
#define COMM_SET_GBUFFER    0x42        //设置图形区起始地址,双参数,低地址,高地址,可以实现滚屏效果
#define COMM_SET_GWIDTH     0x43        //设置图形区宽度,单参数,宽度
#define COMM_SET_MODE       0x80        //设置显示模式,将功能号与指令相或,无参数,功能:0-或;1-异或;3-与;4-文字属性
#define COMM_DISP_OFF       0x90        //显示开,无参数
#define COMM_CUR_SHOW       0x92        //显示光标,闪烁关,无参数
#define COMM_CUR_FLASH      0x93        //显示光标,闪烁开,无参数
#define COMM_TEXT_ONLY      0x94        //纯文本显示模式,无参数
#define COMM_GRAPH_ONLY     0x98        //纯图形显示模式,无参数
#define COMM_TEXT_GRAPH     0x9c        //文本+图形显示模式,无参数
#define COMM_CUR_MODE       0xa0        //光标高度,无参数,高度与指令相或,高度范围: 0~7
#define COMM_AUTO_WRITE     0xb0        //启动自动写模式,无参数
#define COMM_AUTO_READ      0xb1        //启动自动读模式,无参数
#define COMM_EXIT_AUTOMODE  0xb2        //退出自动模式,无参数
#define COMM_WRITE_PUP      0xc0        //写入一个字节,地址指针自动+1,单参数,待写入的数据
#define COMM_WRITE_PDOWN    0xc2        //写入一个字节,地址指针自动-1,单参数,待写入的数据
#define COMM_WRITE_PSTAY    0xc4        //写入一个字节,地址指针不变,单参数,待写入的数据
#define COMM_READ_PUP       0xc1        //读出一个字节,地址指针自动+1,无参数
#define COMM_READ_PDOWN     0xc3        //读出一个字节,地址指针自动-1,无参数
#define COMM_READ_PSTAY     0xc5        //读出一个字节,地址指针不变,无参数
#define COMM_SCREEN_PEEK    0xe0        //屏幕读取,无参数
#define COMM_SCREEN_COPY    0xe8        //屏幕复制,无参数
#define COMM_BIT_SET        0xf8        //设置位,将要清除的位号与指令相或,无参数,位:0~7
#define COMM_BIT_CLR        0xf0        //清除位,将要清除的位号与指令相或,无参数,位:0~7


//定义宏
#define Lcd_Set_WR() 	LCD_CTRL_DDR |=(0x01<<LCD_WR);		LCD_CTRL_PORT  |= (0x01<<LCD_WR)
#define Lcd_Clr_WR()  	LCD_CTRL_DDR |=(0x01<<LCD_WR);		LCD_CTRL_PORT  &= (~(0x01<<LCD_WR))
#define Lcd_Set_RD() 	LCD_CTRL_DDR |=(0x01<<LCD_RD);		LCD_CTRL_PORT  |= (0x01<<LCD_RD)
#define Lcd_Clr_RD()  	LCD_CTRL_DDR |=(0x01<<LCD_RD);		LCD_CTRL_PORT  &= (~(0x01<<LCD_RD))
#define Lcd_Set_CE() 	LCD_CTRL_DDR |=(0x01<<LCD_CE);		LCD_CTRL_PORT  |= (0x01<<LCD_CE)
#define Lcd_Clr_CE()  	LCD_CTRL_DDR |=(0x01<<LCD_CE);		LCD_CTRL_PORT  &= (~(0x01<<LCD_CE))
#define Lcd_Set_CD() 	LCD_CTRL_DDR |=(0x01<<LCD_CD);		LCD_CTRL_PORT  |= (0x01<<LCD_CD)
#define Lcd_Clr_CD()  	LCD_CTRL_DDR |=(0x01<<LCD_CD);		LCD_CTRL_PORT  &= (~(0x01<<LCD_CD))
#define Lcd_SET_DATADIR_OUT()	LCD_DATA_DDR = 0xff
#define Lcd_SET_DATADIR_IN()	LCD_DATA_DDR = 0x00

//声明函数
void Lcd_SendDat(unsigned char dat); 			// 写数据
void Lcd_RW_Check(void) ;  						// 读状态
void Lcd_SendCom0(unsigned char Comm);			// 写无参数命令
void Lcd_SendCom1(unsigned char dat,unsigned char Comm);	//写单参数命令
void Lcd_SendCom2(unsigned char dat0,unsigned char dat1,unsigned char Comm);	//写双参数命令
//unsigned char glcd_dget(void);    			// 读数据

void Lcd_Setup(void);			 					// 初始化控制线的电位
void Lcd_Init(void);     			 				// 初始化显存和显示方式

void Lcd_Locate(unsigned char x,unsigned char y); 	// 设置显示坐标(文本模式)
void Lcd_PrintText(unsigned char x,unsigned char y,unsigned char *string);  // 显示字符串RAM

void Lcd_ClrScreen(void);
void Lcd_ClrText(void);  		 				// 文本清屏
void Lcd_ClrGraph(void) ;    					// 图形清屏

void Lcd_Point(unsigned char x, unsigned char y, char draw);	//画、清点
void Lcd_Line(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char draw) ;	//画直线
void Lcd_Circle(unsigned char x, unsigned char y, unsigned char r, unsigned char draw);		//画圆
void Lcd_Box(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char draw, unsigned char fill);	//画矩形

void delay_us(unsigned char us)
{
	while (--us);
}

//读取状态字节
void Lcd_RW_Check(void)  
{
	unsigned char Status;
	Lcd_SET_DATADIR_IN();
	do
	{	
		Lcd_Set_CD();		// C/D高,读状态字节
		Lcd_Clr_CE();		// CE低,开片选信号
		Lcd_Clr_RD();		// RD低,打开读信号
		Status = LCD_DATA_PIN;      // 读取状态字节
		Lcd_Set_RD();         // 关闭读信号
		Lcd_Set_CE();         // CE高,关闭片选
		Status &= 0x03;
	}
	while (Status != 0x03);
}
//************************************************************************************************************//
// 写数据
void Lcd_SendDat(unsigned char dat) 
{
	Lcd_RW_Check(); // 等待屏幕可用
	Lcd_SET_DATADIR_OUT(); 		// 数据口转换为输出口
	Lcd_Clr_CD();
	Lcd_Clr_CE();					// 低电平脉冲大于80ns
	LCD_DATA_PORT = dat;          // 写数据到数据口             	
	Lcd_Clr_WR();         			
	Lcd_Set_WR();                 // WR拉高
	Lcd_Set_CE();                 // CE拉高
}

// 写无参数命令
void Lcd_SendCom0(unsigned char Comm) 
{
	Lcd_RW_Check(); // 等待屏幕可用
	Lcd_SET_DATADIR_OUT(); // 数据口转换为输出口
	Lcd_Set_CD();
	Lcd_Clr_CE();
	LCD_DATA_PORT = Comm;  // 送数据到数据口
	Lcd_Clr_WR();
	Lcd_Set_WR();         // WR置高
	Lcd_Set_CE();         // CE置高
}

//写单参数命令
void Lcd_SendCom1(unsigned char dat,unsigned char Comm)
{
 	 Lcd_SendDat(dat);
	 Lcd_SendCom0(Comm); 	 
}

//写双参数命令
void Lcd_SendCom2(unsigned char dat0,unsigned char dat1,unsigned char Comm)
{
 	 Lcd_SendDat(dat0);
	 Lcd_SendDat(dat1);
	 Lcd_SendCom0(Comm); 	 
}
//*********************************************************************************************************//

// 读数据
/*
unsigned char glcd_dget(void)      
{
	unsigned char glcd_byte;
	do {} while ((0x03 & glcd_sget()) != 0x03); // 等待屏幕可用
	glcd_SET_DATADIR_IN(); // 设置数据口为输入口
	glcd_cd_low();   // C/D置低
	glcd_rd_low();   // 读置低
	glcd_ce_low();   // CE置低
	_NOP();
	_NOP();
	glcd_byte = LCD_DATA_PIN;  // 读取数据
	glcd_rd_high();   // RD置高
	glcd_ce_high();   // CE置高
	return(glcd_byte);
}
*/
//*************************************************************************************************//
//设置文本指针地址
void Lcd_Locate(unsigned char x,unsigned char y)
{
	unsigned int addr;
	addr = y * LCD_WIDTH + x + LCD_TEXT_BASE;
	Lcd_SendCom2((unsigned char)(addr),(addr>>8),COMM_SET_POSITION);
}

//*************************************************************************************************//

//**************************************************************************************************//
//清全部32KB内存
void Lcd_ClrScreen(void)    
{
	unsigned int i;
	Lcd_SendCom2(0,0,COMM_SET_POSITION);	//设置指针地址为0
	for (i=0;i<0x8000;i++)
		Lcd_SendCom1(0x00,COMM_WRITE_PUP);    // 0xc0为数据写入、增加指针 命令
}

//文本清屏
void Lcd_ClrText(void)
{
	unsigned int i;   
	Lcd_SendCom2((unsigned char)(LCD_TEXT_BASE),(LCD_TEXT_BASE>>8),COMM_SET_POSITION);     // 设置地址为文本区基地址
	for (i=0;i<480;i++)
		Lcd_SendCom1(0,COMM_WRITE_PUP);    // 0xc0为数据写入、增加指针 命令
}

// 图形清屏
void Lcd_ClrGraph(void)    
{
	unsigned int i;
	Lcd_SendCom2((unsigned char)(LCD_GRAPH_BASE),(LCD_GRAPH_BASE>>8),COMM_SET_POSITION);     // 设置地址为图形区基地址
	for (i=0;i<3840;i++)	// 必须为3840
		Lcd_SendCom1(0x00,COMM_WRITE_PUP);    // 0xc0为数据写入、增加指针 命令
}
//**************************************************************************************************//


//**************************************************************************************************//
// 显示字符串RAM
void Lcd_PrintText(unsigned char x,unsigned char y, unsigned char *str)  
{
	unsigned char c;
	Lcd_Locate(x,y);
	while (c=*str) 
	{
		Lcd_SendCom1(c-0x20,COMM_WRITE_PUP);          // 转换ASCII码为屏幕内码, 写字符,增加内部RAM指针
		str++;
	}
}


//画、清点函数

⌨️ 快捷键说明

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