C语言程序>>LCD1602

来源:互联网 发布:双端面磨床 知乎 编辑:程序博客网 时间:2024/06/05 07:30
 
    unsigned char address;
    if (y == 0)
  address = 0x80 + x;
    else
       address = 0xc0 + x;
    LCD_write_char( address, 0 );
  }*/

/********************************************************************
函 数 名: LCD_write_char
功能描述: 写入LCD命令或数据函数,时序参照LCD1602的Datasheet
函数说明: 当命令变量(LCD_Command)为0时写入数据,否则写入命令
调用函数: 无
全局变量: 无
输    入: LCD_Command(欲写入的命令),LCD_Data(欲写入的数据)
返    回: 无
**********************************************************************/
void LCD_write_char(unsigned char LCD_Command,unsigned char LCD_Data)
{
 LCD_DATA_DDR=0xff;//设置液晶数据口为输出
    /*if (busy)    // 是否判忙
    {
        ReadStatusLcd();
    }*/
 LCD_EN_LOW();
 if(LCD_Command==0)
 {
  LCD_RS_HIGH();
  LCD_RW_LOW();
  Delay10uS();
  LCD_EN_HIGH();
  Delay10uS();
  LCD_DATA_PORT=LCD_Data;//写入数据
  Delay10uS();
  LCD_EN_LOW();
  Delay10uS();
  LCD_RW_HIGH();
  Delay10uS();
 }
 else
 {
  LCD_RS_LOW();
  LCD_RW_LOW();
  
  Delay10uS();
  LCD_EN_HIGH();
  Delay10uS();
  LCD_DATA_PORT=LCD_Command;//写入命令
  Delay10uS();
  LCD_EN_LOW();
  Delay10uS();
  LCD_RW_HIGH();
  Delay10uS();
 }
}
/********************************************************************
函 数 名: DisplayOneChar
功能描述: LCD1602显示一个字节函数
函数说明: 无
调用函数: 无
全局变量: 无
输    入: XStart(显示位置X),YStart(显示位置Y),DData(显示的内容)
返    回: 无
**********************************************************************/
void DisplayOneChar(unsigned char XStart, unsigned char YStart, unsigned char DData)
{
    // 限制x不能大于16,y不能大于1
    YStart &= 0x01;    // Y的变化范围0 ~ 1
    XStart &= 0x0f;    // X的变化范围0 ~ 16

    if (YStart != 0)    // 若Y=1,显示第二行
    {
        // 当要显示第2行时地址码+40h
        XStart |= 0x40;
    }
    // 指令码为地址+0x80
    XStart |= DD_RAM;

 LCD_write_char(XStart,0);// 不检测忙信号,发送地址码
    DelayMS(1);
 LCD_write_char(0,DData);
    DelayMS(1);
}
/********************************************************************
函 数 名: DisplayListChar
功能描述: LCD1602显示字符串函数
函数说明: 无
调用函数: 无
全局变量: 无
输    入: XStart(显示位置X),YStart(显示位置Y),pData(显示字符串指针)
返    回: 无
**********************************************************************/
void DisplayListChar(unsigned char XStart, unsigned char YStart,char *pData)
{
    unsigned char ListLength = 0;    // 字符串长度

    // 限制x不能大于16,y不能大于1
    YStart &= 0x01;
    XStart &= 0x0f;

    // XStart坐标应小于16并且若到达字串尾则退出
    while (XStart <= 0x0f)
    {
        if (pData[ListLength] == '\0')
        {
            return;
        }
        // 显示单个字符
        DisplayOneChar(XStart, YStart, pData[ListLength]);
        ListLength++;
        XStart++;
    }
 DDRB = 0x00;
}

#ifndef _lcd1602_h
#define _lcd1602_h
//---------------------------------------------------------
// HD44780 LCD指令集
#define LCD_CLEAR_DISPLAY    0x01    // 清屏

// 光标归位设定,光标移到左上角
#define LCD_Return_Home        0x02
// 设定字符进入模式
// 模式1:光标左移一格,AC值减1,字符全部不动
#define LCE_MODE_SET1        0x04
// 模式2:光标不动,AC值减1,字符全部右移一格
#define LCE_MODE_SET2        0x05
// 模式3:光标右移一格,AC值加1,字符全部不动
#define LCE_MODE_SET3        0x06
// 模式4:光标不动,AC值加1,字符全部右移一格
#define LCE_MODE_SET4        0x07

// 显示器开关
#define LCD_DISPLAY_ON        0x08    // 关显示
// 光标设定模式1
// 光标会出现在地址计数器所指的位置,光标不闪烁
#define LCD_CURSOR_SET1        0x0E
// 光标设定模式2
// 光标会出现在地址计数器所指的位置,光标闪烁
#define LCD_CURSOR_SET2        0x0F
// 光标会出现在地址计数器所指的位置,光标不出现
#define LCD_CURSOR_SET3        0x0C

