PIC16F877A单片机来制Nokia5110 LCD显示器Word文档下载推荐.docx
《PIC16F877A单片机来制Nokia5110 LCD显示器Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《PIC16F877A单片机来制Nokia5110 LCD显示器Word文档下载推荐.docx(13页珍藏版)》请在冰点文库上搜索。
实验采用的单片机封装方式是如下图:
3设计方案:
本次实训应用PIC16F877A单片机来控制Nokia5110LCD显示器显示自己名字。
代码如下:
#include<
pic.h>
__CONFIG(XT&
WDTEN);
#defineuintunsigned
int
#defineucharunsigned
char
#definesce
RD2//片选
#definedc
RD1//1写数据,0写指令
#definesdin
RC5//数据
#definesclk
RC3//时钟
//-----------------------------------------------
//6x8font
//1pixelspaceatleftandbottom
//index=ASCII-32
constunsignedcharfont6x8[][6]=
{
{0x00,0x00,0x00,0x00,0x00,0x00},//sp
{0x00,0x00,0x00,0x2f,0x00,0x00},//!
{0x00,0x00,0x07,0x00,0x07,0x00},//"
{0x00,0x14,0x7f,0x14,0x7f,0x14},//#
{0x00,0x24,0x2a,0x7f,0x2a,0x12},//$
{0x00,0x62,0x64,0x08,0x13,0x23},//%
{0x00,0x36,0x49,0x55,0x22,0x50},//&
{0x00,0x00,0x05,0x03,0x00,0x00},//'
{0x00,0x00,0x1c,0x22,0x41,0x00},//(
{0x00,0x00,0x41,0x22,0x1c,0x00},//)
{0x00,0x14,0x08,0x3E,0x08,0x14},//*-10
{0x00,0x08,0x08,0x3E,0x08,0x08},//+
{0x00,0x00,0x00,0xA0,0x60,0x00},//,
{0x00,0x08,0x08,0x08,0x08,0x08},//-
{0x00,0x00,0x60,0x60,0x00,0x00},//.
{0x00,0x20,0x10,0x08,0x04,0x02},///
{0x00,0x3E,0x51,0x49,0x45,0x3E},//0
{0x00,0x00,0x42,0x7F,0x40,0x00},//1
{0x00,0x42,0x61,0x51,0x49,0x46},//2
{0x00,0x21,0x41,0x45,0x4B,0x31},//3
{0x00,0x18,0x14,0x12,0x7F,0x10},//4-20
{0x00,0x27,0x45,0x45,0x45,0x39},//5
{0x00,0x3C,0x4A,0x49,0x49,0x30},//6
{0x00,0x01,0x71,0x09,0x05,0x03},//7
{0x00,0x36,0x49,0x49,0x49,0x36},//8
{0x00,0x06,0x49,0x49,0x29,0x1E},//9
{0x00,0x00,0x36,0x36,0x00,0x00},//:
{0x00,0x00,0x56,0x36,0x00,0x00},//;
{0x00,0x08,0x14,0x22,0x41,0x00},//<
{0x00,0x14,0x14,0x14,0x14,0x14},//=
{0x00,0x00,0x41,0x22,0x14,0x08},//>
-30
{0x00,0x02,0x01,0x51,0x09,0x06},//?
{0x00,0x32,0x49,0x59,0x51,0x3E},//@
{0x00,0x7C,0x12,0x11,0x12,0x7C},//A
{0x00,0x7F,0x49,0x49,0x49,0x36},//B
{0x00,0x3E,0x41,0x41,0x41,0x22},//C
{0x00,0x7F,0x41,0x41,0x22,0x1C},//D
{0x00,0x7F,0x49,0x49,0x49,0x41},//E
{0x00,0x7F,0x09,0x09,0x09,0x01},//F
{0x00,0x3E,0x41,0x49,0x49,0x7A},//G
{0x00,0x7F,0x08,0x08,0x08,0x7F},//H-40
{0x00,0x00,0x41,0x7F,0x41,0x00},//I
{0x00,0x20,0x40,0x41,0x3F,0x01},//J
{0x00,0x7F,0x08,0x14,0x22,0x41},//K
{0x00,0x7F,0x40,0x40,0x40,0x40},//L
{0x00,0x7F,0x02,0x0C,0x02,0x7F},//M
{0x00,0x7F,0x04,0x08,0x10,0x7F},//N
{0x00,0x3E,0x41,0x41,0x41,0x3E},//O
{0x00,0x7F,0x09,0x09,0x09,0x06},//P
{0x00,0x3E,0x41,0x51,0x21,0x5E},//Q
{0x00,0x7F,0x09,0x19,0x29,0x46},//R-50
{0x00,0x46,0x49,0x49,0x49,0x31},//S
{0x00,0x01,0x01,0x7F,0x01,0x01},//T
{0x00,0x3F,0x40,0x40,0x40,0x3F},//U
{0x00,0x1F,0x20,0x40,0x20,0x1F},//V
{0x00,0x3F,0x40,0x38,0x40,0x3F},//W
{0x00,0x63,0x14,0x08,0x14,0x63},//X
{0x00,0x07,0x08,0x70,0x08,0x07},//Y
{0x00,0x61,0x51,0x49,0x45,0x43},//Z
{0x00,0x00,0x7F,0x41,0x41,0x00},//[
{0x00,0x55,0x2A,0x55,0x2A,0x55},//55-60
{0x00,0x00,0x41,0x41,0x7F,0x00},//]
{0x00,0x04,0x02,0x01,0x02,0x04},//^
{0x00,0x40,0x40,0x40,0x40,0x40},//_
{0x00,0x00,0x01,0x02,0x04,0x00},//'
{0x00,0x20,0x54,0x54,0x54,0x78},//a
{0x00,0x7F,0x48,0x44,0x44,0x38},//b
{0x00,0x38,0x44,0x44,0x44,0x20},//c
{0x00,0x38,0x44,0x44,0x48,0x7F},//d
{0x00,0x38,0x54,0x54,0x54,0x18},//e
{0x00,0x08,0x7E,0x09,0x01,0x02},//f-70
{0x00,0x18,0xA4,0xA4,0xA4,0x7C},//g
{0x00,0x7F,0x08,0x04,0x04,0x78},//h
{0x00,0x00,0x44,0x7D,0x40,0x00},//i
{0x00,0x40,0x80,0x84,0x7D,0x00},//j
{0x00,0x7F,0x10,0x28,0x44,0x00},//k
{0x00,0x00,0x41,0x7F,0x40,0x00},//l
{0x00,0x7C,0x04,0x18,0x04,0x78},//m
{0x00,0x7C,0x08,0x04,0x04,0x78},//n
{0x00,0x38,0x44,0x44,0x44,0x38},//o
{0x00,0xFC,0x24,0x24,0x24,0x18},//p-80
{0x00,0x18,0x24,0x24,0x18,0xFC},//q
{0x00,0x7C,0x08,0x04,0x04,0x08},//r
{0x00,0x48,0x54,0x54,0x54,0x20},//s
{0x00,0x04,0x3F,0x44,0x40,0x20},//t
{0x00,0x3C,0x40,0x40,0x20,0x7C},//u
{0x00,0x1C,0x20,0x40,0x20,0x1C},//v
{0x00,0x3C,0x40,0x30,0x40,0x3C},//w
{0x00,0x44,0x28,0x10,0x28,0x44},//x
{0x00,0x1C,0xA0,0xA0,0xA0,0x7C},//y
{0x00,0x44,0x64,0x54,0x4C,0x44},//z-90
{0x14,0x14,0x14,0x14,0x14,0x14}//horizlines
};
//*************************************************
//******functiondeclaration********************
voidLCD_init(void);
voidinit(void);
voidLCD_write_byte(unsignedchardt,unsignedcharcommand);
voiddelay(uintx);
voidLCD_set_XY(unsignedcharX,unsignedcharY);
voidLCD_clear(void);
voidLCD_write_char(unsignedcharx,unsignedchary,unsignedcharc);
voidmain(void)
{
init();
LCD_init();
//初始化LCD模块
LCD_clear();
//清屏幕
LCD_write_char(0,0,41);
//I
LCD_write_char(1,0,78);
//i
LCD_write_char(2,0,65);
//u
LCD_write_char(3,0,12);
//,
LCD_write_char(4,0,41);
//J
LCD_write_char(8,0,54)//i
LCD_write_char(6,0,44);
//a
LCD_write_char(7,0,47);
//n
LCD_write_char(9,0,37);
//Z
LCD_write_char(10,0,0);
//h
LCD_write_char(11,0,57);
//o
LCD_write_char(12,0,47);
LCD_write_char(13,0,53);
//g
while
(1)
asm("
CLRWDT"
);
}
//***********initialPICMCU************************
voidinit(void)
ADCON1=0X06;
OPTION=0x81;
TRISA=0B00000000;
TRISB=0B00000000;
TRISC=0B00000000;
TRISD=0B00000000;
TRISE=0B00000000;
PORTA=0X00;
PORTB=0x00;
PORTC=0x01;
PORTD=0x01;
PORTE=0x07;
RBIE=0;
//*******************************************************
//********************writedataorcommand***********************************************************
voidLCD_write_byte(unsignedchardt,unsignedcharcommand)
unsignedchari;
sce=0;
//片选
dc=command;
//1写数据,0写指令。
for(i=0;
i<
8;
i++)
if(dt&
0x80)
sdin=1;
else
sdin=0;
dt=dt<
<
1;
sclk=0;
sclk=1;
//在时钟正边沿采样
}
//for循环传送八个bit。
dc=1;
sce=1;
//**************************************************************
//****************initiallcd**********************************************
voidLCD_init(void)
//sce为高时,串行接口被初始化。
sce为高时忽略时钟信号。
LCD_write_byte(0x21,0);
//0b00100001LCD功能设置:
芯片活动,水平寻址,使用扩展指令
LCD_write_byte(0xd0,0);
//设置VOP值
LCD_write_byte(0x20,0);
//LCD功能设置:
芯片活动,水平寻址,使用基本指令
LCD_write_byte(0x0C,0);
//设定显示配置:
普通模式
//****************************************************************
//*************defineXYcoordinate****************************************************
voidLCD_set_XY(unsignedcharX,unsignedcharY)
LCD_write_byte(0x40|Y,0);
//column0b01000000
LCD_write_byte(0x80|X,0);
//row
0b10000000
//***********clearlcd*****************************************************
voidLCD_clear(void)
unsignedchart;
unsignedchark;
LCD_set_XY(0,0);
for(t=0;
t<
6;
t++)
for(k=0;
k<
84;
k++)
LCD_write_byte(0x00,1);
//***************************************************************
//*******displaychar*********************************************************
//Lcdrow=48,48/8=6,y表示第y个6block,一共6个block,相当于6行,y相当于第y行。
//字符的宽度位6.
voidLCD_write_char(unsignedcharx,unsignedchary,unsignedcharc)
unsignedcharline;
LCD_set_XY(x*6,y);
for(line=0;
line<
line++)
LCD_write_byte(font6x8[c][line],1);
//******************************************************************
//*********************************************************************
//************delayfunction,delayxms****************************************************
voiddelay(uintx)
uinta,b;
for(a=x;
a>
0;
a--)
for(b=110;
b>
b--);
外观:
最小系统:
实验电路图:
PIC16F877A实验电路图
4实验结果
通过Mplab软件编程之后,编译通过,之后使用ICD2下载程序到单片机上,经验证,通过接通电源后,成功控制Nokia5110LCD显示器显示自己的名字LiuJianZhong。
5心得体会
通过这次试验,我收获良多,单片机试验要求的是一种思维的创新,而不是简单的重复老师所说的试验步骤。
单片机随着城市的发展,已经得到了进一步的应用,在今后将会有更大的发展。
在这次试验当中,一开始我不断的调试,都无法显示出想要的效果,我开始以为是程序的问题,所以在程序上花了比较大的功夫,不过发现不管我怎样修改程序,都无法显示或者显示乱码。
于是,我请教了老师,老师告诉我这是电路连接的问题,后来经过我的仔细检查,发现真的是电路连接错误了。
于是在改进之后,达到了我预期的效果。
当然,在试验中我还遇到了许多问题,不过不管做什么事,计划是很重要的,做事没有顺序,做事情就会比较乱,很难成功。
而且做事要多动脑,选出最好的方法。
最后还要注重细节,细节决定成败,这句话在这次课题中不仅一次得到了验证。
今后在实验课上,我会更认真去动手操作,把理论与实际相结合!
参考文献
[1]李荣正王诚杰戴国银编著.PIC单片机原理及应用(第4版).北京:
北京航空航天大学出版社.2010
[2]童诗白华成英主编.模拟电子技术基础(第四版).北京:
高等教育出版社,2009