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

📄 lcd.c

📁 IAR fjor ARM LPC2148 GPIO使用实验
💻 C
字号:
//lcd.c
#include <string.h>
#include "lcd.h"

unsigned long data;

//HD44780 4位间接驱动需要的E端片选脉冲
void E_Pulse() {
  IO0SET_bit.P0_28 = 1; // E=1
  Delay(100);
  IO0CLR_bit.P0_28 = 1; // E=0
}

void LCDInit() {
//配置4位数据线 D4, D5, D6, D7, 寄存器选择 RS, 读写 RW, 片选 E 为输出
  IO0DIR_bit.P0_10 = 1;   //D4
  IO0DIR_bit.P0_11 = 1;   //D5
  IO0DIR_bit.P0_12 = 1;   //D6
  IO0DIR_bit.P0_13 = 1;   //D7
  IO0DIR_bit.P0_22 = 1;   //RS
  IO0DIR_bit.P0_29 = 1;   //R/W
  IO0DIR_bit.P0_28 = 1;   //E

 //LCD 初始化,4位间接驱动方式
  IO0CLR_bit.P0_22 = 1;  // RS = 0
  IO0CLR_bit.P0_29 = 1;  // R/W = 0
  IO0CLR_bit.P0_28 = 1;  // E = 0
  Delay(10000);        // 延时110ms

  IO0SET_bit.P0_10 = 1;   // D4 = 1
  IO0SET_bit.P0_11 = 1;   // D5 = 1
  E_Pulse();              // E端片选脉冲
  Delay(10000);           // 延时10ms

  IO0SET_bit.P0_10 = 1;   // D4 = 1
  IO0SET_bit.P0_11 = 1;   // D5 = 1
  E_Pulse();              // E端片选脉冲
  Delay(10000);           // 延时10ms

  IO0SET_bit.P0_10 = 1;   // D4 = 1
  IO0SET_bit.P0_11 = 1;   // D5 = 1
  E_Pulse();              // E端片选脉冲
  Delay(10000);           // 延时10ms

  IO0SET_bit.P0_11 = 1;   // D5 = 1
  IO0CLR_bit.P0_10 = 1;   // D4 = 0
  E_Pulse();              // E端片选脉冲
}

void LCDSendCommand(unsigned long a) {  //向LCD发送控制命令
  IO0CLR_bit.P0_29 = 1;                     // RW = 0
  Delay(20000);                             // 延时2ms
  data = 0x0;

  data = 0xffffff0f | a;                    // 高4位
  IO0CLR |= 0x00003c00;                     // 清0 D4-D7
  data = data << 6;

  IO0SET = (IO0SET | 0x00003c00) & data;     // 置1 D4-D7
  IO0CLR_bit.P0_22 = 1;                      // RS = 0 -> 命令方式
  E_Pulse();                                 // E端片选脉冲
  data = 0x0;
  a = a<<4;

  data = 0xffffff0f | a;                     // 高4位
  IO0CLR |= 0x00003c00;                      // 清0 D4-D7
  data = data << 6;
  IO0SET = (IO0SET | 0x00003c00) & data;      // 置1 D4-D7
  IO0CLR_bit.P0_22 = 1;                       // RS = 0 -> 命令方式
  E_Pulse();                                  // E端片选脉冲
}

void LCDSendChar(unsigned long a){ //向LCD发送控显示数据
  IO0CLR_bit.P0_29 = 1;                     // RW = 0
  Delay(20000);                             // 延时2ms
  data = 0x0;

  data = 0xffffff0f | a;                    // 高4位
  IO0CLR |= 0x00003c00;                     // 清0 D4-D7
  data = data << 6;

  IO0SET = (IO0SET | 0x00003c00) & data;    // 置1 D4-D7
  IO0SET_bit.P0_22 = 1;                     // RS = 1  -> 数据方式
  E_Pulse();                                // E端片选脉冲
  data = 0x0;
  a = a<<4;

  data = 0xffffff0f | a;                     // 高4位
  IO0CLR |= 0x00003c00;                      // 清0 D4-D7
  data = data << 6;
  IO0SET = (IO0SET | 0x00003c00) & data;     // 置1 D4-D7
  IO0SET_bit.P0_22 = 1;                      // RS = 1  -> 数据方式
  E_Pulse();                                 // E端片选脉冲
}

void LCDSendTxt(char* a) {   //向LCD写入字符串
  for(int i=0; i<strlen(a); i++) {
    LCDSendChar(a[i]);
  }
}

void Light(short a) {
  if(a == 1) {               // 按键1压下,开启LCD背光
    IO0SET_bit.P0_21 = 1;
    IO0DIR_bit.P0_21 = 1;
    IO0SET_bit.P0_25 = 1;
    IO0DIR_bit.P0_25 = 1;
  }
  if(a == 0) {               // 按键2压下,关闭LCD背光
    IO0SET_bit.P0_21 = 0;
    IO0DIR_bit.P0_21 = 0;
    IO0SET_bit.P0_25 = 0;
    IO0DIR_bit.P0_25 = 0;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -