PIC18F4550 + 16x2 LCD代码查询

时间:2016-06-01 14:28:08

标签: microcontroller lcd

我是MCU编程的初学者,也非常渴望了解它。最近我获得了“Aptinex开发板rev.6”,它已经附加了许多功能。我还买了一块PIC18F4550将它插在电路板上。我已经设法理解I / O操作的基础知识是如何工作的,但是现在我偶然发现了连接到开发板的LCD。我在谷歌的许多教程页面之一中发现了这些代码,并决定试用它,因为它看起来很简单。代码工作没有问题。

//File name 'LCD_Display_String_Original.c'
#define _XTAL_FREQ 8000000
#define RS LATD0
#define EN LATD1
#define D4 LATD2
#define D5 LATD3
#define D6 LATD4
#define D7 LATD5

#include <xc.h>
#include "lcd.h"

void delay_ms(unsigned int delay_value)
{
while(delay_value-- > 0)
// While desired delay value is more than 0, decrement that value by 1 after each 10ms
{
    __delay_ms(1);
    // Wait 10ms
}                       
}

int main()
{
TRISD = 0b00000000;
Lcd_Init();
while(1)
{
    Lcd_Clear();
    Lcd_Set_Cursor(1,1);
    Lcd_Write_String("Hello world!");
    delay_ms(1000);

}
}

我的问题是,有人可以请说明函数 Lcd_port(char a); 中的内容,位于lcd.h文件中。无法理解测试的条件以及它们的真假。

//File name 'lcd.h'
#include <xc.h>
#include <stdio.h>

void Lcd_Port(char a)
{
if(a & 1)
    D4 = 1;
else
    D4 = 0;

if(a & 2)
    D5 = 1;
else
    D5 = 0;

if(a & 4)
    D6 = 1;
else
    D6 = 0;

if(a & 8)
    D7 = 1;
else
    D7 = 0;
}

void Lcd_Cmd(char a)
{
RS = 0;             // => RS = 0
Lcd_Port(a);
EN  = 1;             // => E = 1
    __delay_ms(4);
    EN  = 0;             // => E = 0
}

Lcd_Clear()
{
Lcd_Cmd(0);
Lcd_Cmd(1);
}

void Lcd_Set_Cursor(char a, char b)
{
char temp,z,y;
if(a == 1)
{
  temp = 0x80 + b - 1;
    z = temp>>4;
    y = temp & 0x0F;
    Lcd_Cmd(z);
    Lcd_Cmd(y);
}
else if(a == 2)
{
    temp = 0xC0 + b - 1;
    z = temp>>4;
    y = temp & 0x0F;
    Lcd_Cmd(z);
    Lcd_Cmd(y);
}
}

void Lcd_Init()
{
Lcd_Port(0x00);
__delay_ms(20);
Lcd_Cmd(0x03);
__delay_ms(5);
Lcd_Cmd(0x03);
__delay_ms(11);
Lcd_Cmd(0x03);

Lcd_Cmd(0x02);
Lcd_Cmd(0x02);
Lcd_Cmd(0x08);
Lcd_Cmd(0x00);
Lcd_Cmd(0x0C);
Lcd_Cmd(0x00);
Lcd_Cmd(0x06);
}

void Lcd_Write_Char(char a)
{
char temp,y;
temp = a&0x0F;
y = a&0xF0;
RS = 1;             // => RS = 1
Lcd_Port(y>>4);             //Data transfer
EN = 1;
__delay_us(40);
EN = 0;
Lcd_Port(temp);
EN = 1;
__delay_us(40);
EN = 0;
}

void Lcd_Write_String(char *a)
{
int i;
for(i=0;a[i]!='\0';i++)
   Lcd_Write_Char(a[i]);
}

void Lcd_Shift_Right()
{
Lcd_Cmd(0x01);
Lcd_Cmd(0x0C);
}

void Lcd_Shift_Left()
{
Lcd_Cmd(0x01);
Lcd_Cmd(0x08);
}

如前所述,代码完美无缺。我真的需要有人来解释这部分是如何工作的。任何帮助将受到高度赞赏!

0 个答案:

没有答案