// 光标显示移位
// 光标左移1格,AC值减1
#define LCD_CURSOR_SHOW_SHIFT1    0x10
// 光标右移1格,AC值加1
#define LCD_CURSOR_SHOW_SHIFT2    0x11
// 字符和光标同时左移1格
#define LCD_CURSOR_SHOW_SHIFT3    0x12
// 字符和光标同时右移1格
#define LCD_CURSOR_SHOW_SHIFT4    0x13

// LCD功能设定(按4位数据)
// 单行显示,字体5x7
#define LCD_FUNCTION_SET01        0x20
// 单行显示,字体5x10
#define LCD_FUNCTION_SET02        0x24
// 双行显示,字体5x7
#define LCD_FUNCTION_SET03        0x28
// 双行显示,字体5x10
#define LCD_FUNCTION_SET04        0x2C

// LCD功能设定(按8位数据)
// 单行显示,字体5x7
#define LCD_FUNCTION_SET1        0x30
// 单行显示,字体5x10
#define LCD_FUNCTION_SET2        0x34
// 双行显示,字体5x7
#define LCD_FUNCTION_SET3        0x38
// 双行显示,字体5x10
#define LCD_FUNCTION_SET4        0x3C

//---------------------------------------
// 自定义字型RAM(CG RAM)地址初始
// #define CG_RAM_ADDRESS    0x40
// 数据显示RAM(DD RAM)地址初始
// #define DD_RAM_ADDRESS    0x80
// RAM类型
#define CG_RAM    0x40    // 自定义字型RAM
#define DD_RAM    0x80    // 数据显示RAM


/*****************************************************************************************
电路连接方式:
数据D0~D7-----PA
RS------------PG0(WR)
RW------------PG1(RD)
EN------------PC7
*****************************************************************************************/
//端口定义
/*
#define LCD_RS_DDR     DDRG
#define LCD_RS_PORT    PORTG
#define LCD_RS_PIN     0
 
#define LCD_RW_DDR     DDRG
#define LCD_RW_PORT    PORTG
#define LCD_RW_PIN     1

#define LCD_EN_DDR     DDRC
#define LCD_EN_PORT    PORTC
#define LCD_EN_PIN     7

#define LCD_DATA_PORT  PORTA
#define LCD_DATA_DDR   DDRA
#define LCD_DATA_PIN   PINA

#define LCD_RS_HIGH()     LCD_RS_PORT |=  _BV(LCD_RS_PIN)       //RS置高电平
#define LCD_RS_LOW()      LCD_RS_PORT &= ~_BV(LCD_RS_PIN)  //RS置低电平

#define LCD_RW_HIGH()     LCD_RW_PORT |=  _BV(LCD_RW_PIN)       //RW置高电平
#define LCD_RW_LOW()      LCD_RW_PORT &= ~_BV(LCD_RW_PIN)  //RW置低电平

#define LCD_EN_HIGH()     LCD_EN_PORT |=  _BV(LCD_EN_PIN)       //EN置高电平
#define LCD_EN_LOW()      LCD_EN_PORT &= ~_BV(LCD_EN_PIN)  //EN置低电平
*/


#define LCD_RS_DDR     DDRA
#define LCD_RS_PORT    PORTA
#define LCD_RS_PIN     4
 
#define LCD_RW_DDR     DDRA
#define LCD_RW_PORT    PORTA
#define LCD_RW_PIN     5

#define LCD_EN_DDR     DDRA
#define LCD_EN_PORT    PORTA
#define LCD_EN_PIN     6

#define LCD_DATA_PORT  PORTB
#define LCD_DATA_DDR   DDRB
#define LCD_DATA_PIN   PINB

#define LCD_RS_HIGH()     LCD_RS_PORT |=  _BV(LCD_RS_PIN)       //RS置高电平
#define LCD_RS_LOW()      LCD_RS_PORT &= ~_BV(LCD_RS_PIN)  //RS置低电平

#define LCD_RW_HIGH()     LCD_RW_PORT |=  _BV(LCD_RW_PIN)       //RW置高电平
#define LCD_RW_LOW()      LCD_RW_PORT &= ~_BV(LCD_RW_PIN)  //RW置低电平

#define LCD_EN_HIGH()     LCD_EN_PORT |=  _BV(LCD_EN_PIN)       //EN置高电平
#define LCD_EN_LOW()      LCD_EN_PORT &= ~_BV(LCD_EN_PIN)  //EN置低电平

 

//unsigned char X=0,Y=0;//全局变量,用于设置显示坐标

void LCD_Init(void);//液晶初始化函数
void LCD_set_xy( unsigned char xx, unsigned char yy );//设置显示的位置
void LCD_write_char(unsigned char LCD_Command,unsigned char LCD_Data);
void DisplayListChar(unsigned char XStart, unsigned char YStart,char *pData);//写入LCD命令或数据函数,时序参照LCD1602的Datasheet
int LCD_putc(unsigned char c);//标准输入流,写一个字节子函数
#endif 

原创粉丝点击