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

📄 1602a_4line.c

📁 1602A字符型小液晶4线驱动程序 第一次修改整理:2007.06.25 第二次修改整理:2007.07.20 基于ICCAVR开发环境
💻 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 + -