📄 lcm_240128.h
字号:
#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 + -