📄 1602a_4line.c
字号:
/*--------------------------------------------
第一次修改整理:2007.06.25
第二次修改整理:2007.07.20
--------------------------------------------*/
/////////////////////////
// 1602A_4Line显示模块 //
///////////////////////////////////////////
//***************************************//
//* 创建: 2007.4.20 Eric.韧 *//
//***************************************//
///////////////////////////////////////////
/*------宏定义------*/
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
#ifndef ulong
#define ulong unsigned long
#endif
/***************************************
1 GND
2 VCC
3 V0 -- 液晶驱动电源(对比度)
4 RS -- 0
5 R/W -- 1
6 E -- 2
11 D4 -- 4
12 D5 -- 5
13 D6 -- 6
14 D7 -- 7
15 LEDA-- 背光+5V
16 LEDK-- 背光地
***************************************/
/*======================================
字符液晶1602A接口
======================================*/
//LCD--MCU-------硬件接口
//io方向组
#define LCD_RS_DDR DDRD
#define LCD_RW_DDR DDRD
#define LCD_EN_DDR DDRD
#define LCD_DATA_DDR DDRD
#define LCD_init_DDR DDRD
//io端口组
#define LCD_EN_PORT PORTD
#define LCD_RW_PORT PORTD
#define LCD_RS_PORT PORTD
#define LCD_DATA_PORT PORTD
//io口读取
#define LCD_DATA_PIN PIND
//io端口位
#define LCD_RS 0x01
#define LCD_RW 0x02
#define LCD_EN 0x04
#define LCD_DATA 0xf0
//寄存器-------变量接口
#pragma data:data
uint lcd_out=123;
/*==============================================================*/
/*******************Public function prototypes*******************/
void LCD_init (void);
void LCD_write_char (uchar command, uchar data);
void LCD_wait_Ready (void);
void LCD_set_xy (uchar setX, uchar setY);
void LCD_write_string (uchar setX, uchar setY, uchar *s);
void LCD_write_number (uchar command, uchar number);
void LCD_N_number (uint setX, uint setY, ulong number, uint numN);
//void delay_nus (uint n);
//void delay_nms (uint n);
//清屏1.64ms
//显示开、光标关、闪烁关40us
//4位、2行、5x7 40us
//8位、2行、5x7
/*****************************************************************
光标命令
LCD_write_char(0x0e,0); //光标开
LCD_write_char(0x0d,0); //光标所在字符闪烁
LCD_write_char(0x0c,0); //光标关
*****************************************************************/
/*****************************************************************
* 名称: LCD_init
* 功能: LCD初始化
* 调用: LCD_write_char(0x28,0);
* 输入: 无
* 输出: 无
* 说明: 无
*****************************************************************/
void LCD_init(void)
{
delay_nms(15);
LCD_init_DDR|=0xff; //初始化接口方向为输出//=========
LCD_write_char(0x28,0); //4bit test
delay_nms(5);
LCD_write_char(0x28,0); //4bit test
delay_nms(5);
LCD_write_char(0x28,0); //4bit test
delay_nms(5);
LCD_write_char(0x0c,0); //显示开
delay_nms(1);
LCD_write_char(0x01,0); //显示清屏
delay_nms(2);
LCD_write_char(0x06,0); //显示光标移动设置
delay_nms(2);
}
/*****************************************************************
* 名称: LCD_write_char
* 功能: LCD数据命令写入
* 调用: LCD_wait_Ready();
* 输入: command, data
* 输出: 无
* 说明: 当command=0时,向LCD写入数据,否则向LCD写入命令
*****************************************************************/
void LCD_write_char(uchar command, uchar data)
{
uchar command_temp,data_temp;
command_temp = command;
data_temp = data;
LCD_wait_Ready();
LCD_RW_PORT &= ~LCD_RW; //RW=0
if (command == 0)
{
LCD_RS_PORT |= LCD_RS; //RS=1
LCD_DATA_PORT &= 0x0F;
LCD_DATA_PORT |= data_temp&0xf0; //send high 4bit
}
else
{
LCD_RS_PORT &= ~LCD_RS; //RS=0
LCD_DATA_PORT &= 0x0F;
LCD_DATA_PORT |= command_temp&0xf0;//send high 4bit
}
NOP();NOP();//40ns_Rup 或 40ns_数up
LCD_EN_PORT |= LCD_EN;
NOP();NOP();//20ns_E升 + 230ns_E宽
LCD_EN_PORT &= ~LCD_EN;
NOP();NOP();//20ns_E降+10ns_数hold 或 10ns_Rhold
command_temp=command_temp << 4; //send low 4bit
data_temp=data_temp << 4;
LCD_DATA_PORT &= 0x0f;//
if (command==0)
{
LCD_DATA_PORT |= data_temp&0xf0;
}
else
{
LCD_DATA_PORT |= command_temp&0xf0;
}
NOP();NOP();//40ns_Rup 或 40ns_数up
LCD_EN_PORT |= LCD_EN;
NOP();NOP();//20ns_E升 + 230ns_E宽
LCD_EN_PORT &= ~LCD_EN;
NOP();NOP();//20ns_E降+10ns_数hold 或 10ns_Rhold
}
/*****************************************************************
* 名称: LCD_wait_Ready
* 功能: LCD忙等待
* 调用: 无
* 输入: 无
* 输出: 无
* 说明: 无
*****************************************************************/
void LCD_wait_Ready(void) //等待LCD空闲
{
LCD_DATA_DDR &= ~0x80; //PD7 I/O口方向设置为输入
LCD_RW_PORT |= LCD_RW; //RW=1
LCD_RS_PORT &= ~LCD_RS; //RS=0
NOP();NOP();//40ns_Rup
LCD_EN_PORT |= LCD_EN; //EN=1
NOP();NOP();//20ns_E升 + 120ns_数up
while((LCD_DATA_PIN&0x80)!=0){;} //RW=1,读PD7,为0表示空闲;
LCD_EN_PORT &= ~LCD_EN; //EN=0
NOP();NOP();//20ns_E降 + 10ns_数hold
LCD_DATA_DDR |= 0xf0;
}
/*****************************************************************
* 名称: LCD_set_xy
* 功能: 设置LCD显示起始位置
* 调用: LCD_write_char(address, 0);
* 输入: setX, setY
* 输出: 无
* 说明: LCD第一行显示寄存器地址:0X80-0X8F
* LCD第一行显示寄存器地址:0XC0-0XCF
*****************************************************************/
void LCD_set_xy(uchar setX, uchar setY)
{
uchar address;
if (setY == 0)
{
address = 0x80 + setX;
}
else
{
address = 0xc0 + setX;
}
LCD_write_char(address, 0);
}
/*****************************************************************
* 名称: LCD_write_string
* 功能: 写入字符串
* 调用: LCD_set_xy(tempX, tempY);
* 输入: setX, setY, *s
* 输出: 无
* 说明: 无
*****************************************************************/
void LCD_write_string(uchar setX, uchar setY, uchar *s)
{
uchar tempX,tempY;
tempX=setX;
tempY=setY;
LCD_set_xy(tempX, tempY);
while (*s)
{
LCD_write_char(0, *s);
s++;
}
}
/*****************************************************************
* 名称: LCD_write_number
* 功能: 写入单个数字
* 调用: LCD_write_char(command, data);
* 输入: command, number
* 输出: 无
* 说明: NUMBER为0~9,对应寄存器地址:0x30-0x39
*****************************************************************/
void LCD_write_number(uchar command, uchar number)
{
uchar data=0x30;
data|=number;
LCD_write_char(command, data);
}
/*****************************************************************
* 名称: LCD_w_number
* 功能: 写入多个数字
* 调用: LCD_set_xy(setX-1+tempX, setY);
* LCD_write_number(0, number%10);
* 输入: setX, setY, number, numN
* 输出: 无
* 说明: ulong型 number 为10位数,最大值为: 4294967295
*****************************************************************/
void LCD_N_number(uint setX, uint setY, ulong number, uint numN)
{
uint tempX;
ulong num_temp;
num_temp=number;
for(tempX=numN; tempX>0; tempX--)
{
LCD_set_xy(setX-1+tempX, setY);
LCD_write_number(0, num_temp%10);
num_temp/=10;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -