📄 lcd1602.c
字号:
//******************************************************************************
// *
// FileName : 实验板1602lcd.c ICCAVR V6.31A编译 *
// Function : 1602字符型LCD的显示 (8位数据方式) *
// Date : 2006-12-11 *
// Version : 1.0 *
// *
// Author : 开关电源 hongtusy@163.com *
// Company : 电子信息技术咨询网 http://www.itsn.cn *
// *
//***************************描述与记事*****************************************
//实验板的AVR程序,驱动1602LCM(可显示2行,每行16个字符)模块显示实验练习。
//说明:RS高显示/低指令输入 RW高读/低写 EN高读数据/下降沿写数据
//具体电路可参照使用指南里的说明。每个字符为5×7或5×8的点阵,共16×2个字符。
//使用器件:ATMEGA8535,可更换。 使用默认的片内RC振荡器,1MHz。
//接线定义:PD4,5,6 为RS,R/W,EA。数据位为PC口。
//使用的开关:SW2-1,2,3.SW1-1,2,3,4,5,6,7,8.SW2-5为背光开关。 SW3-8为系统复位端。
//记事:
//******************************************************************************
#include <iom8535v.h> //头文件,ATmega8535单片机的寄存器定义
#include "macros.h" //可以使用NOP()以及SEI()等指令.
typedef unsigned char uchar; //宏
typedef unsigned int uint;
/************************************************
函 数 名: DelaymS()
功 能: 毫秒级延时函数
输入参数: 延迟时间/系统晶体
输出参数: 做相应的延迟处理
描 述: /
***********************************************/
void DelaymS (uint i) //延时函数,参数i为延时时间
{
uint j,k; //双重延时
for (j=0;j<i;j++)
{
for (k=0;k<=50;k++);
}
}
/************************************************
函 数 名: init_mcu()
功 能: 单片机初始化函数
输入参数: /
输出参数: /
描 述: 相关口方向的设置等
***********************************************/
void init_mcu(void)
{
DDRC = 0xff; //PC口为推挽1输出,数据位
DDRD = 0xff; //PD口为推挽1输出,控制信号
}
/********************************************************
子程序名: write_data()
功 能: 写入一字节数据
输入参数: /
输出参数: /
描 述: /
********************************************************/
void write_data(uchar h)
{
PORTC = h; //先将数据送出
PORTD |= (1<<PD4); //RS=1,数据
PORTD &= ~(1<<PD5); //R/W=0,写
PORTD &= ~(1<<PD6); //EN=0 ,使能,产生一个下降沿。
DelaymS (1);
PORTD |= (1<<PD6); //EN=1 ,除能
}
/********************************************************
子程序名: write_code()
功 能: 写入一字节指令/地址
输入参数: /
输出参数: /
描 述: /
********************************************************/
void write_code(uchar h)
{
PORTC = h; //先将地址送出
PORTD &= ~(1<<PD4); //RS=0,命令或数据
PORTD &= ~(1<<PD5); //R/W=0,写
PORTD &= ~(1<<PD6); //EN=0 ,使能,产生一个下降沿。
DelaymS (1);
PORTD |= (1<<PD6); //EN=1 ,除能
}
/********************************************************
子程序名: init_lcd()
功 能: 初始化LCD
输入参数: /
输出参数: /
描 述: /
********************************************************/
void init_lcd(void)
{
write_code(0x01); //清除屏幕
write_code(0x38); //功能设定,8位数据口/2行/5*7的点阵
write_code(0b00001111); //显示幕ON,光标ON,闪烁ON
write_code(0x06); //模式,加1,显示幕ON。
write_code(0b00000011); //光标回到原点
}
/********************************************************
子程序名: display_lcd()
功 能: 刷新显示一屏数据,独立的LCD显示程序,用户将显存内容更新后,只要调用此程序即可更新显示。
输入参数: /
输出参数: /
描 述: 在写一个字符前,先设定显示的位置地址,然后再写数据。系统可以自动地址加一。
********************************************************/
void display_lcd(uchar *p)
{
uchar i;
write_code(0x80); //第一行起始地址,0b10000000B=0x80.
for(i=0;i<16;i++)
{
write_data(p[i]);
}
write_code(0xc0); //第二行起始地址,0b11000000B=0xc0.
for(i=16;i<32;i++)
{
write_data(p[i]);
}
}
//*****************主程序**********************************
void main (void)
{
uchar i;
uchar buf[]=" welcome! www.itsn.cn! ";
DelaymS(100);
init_mcu(); //单片机初始化
init_lcd(); //lcd初始化
display_lcd(buf); //刷新显示一屏
buf[0] = 'i'; //可以任意修改显示的内容
display_lcd(buf); //刷新显示
write_code (0xC0); //光标停留在0C2H位置。第1行光标位置有0x80,0x81...0x8f,第2行光标位置有0xc0,0xc1...0xcf.
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -