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

📄 lcd.c

📁 Firmware for lpc2148, including mmc, uart, rtc, lcd, interrupts
💻 C
字号:
//lcd.c
#include <string.h>
#include "lcd.h"

unsigned long data;
void Delay (unsigned long a) { while (--a!=0); }

void E_Pulse()
{
  IOSET0_bit.P0_28 = 1; //set E to high
  //Delay(10);
  Delay(100);
  IOCLR0_bit.P0_28 = 1; //set E to low
}

void LCDInit()
{
  //first set D4, D5, D6, D7, RS, RW, E to output ports
  IODIR0_bit.P0_10 = 1;   //D4
  IODIR0_bit.P0_11 = 1;   //D5
  IODIR0_bit.P0_12 = 1;   //D6
  IODIR0_bit.P0_13 = 1;   //D7
  IODIR0_bit.P0_22 = 1;   //RS
  IODIR0_bit.P0_29 = 1;   //R/W
  IODIR0_bit.P0_28 = 1;   //E


  //LCD initialization
  //step by step (from Gosho) - from DATASHEET

  IOCLR0_bit.P0_22 = 1;  //set RS port to 0
  IOCLR0_bit.P0_29 = 1;  //set R/W port to 0
  IOCLR0_bit.P0_28 = 1;  //set E port to 0

  //Delay(110000);        //delay ~110ms
  Delay(10000);        //delay ~110ms

  IOSET0_bit.P0_10 = 1;   //set D4 port to 1
  IOSET0_bit.P0_11 = 1;   //set D5 port to 1
  E_Pulse();            //high->low to E port (pulse)
  //Delay(10000);         //delay ~10ms
  Delay(10000);         //delay ~10ms


  IOSET0_bit.P0_10 = 1;   //set D4 port to 1
  IOSET0_bit.P0_11 = 1;   //set D5 port to 1
  E_Pulse();            //high->low to E port (pulse)
  //Delay(10000);         //delay ~10ms
  Delay(10000);         //delay ~10ms


  IOSET0_bit.P0_10 = 1;   //set D4 port to 1
  IOSET0_bit.P0_11 = 1;   //set D5 port to 1
  E_Pulse();            //high->low to E port (pulse)
  //Delay(10000);         //delay ~10ms
  Delay(10000);         //delay ~10ms

  IOSET0_bit.P0_11 = 1;   //set D5 port to 1
  IOCLR0_bit.P0_10 = 1;   //set D4 port to 0
  E_Pulse();            //high->low to E port (pulse)

}

void LCDSendCommand(unsigned long a)
{
  IOCLR0_bit.P0_29 = 1;                     //set RW port to 0

  //Delay(2000);                            //delay for LCD char ~2ms
  Delay(20000);                             //delay for LCD char ~2ms
  data = 0x0;

  data = 0xffffff0f | a;                    //get high 4 bits
  IOCLR0 |= 0x00003c00;                     //clear D4-D7
  data = data << 6;

  IOSET0 = (IOSET0 | 0x00003c00) & data;     //set D4-D7
  IOCLR0_bit.P0_22 = 1;                      //set RS port to 0 -> display set to comand mode
  E_Pulse();                                 //pulse to set d4-d7 bits


  //data = (a << 4) & 0x000000f0;   	    //get low 4 bits
  //IOCLR |= 0x000000f0;                    //clear D4-D7
  //data = data <<4;
  data = 0x0;
  a = a<<4;

  data = 0xffffff0f | a;                     //get high 4 bits
  IOCLR0 |= 0x00003c00;                      //clear D4-D7
  data = data << 6;
  IOSET0 = (IOSET0 | 0x00003c00) & data;      //set D4-D7
  IOCLR0_bit.P0_22 = 1;                       //set RS port to 0 -> display set to command mode
  E_Pulse();                                  //pulse to set d4-d7 bits

}

void LCDSendChar(unsigned long a)
{

  IOCLR0_bit.P0_29 = 1;                    //set RW port to 0

  //Delay(2000);                           //delay for LCD char ~2ms
  Delay(20000);                            //delay for LCD char ~2ms
  data = 0x0;

  data = 0xffffff0f | a;                    //get high 4 bits
  IOCLR0 |= 0x00003c00;                     //clear D4-D7
  data = data << 6;

  IOSET0 = (IOSET0 | 0x00003c00) & data;    //set D4-D7
  IOSET0_bit.P0_22 = 1;                     //set RS port to 0 -> display set to comand mode
  E_Pulse();                                //pulse to set d4-d7 bits


  //data = (a << 4) & 0x000000f0;   	    //get low 4 bits
  //IOCLR |= 0x000000f0;                    //clear D4-D7
  //data = data <<4;
  data = 0x0;
  a = a<<4;


  data = 0xffffff0f | a;                      //get high 4 bits
  IOCLR0 |= 0x00003c00;                       //clear D4-D7
  data = data << 6;
  IOSET0 = (IOSET0 | 0x00003c00) & data;      //set D4-D7
  IOSET0_bit.P0_22 = 1;                       //set RS port to 0 -> display set to command mode
  E_Pulse();                                  //pulse to set d4-d7 bits

}

void LCDSendTxt(char* a)
{
  for(int i=0; i<strlen(a); i++)
  {
    LCDSendChar(a[i]);
  }
}

void SmartUp(void)
{
  for(int i=0; i<40; i++) LCDSendCommand(CUR_RIGHT);
}

void SmartDown(void)
{
  for(int i=0; i<40; i++) LCDSendCommand(CUR_LEFT);
}

void Light(short a)
{
  if(a == 1)
  {
    IOSET0_bit.P0_21 = 1;
    IODIR0_bit.P0_21 = 1;

    IOSET0_bit.P0_25 = 1;
    IODIR0_bit.P0_25 = 1;

  }
  if(a == 0)
  {
    IOSET0_bit.P0_21 = 0;
    IODIR0_bit.P0_21 = 0;


    IOSET0_bit.P0_25 = 0;
    IODIR0_bit.P0_25 = 0;
  }

}

⌨️ 快捷键说明

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