lcd1602

lcd1602液晶操作方法

控制任务:在显示屏上显示两行字,同时移动它们。

程序如下:

#include <reg52.h>

typedef unsigned int uint;
typedef unsigned char uchar;

sbit lcden = P3 ^ 4;  // lcd使能
sbit lcdrs = P3 ^ 5;  // lcd数据和指令选择
sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;

void init();
void writeCommand(uchar command);
void writeData(uchar dat);
void showMessage(uchar* message, uchar posCursor);
void clearMessage();
void delay5ms();
void delay100ms();
void moveString(uchar* message, uchar direction);

void main() {

  uchar* message1 = "I like programming";
  uchar* message2 = "Hello, World!";

  init();
  showMessage(message1, 0x00);
  // clearMessage();
  showMessage(message2, 0x40);

  // 当移动两个message2时,整个屏幕上的字符都会移动
  moveString(message2, 0);
  while (1)
    ;
}

/**
 * @brief  移动指定字符串
 * @note
 * @param  message: 待移动的字符串,移动前首先要在lcd缓存中
 * @param  direction: 0 向左,1向右
 * @retval None
 */
void moveString(uchar* message, uchar direction) {
  for (; *message != '\0'; message++) {
    if (direction == 0) {
      writeCommand(0x18);
    } else if (direction == 1) {
      writeCommand(0x1c);
    }
    delay100ms();
  }
}

/**
 * @brief  清屏
 * @note
 * @retval None
 */
void clearMessage() { writeCommand(0x01); }

/**
 * @brief  在指定的位置显示指定的字符
 * @note
 * @param  message: 显示的字符
 * @param  posCursor: 字符的启示位置,0x00第一行首显示,0x40第二行首
 * @retval None
 */
void showMessage(uchar* message, uchar posCursor) {
  uchar firstPos = 0x80;
  writeCommand(firstPos + posCursor);
  for (; *message != '\0'; message++) {
    writeData(*message);
  }
}

/**
 * @brief  发送数据给LED
 * @note   write_data('1'), 发送字符1,显示在led屏上
 * @param  dat: 待发送的数据
 * @retval None
 */
void writeData(uchar dat) {
  lcdrs = 1;
  P0 = dat;
  delay5ms();
  lcden = 1;
  delay5ms();
  lcden = 0;
  delay5ms();
}

/**
 * @brief  发送指令
 * @note
 * @param  command: 为待发送的指令码
 * @retval None
 */
void writeCommand(uchar command) {
  lcdrs = 0;  // lcdrs为数据和命令选择,低电平为命令,高电平为数据
  P0 = command;
  delay5ms();
  lcden = 1;
  delay5ms();
  lcden = 0;
  delay5ms();
}

/**
 * @brief  初始化相关设置,其中dula,wela为关闭数码管,防止干扰
 * @note
 * @retval None
 */
void init() {
  dula = 0;
  wela = 0;
  lcden = 0;  // lcd使能
  writeCommand(0x38);
  writeCommand(0x0e);
  writeCommand(0x06);
  writeCommand(0x01);
}

void delay5ms()  //@11.0592MHz
{
  unsigned char i, j;

  i = 54;
  j = 199;
  do {
    while (--j)
      ;
  } while (--i);
}

void delay100ms()  //@11.0592MHz
{
  unsigned char i, j;

  i = 180;
  j = 73;
  do {
    while (--j)
      ;
  } while (--i);
}

猜你喜欢

转载自www.cnblogs.com/TomDing/p/9072435.html