技术热线: 4007-888-234

如何使用pic16f877单片机在16×2字符LCD上显示ASCII字符?

更新时间: 2019-11-07
阅读量:3281

在单片机应用方案中开发中,想要在LCD显示ASCII字符并不难。下面英锐恩单片机开发工程师们分享了一个使用pic16f877单片机在16×2字符LCD上显示ASCII字符的方法。

QQ截图20191107182807.png


在本文中,将使用pic16f877单片机在16×2 LCD上打印/显示ASCII字符。Lcd以8位模式与pic单片机接口。代码是用C语言编写的。高科技C编译器用于编译代码,并且代码是在Mp-lab ide中编写的。将16×2 LCD与pic单片机接口并在LCD上显示字符非常容易。只有一点点复杂的部分是如何在LCD上生成/显示ASCII字符。好了,你无需生成16×2 LCD控制器(HD44780)Ram中已经存在的ASCII字符,就像其他字符和数字一样。你只需要知道如何调用将在LCD屏幕上显示的ASCII字符。

一、该方案所需材料

(1)Microchip的pic16f877单片机;
(2)16×2字符LCD;
(3)20MHz晶振;
(4)电源供应;
(5)面包板或设计PCB(印刷电路板);
(6)电位器/可变电阻器(用于设置LCD对比度)。

如果你是单片机和LCD领域的新手,并且不了解LCD引脚输出,LCD的工作原理和内部结构,那么请阅读以下教程。他们会让你了解16×2 LCD的工作原理。将学习如何在LCD上显示字符?命令和发送到LCD的数据之间的区别?它还将说明如何在4位和8位模式下使用LCD。

该项目的电路图如下。pic16f877单片机的端口B与16×2 LCD的数据引脚连接。这意味着端口B用于将命令和数据发送到16×2 LCD。使用端口D的各个位提供LCD控制信号(读/写,使能,寄存器选择)。所有其他连接均为对单片机和LCD施加+5伏特的正常连接。你可以看到下面给出的电路图。Rs(寄存器选择)连接到端口D的引脚6。En(启用)连接到端口D的针脚#7。读/写引脚接地。由于我们将R/W引脚接地,因此Lcd始终保持写状态。

ascii-characters-displayed.png


在代码部分,我首先包含头文件htc.h。如果你使用的是高科技C编译器,则始终包含此库,则此库必须包含在将要使用高科技c编译器进行编译的每个项目中。它包含编译器指令等。然后定义振荡器的频率为20 MHz。然后定义端口D的各个引脚。这些引脚用于向LCD提供控制信号。delay()函数用于在必要时生成一些任意延迟。lcdcmd()函数正在通过控制信号向lcd发送命令。display()函数正在使用控制信号将数据发送到LCD。lcdint()函数正在初始化我们的lcd(8位模式,显示为开,光标关闭等)。

在主要功能中,有两个指令正在调用ascii字符。指令i = j/10; 其中j是integer(int),而i是character(char)。现在,当我们将两个整数相除并将结果保存在character(char)变量中时。结果以ascii格式存储。由于j为0并用0除以10得到0。所以i包含0,ASCII值为零。

hd44780-ascii-characters-address.jpg

ASCII字符0存在于地址0x30。要转到地址0x00,请从0x30取反0x30。指令i = i-0x30; 在做同样的工作。在执行i = i-0x30之后,我首先包含0x30,而我包含0x00。因此,我们处于ASCII字符的起始地址。现在将地址一一递增,并在LCD屏幕上显示与该地址关联的ascii字符。

值得注意的是,HD44780控制器的ASCII字符与标准ASCII字符不同。HD44780控制器包含右侧给出的格式的ASCII字符。一些地址也无效。因此,当你在LCD屏幕上看到如下所示的字符时,请不要感到困惑。
RAM的16×2 LCD的总位数是256。所以我决定全部显示。它包含ASCII、数字、字母和中文。如果地址无效,这些地址在LCD屏幕上将不会显示任何内容。  

二、源代码部分

#include <htc.h>
#define _XTAL_FREQ 20000000    //Oscillator frequency
#define en RD7                 //Lcd Controlling Pins
#define rs RD6
#define rw RD5

void delay(unsigned int time)  //Time delay function
{
unsigned int i,j;
for(i=0;i< time;i++)
for(j=0;j< 5;j++);
}

             //Function for sending values to the command register of LCD
void lcdcmd(unsigned char value)  
{
PORTB=value;
rs= 0;           //register select-rs 
rw = 0;          //read-write-rd
en = 1;          //enable-e
delay(50);
en=0;            //enable-e
delay(50);

}
             //Function for sending values to the data register of LCD
void display(unsigned char value)  
{
PORTB=value;
rs= 1;       //register select-rs 
rw= 0;       //read-write-rd
en= 1;       //enable-e
delay(500);
en=0;        //enable-e
delay(50);

}
             //function to initialize the registers and pins of LCD
             //always use with every lcd of hitachi
void lcdint(void)         
{
TRISB=0x00;    //Port 1 is used as output port             
TRISD5=0;      //Lcd Controlling pins as output
TRISD6=0;
TRISD7=0; 
delay(15000);
display(0x30);
delay(4500);
display(0x30);
delay(300);
display(0x30);
delay(650);
lcdcmd(0x38);
delay(50);
lcdcmd(0x0C);
delay(50);
lcdcmd(0x01);
delay(50);
lcdcmd(0x06);
delay(50);
lcdcmd(0x80);
delay(50);
}

void main()
{
char i;
unsigned int j,k;
j=0;k=0;
i=j/10;
i=i-0x30;
lcdint();

while(j!=255){
display(i);
j++;i++;k++;

if(k==15){         //Displaying characters on first line of lcd
lcdcmd(0xC0);
}

if(k==31){        //Displaying characters on second line of lcd
lcdcmd(0x80);
k=0;
lcdcmd(0x01);     //Clear Lcd
}

delay(12000);
}//End While

}


以上就是英锐恩单片机开发工程师分享的使用pic16f877单片机在16×2字符LCD上显示ASCII字符的方法。英锐恩专注单片机应用方案设计与开发,提供8位单片机、16位单片机、32位单片机。