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

📄 lcd.c

📁 使用AVR单片机实现的万年历功能,其中使用了ds1302和1602
💻 C
字号:
#include "lcd.h"
#include <delay.h>
#include <string.h>

//函数void LcdWriteData(unsigned char data)用于向LCD写入一个数据

void LcdWriteData(unsigned char data)
{
	AVRSetLcdDataPortWriteMode;  
	LCD1602SetWriteMode;
	LCD1602SetDataMode;
	LCD1602ClrEnable;
	#asm("nop")
	#asm("nop")
	LCD1602WriteDataPort = data;
	LCD1602SetEnable;
	#asm("nop")
	#asm("nop")
	LCD1602ClrEnable;
	#asm("nop")
	#asm("nop")
}

//函数void LcdWriteInstruction(unsigned char data)用于向LCD写入一个指令

void LcdWriteInstruction(unsigned char data)
{
	AVRSetLcdDataPortWriteMode;
	LCD1602SetWriteMode;
	LCD1602SetInstructionMode;
	LCD1602ClrEnable;
	#asm("nop")
	#asm("nop")
	LCD1602WriteDataPort = data;
	LCD1602SetEnable;
	#asm("nop")
	#asm("nop")
	LCD1602ClrEnable;
	#asm("nop")
	#asm("nop")
}

//函数unsigned char LcdReadInstruction(void)用于从液晶读取指令

unsigned char LcdReadInstruction(void)
{
	unsigned char data;
	AVRSetLcdDataPortReadMode;
	LCD1602SetReadMode;
	LCD1602SetInstructionMode;
	LCD1602ClrEnable;
	#asm("nop")
	#asm("nop")
	LCD1602SetEnable;
	#asm("nop")
	#asm("nop")
	data = LCD1602ReadDataPort;
	LCD1602ClrEnable;
	#asm("nop")
	#asm("nop")
	return data;
}

//函数unsigned char LcdReadData(void)用于从液晶读取一个字节的数据

unsigned char LcdReadData(void)
{
	unsigned char data;
	AVRSetLcdDataPortReadMode;
	LCD1602SetReadMode;
	LCD1602SetDataMode;
	LCD1602ClrEnable;
	#asm("nop")
	#asm("nop")
	LCD1602SetEnable;
	#asm("nop")
	#asm("nop")
	data = LCD1602ReadDataPort;
	LCD1602ClrEnable;
	#asm("nop")
	#asm("nop")
	return data;
}

//函数void LcdCheckBusy(void)用于跳过液晶的忙状态

void LcdCheckBusy(void)
{
	
	while (0x80 == (LcdReadInstruction() & 0x80))
	{
	}

}

//函数void LcdClear(void)用于液晶清屏

void LcdClear(void)
{
	LcdCheckBusy();
	LcdWriteInstruction(0x01);
}

//函数void LcdInit(void)用于初始化液晶

void LcdInit(void)
{
	AVRInitLcdControlPort;
	delay_ms(15);
	LcdWriteInstruction(0x38);  //LCD内部要求,初始化的时候连续三次设置显示模式
	delay_ms(5);
	LcdWriteInstruction(0x38);
	delay_ms(5);
	LcdWriteInstruction(0x38);
	LcdCheckBusy();
	LcdWriteInstruction(0x38);	//8位数据接口
	LcdCheckBusy();
	LcdWriteInstruction(0x08);	//关显示
	LcdCheckBusy();
	LcdWriteInstruction(0x01);	//清屏
	LcdCheckBusy();
	LcdWriteInstruction(0x06);	//读或者写一个字符后地址指针加1
	LcdCheckBusy();
	LcdWriteInstruction(0x0C);	//开显示,不显示光标
}

//函数void LcdSetXY(unsigned char x, unsigned char y)用于指定液晶数据写入的地址

void LcdSetXY(unsigned char x, unsigned char y)
{
	unsigned char addr;
	addr = 0x80 + x * 0x40 + y;	//计算地址
	LcdCheckBusy();
	LcdWriteInstruction(addr);
}

//函数void LcdPutOneChar(unsigned char c)用于向液晶输入一个显示数据

void LcdPutOneChar(unsigned char c)
{
	LcdCheckBusy();
	LcdWriteData(c);
}

//函数void LcdPutFlashString(unsigned char flash *str)用于向液晶输入位于Flash中的一个字符串

void LcdPutFlashString(unsigned char flash *str)
{
	unsigned char i;
	i = 0;

	while (str[i] != '\0')
	{
		LcdCheckBusy();
		LcdWriteData(str[i]);
		i++;
	}

}

//函数void LcdPutRamString(unsigned char *str)用于向液晶输入位于Ram中的一个字符串

void LcdPutRamString(unsigned char *str)
{
	unsigned char i;
	i = 0;

	while (str[i] != '\0')
	{
		LcdCheckBusy();
		LcdWriteData(str[i]);
		i++;
	}

}

⌨️ 快捷键说明

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