📄 lcd1602.c
字号:
//**********************************
//*名称: LCD1602显示驱动程序
//*硬件: ATMEGA162,16MHz
//* MCU --- LCD
//* PA --- DATA
//* PB0 --- RS
//* PB1 --- RW
//* PB2 --- E
//*编译: ICCAVR6.31
//*版本: 2007-V1.0
//**********************************
#include <iom162v.h>
#include <lcd1602.h>
//**********************************
//* 主函数
//**********************************
void main(void)
{
unsigned char j;
SPL=0XFF; // 堆栈初始化
SPH=0X04;
Lcd1602_init();
Lcd1602_display_string(0,0," LCD-1602 MICRODESIGN 2007");
while(1)
{
}
}
//**********************************
//* LCD1602硬件接口初始化
//**********************************
void Lcd1602_io_init(void)
{
LCD_DATA_DIR=0XFF;
LCD_DATA_PORT=0X00; // 数据端口设置为输出,初始值为0
LCD_CN_DIR=0XFF; // 控制端口设置为输出
LCD_CN_PORT&=~(1<<LCD_CS); // LCD片选E=0,不选中
LCD_CN_PORT&=~(1<<LCD_RS); // LCD数据类型RS=0,指令模式
LCD_CN_PORT&=~(1<<LCD_RW); // LCD数据读写R/W=0,写模式
asm("nop");
}
//**********************************
//* LCD1602初始化
//**********************************
void Lcd1602_init(void)
{
Lcd1602_io_init(); // 硬件接口初始化
Delay_us(15000); // 延时15ms
Lcd1602_wr_cmd(0x38); // 功能设置,8位,2行,5X7字体
Lcd1602_wr_cmd(0x08); // 显示关闭
Lcd1602_wr_cmd(0x01); // 清屏
Delay_us(3000);
Lcd1602_wr_cmd(0x0C); // 显示打开
Lcd1602_wr_cmd(0x06); // 光标移动设置
}
//**********************************
//* LCD1602显示一个字符
//* x,y表示第几个,在第几行
//* data要显示字符的ASCII码
//**********************************
void Lcd1602_display_char(unsigned char x,unsigned char y,unsigned data)
{
if(y==0)
{
x&=0x0F; // 确保X不超出16
Lcd1602_wr_cmd(x|0x80); // 写入地址指令
Lcd1602_wr_data(data); // 写入字符数据
}
else if(y==1)
{
x&=0x0F; // 确保X不超出16
x+=0x40; // 第二行显示地址对应在0x40开始
Lcd1602_wr_cmd(x|0x80); // 写入地址指令
Lcd1602_wr_data(data); // 写入字符数据
}
}
//**********************************
//* LCD1602显示字符串
//* x,y表示第几个,在第几行开始
//* data要显示字符的ASCII码
//**********************************
void Lcd1602_display_string(unsigned char x,unsigned char y,unsigned char *data)
{
unsigned char counter;
counter=x; // 显示位置指针,用于自动换行
if(y==0)
{
x&=0x0F; // 确保X不超出16
Lcd1602_wr_cmd(x|0x80); // 写入地址指令
}
else if(y==1)
{
x&=0x0F; // 确保X不超出16
x+=0x40; // 第二行显示地址对应在0x40开始
Lcd1602_wr_cmd(x|0x80); // 写入地址指令
}
while(*data)
{
if( (y==0)&(counter==16) ) // 判断是否要换行
{
Lcd1602_wr_cmd(0xC0); // 写入地址指令
}
Lcd1602_wr_data(*data); // 写入字符数据
data++;
counter++;
}
}
//**********************************
//* LCD1602写命令
//**********************************
void Lcd1602_wr_cmd(unsigned char data)
{
LCD_DATA_PORT=data; // 将命令数据写入
LCD_CN_PORT&=~(1<<LCD_RS); // LCD片选RS=0,指令模式
LCD_CN_PORT&=~(1<<LCD_RW); // LCD数据读写R/W=0,写模式
LCD_CN_PORT|=(1<<LCD_CS); // LCD片选E=1,选中
asm("nop");
asm("nop");
LCD_CN_PORT&=~(1<<LCD_CS); // LCD片选E=0,不选中
Delay_us(200);
}
//**********************************
//* LCD1602写数据
//**********************************
void Lcd1602_wr_data(unsigned char data)
{
LCD_DATA_PORT=data; // 将命令数据写入
LCD_CN_PORT|=(1<<LCD_RS); // LCD片选RS=1,数据模式
LCD_CN_PORT&=~(1<<LCD_RW); // LCD数据读写R/W=0,写模式
LCD_CN_PORT|=(1<<LCD_CS); // LCD片选E=1,选中
asm("nop");
asm("nop");
LCD_CN_PORT&=~(1<<LCD_CS); // LCD片选E=0,不选中
Delay_us(200);
}
//**********************************
//* us级延时函数
//**********************************
void Delay_us(unsigned int time)
{
unsigned int i;
for(i=0;i<time;++i)
{
asm("nop");
asm("nop");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -