LCD

该博客围绕LCD显示展开,提供了一系列命令函数,如lcd_command用于执行对LCD的操作,还有不同显示模式设置、清屏、初始化等函数。同时给出了LCD一行5*10显示和两行5*7显示的应用实例程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/********************************************************
------------------------LCD命令函数----------------------
功能描述:被调用,用来执行对LCD的操作
*********************************************************/
void lcd_command()
{
 _asm NOP
 _asm NOP
 LCD_EN=1;     //LCD开始接受数据,置使能位为1
    _asm NOP     //等待
 _asm NOP      
    LCD_EN=0;     //LCD结束接受数据,置使能位为0
 asm       //等待40us
 {
  PSHH
  PSHX
  PSHA
  LDHX #$0020
  LOOP:
  DBNZX LOOP
  PULA
  PULX
  PULH
 }
 
}
/********************************************************
------------------------LCD功能设置----------------------
功能描述:将LCD设置成8位数据接口,1行显示,5*10点阵模式,并将
    全局变量lcd_data[16]全部清为空白
全局变量:lcd_data[16]
调用函数:lcd_command()
*********************************************************/
void lcd_1_line_display()
{
 byte i;
 LCD_DB=0x34;          //功能设置:8位数据接口,1行显示,5*10点阵模式
 asm       //等待20us

 {
  PSHH
  PSHX
  PSHA
  LDHX #$0010
  LOOP:
  DBNZX LOOP
  PULA
  PULX
  PULH
 }
 lcd_command();
 for(i=0;i<16;i++)
 {
  lcd_data[i]=' ';
 }
}
/********************************************************
------------------------LCD功能设置----------------------
功能描述:将LCD设置成8位数据接口,2行显示,5*7点阵模式,并将
    全局变量lcd_data[2][16]全部清为空白
全局变量:lcd_data[2][16]
调用函数:lcd_command()
*********************************************************/

void lcd_2_line_display()
{
 
    byte i,j;
    LCD_DB=0x38;          //功能设置:8位数据接口,2行显示,5*7点阵模式
    asm       //等待20us
 {
  PSHH
  PSHX
  PSHA
  LDHX #$0010
  LOOP:
  DBNZX LOOP
  PULA
  PULX
  PULH
 }
    lcd_command();
 for(j=0;j<2;j++)    //将lcd_data[2][16]全部清为空白
 {
  for(i=0;i<16;i++)
  {
   lcd_data[j][i]=' ';
  }
 }
}
/********************************************************
------------------------LCD显示设置----------------------
功能描述:将LCD设置成不同的显示模式
传入参数:cursor_display
参数设置:cursor_display=0b00000011
    开显示,开光标显示,闪烁
   
    cursor_display=0b00000010
    开显示,开光标显示,不闪烁
   
    cursor_display=0b00000001
    开显示,关光标显示,闪烁
   
    cursor_display=0b00000000
    开显示,关光标显示,不闪烁
调用函数:lcd_command()
*********************************************************/
void lcd_cursor(byte cursor_display)
{
 switch(cursor_display)
 {
  case 0b00000011:
   LCD_DB=0b00001111;   //显示开关控制:开显示,开光标显示,闪烁
   lcd_command();
   break;
  case 0b00000010:
   LCD_DB=0b00001110;   //显示开关控制:开显示,开光标显示,不闪烁
   lcd_command();
   break;
  case 0b00000001:
   LCD_DB=0b00001101;   //显示开关控制:开显示,关光标显示,闪烁
   lcd_command();
   break;
  case 0b00000000:
   LCD_DB=0b00001100;         //显示开关控制:开显示,关光标显示,不闪烁
       lcd_command();
       break;
     }
}
/********************************************************
------------------------LCD显示关闭----------------------
功能描述:将LCD显示关掉
调用函数:lcd_command()
*********************************************************/
void lcd_display_off()
{
 LCD_DB=0b00001000;     //显示开关设置:关显示,关光标显示,不闪烁
 lcd_command();
}
/********************************************************
------------------------LCD清屏--------------------------
功能描述:将LCD清屏,DD RAM的内容全部被清除,光标回原位,
    地址计数器AC=0
调用函数:lcd_command()
*********************************************************/
void lcd_clear_display()
{
 LCD_DB=0x01;      //清屏指令
    lcd_command();     
    asm        //等待清屏完毕,等待时间>1.6ms
    {
  LDHX #$2DF
  ClrLCD_2MS:
  AIX #-1
  CPHX #0
  BNE ClrLCD_2MS
 }
}
/********************************************************
------------------------LCD初始化------------------------
功能描述:将LCD初始化
调用函数:lcd_command()
    lcd_2_line_display()
    lcd_cursor(byte cursor_display)
    lcd_clear_display()
*********************************************************/
void init_lcd()
{
 LCD_RS=0;        //令LCD的RS=0,R/W=0,进行LCD初始化
 LCD_RW=0;
 lcd_2_line_display();
 lcd_cursor(0b11);
 lcd_clear_display();
 LCD_DB=0x06;          //输入方式设置:数据读写操作后,AC自动增1,显示不动,光标左移
 lcd_command();
 LCD_DB=0x14;          //光标移位设置:光标右移一个字符位,AC自动加1
 lcd_command();
}
/********************************************************
------------------------LCD一行显示----------------------
功能描述:将data[16]中的数据显示在LCD上
传入参数:data[16]
调用函数:lcd_command()
*********************************************************/

void show_lcd_1_line(byte data[16])
{
 byte i;
 i=0;
 LCD_RS=0;        //令LCD的RS=0,R/W=0,进行显示数据寄存器(DD RAM)地址设置
 LCD_RW=0; 
 LCD_DB=0x80;         //设置前16个字符首DD RAM地址
 lcd_command();
 LCD_RS=1;        //令LCD的RS=1,R/W=0,写入数据到DD RAM中
 LCD_RW=0;
 while(i<16)
 {
  LCD_DB=data[i];       //将数据data[i]放入LCD_DB口作为LCD的输入
  lcd_command();
  i++;
 }
}
/********************************************************
------------------------LCD两行显示----------------------
功能描述:将data[2][16]中的数据显示在LCD上
传入参数:data[2][16]
调用函数:lcd_command()
*********************************************************/

void show_lcd_2_line(byte data[2][16])
{
 byte i;
 i=0;
 LCD_RS=0;        //令LCD的RS=0,R/W=0,进行显示数据寄存器(DD RAM)地址设置
 LCD_RW=0;  
 LCD_DB=0x80;          //设置前16个字符首DD RAM地址
 lcd_command();
 LCD_RS=1;        //令LCD的RS=1,R/W=0,写入数据到DD RAM中
 LCD_RW=0;
 while(i<16)
 {
  LCD_DB=data[0][i];       //将数据data[0][i]放入LCD_DB口作为LCD的输入
  lcd_command();
  i++;
 }
    //-------------------------------------------//
    i=0;
 LCD_RS=0;        //令LCD的RS=0,R/W=0,进行显示数据寄存器(DD RAM)地址设置
 LCD_RW=0;
 LCD_DB=0xc0;          //设置后16个字符首DD RAM地址
 lcd_command();
 LCD_RS=1;        //令LCD的RS=1,R/W=0,写入数据到DD RAM中
 LCD_RW=0;
 while(i<16)
 {
  LCD_DB=data[1][i];       //将数据data[1][i]放入LCD_DB口作为LCD的输入
  lcd_command();
  i++;
 }
}

应用实例:

一个LCD两行5*7显示的程序

#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908GP32.h> /* include peripheral declarations */
#define LCD_DB PTB
#define LCD_RS PTC_PTC0
#define LCD_RW PTC_PTC1
#define LCD_EN PTC_PTC2
byte lcd_data[2][16];
void lcd_command();
void lcd_2_line_display();
void lcd_cursor(byte cursor_display);
void lcd_clear_display();
void init_lcd();
void show_lcd_2_line(byte data[2][16]);//在这个函数里最好将第二个循环的次数设成10,以便观察光标及闪烁.
void main(void)
{
 CONFIG1=0x01;   //禁止看门狗
 DDRB=0xff;      //B口为输出
 DDRC=0x07;      //C口的PTC0-2为输出
 init_lcd();
 lcd_data[0][0]=0x31;
 lcd_data[1][0]=0x32;
 show_lcd_2_line(lcd_data);
 for(;;);
}

一个LCD一行5*10显示的程序

#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908GP32.h> /* include peripheral declarations */
#define LCD_DB PTB
#define LCD_RS PTC_PTC0
#define LCD_RW PTC_PTC1
#define LCD_EN PTC_PTC2
byte lcd_data[16];
void lcd_command();
void lcd_1_line_display();
void lcd_cursor(byte cursor_display);
void lcd_clear_display();
void init_lcd();                 //注意要将这里的show_lcd_2_line改成show_lcd_1_line
void show_lcd_1_line(byte data[16]);        //在这个函数里最好将循环的次数设成10,以便观察光标及闪烁.
void main(void)
{
 CONFIG1=0x01;   //禁止看门狗
 DDRB=0xff;      //B口为输出
 DDRC=0x07;      //C口的PTC0-2为输出
 init_lcd();
 lcd_data[0]=0x31;
 lcd_data[1]=0x32;
 show_lcd_1_line(lcd_data);
 for(;;);
}


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值