📄 lcd.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 + -