06 12864LCD显示计算器键盘按键实验.docx
- 文档编号:16204223
- 上传时间:2023-07-11
- 格式:DOCX
- 页数:26
- 大小:267.86KB
06 12864LCD显示计算器键盘按键实验.docx
《06 12864LCD显示计算器键盘按键实验.docx》由会员分享,可在线阅读,更多相关《06 12864LCD显示计算器键盘按键实验.docx(26页珍藏版)》请在冰点文库上搜索。
0612864LCD显示计算器键盘按键实验
目录
1课程设计概述和要求……………………………………………………………………1
1.1课程设计要求与任务……………………………………………………………2
1.2课程设计思路………………………………………………………………………2
1.3课程设计需要配置的环境………………………………………………………3
2系统设计…………………………………………………………………………………3
2.1设计框图……………………………………………………………………………3
2.2元件解析……………………………………………………………………………3
2.2.1LCD12864芯片……………………………………………………………4
2.2.2AT89C51芯片………………………………………………………………5
2.2.3其他部件……………………………………………………………………6
2.2.4电路分析…………………………………………………………………7
3软件设计…………………………………………………………………………………12
3.1程序流程图………………………………………………………………………12
3.2程序代码…………………………………………………………………………12
4系统的仿真与调试………………………………………………………………………13
4.1硬件调试……………………………………………………………………………13
4.2软件调试……………………………………………………………………………14
4.3软硬件调试…………………………………………………………………………14
5总结………………………………………………………………………………………14
附录1:
程序代码
附录2:
12864LCD显示计算器键盘按键实验Proteus仿真图
1课程设计概述和要求
1.1课程设计任务与要求
设计任务:
利用AT89C51单片机结合12864LCD显示器设计计算器键盘按键。
设计要求1:
本设计实现一个12864LCD显示12864LCD显示器设计计算器键盘按键
2.利用AT89C51控制整个电路来实现.显示12864LCD显示器设计计算器键盘按键,系统主要包括硬件和软件两部分。
重点就是各部分硬件的连接设计以及程序的编写。
本章讲述的就是系统硬件的设计,其中包括各模块的器件选择和电路设计。
将计算器按键上的信息传送至AT89C51主芯片之中,利用P2端口使之显示于12864LCD液晶显示屏上。
1.2课程设计目的思路
1、先把与题目有关的芯片资料找到,熟悉一下芯片资料
2、把此程序的电路图看懂,了解一下它的实现原理,以及实现的功能。
3、分析一下此程序的各部分的功能,各零件的工作原理。
4、对程序进行调试,分析调试结果,观察并得出结论。
1.3课程设计需要配置的环境
1、一台主机,一台显示器
2、KeiluVision3/KeiluVision4应用程序软件
3、ISIS7Professional仿真软件
4、老师交给的仿真电路图,及案例
5、纸张,以及一些参考资料
2系统设计
2.1.设计框图
框图设计是为了能够从整体上把握系统的各个大的模块以及各个模块之间的联系。
同时罗列出需要主要使用到的各个器件,以方面系统开发中器件的选取。
通过框图设计,让设计者从整体上把握系统的开发。
12864LCD显示计算器键盘按键实验设计框图如下所示
2.2元件解析
2.2.112864LCD芯片
1、主要技术参数和显示特性:
电源:
VDD3.3V~+5V(内置升压电路,无需负压);
显示内容:
128列×64行
显示颜色:
黄绿
显示角度:
6:
00钟直视
LCD类型:
STN
与MCU接口:
8位或4位并行/3位串行
配置LED背光
多种软件功能:
光标显示、画面移位、自定义字符、睡眠模式等
2、模块引脚说明
12864引脚说明
引脚号
引脚名称
方向
功能说明
1
VSS
-
模块的电源地
2
VDD
-
模块的电源正端
3
V0
-
LCD驱动电压输入端
4
RS(CS)
H/L
并行的指令/数据选择信号;串行的片选信号
5
R/W(SID)
H/L
并行的读写选择信号;串行的数据口
6
E(CLK)
H/L
并行的使能信号;串行的同步时钟
7
DB0
H/L
数据0
8
DB1
H/L
数据1
9
DB2
H/L
数据2
10
DB3
H/L
数据3
11
DB4
H/L
数据4
12
DB5
H/L
数据5
13
DB6
H/L
数据6
14
DB7
H/L
数据7
15
PSB
H/L
并/串行接口选择:
H-并行;L-串行
16
NC
空脚
17
/RET
H/L
复位低电平有效
18
NC
空脚
19
LED_A
-
背光源正极(LED+5V)
20
LED_K
-
背光源负极(LED-OV)
控制器接口信号说明:
1、RS,R/W的配合选择决定控制界面的4种模式:
RS
R/W
功能说明
L
L
MPU写指令到指令暂存器(IR)
L
H
读出忙标志(BF)及地址记数器(AC)的状态
H
L
MPU写入数据到数据暂存器(DR)
H
H
MPU从数据暂存器(DR)中读出数据
2、E信号
E状态
执行动作
结果
高——>低
I/O缓冲——>DR
配合/W进行写数据或指令
高
DR——>I/O缓冲
配合R进行读数据或指令
低/低——>高
无动作
忙标志:
BFBF标志提供内部工作情况.BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据.BF=0时,模块为准备状态,随时可接受外部指令和数据.利用STATUSRD指令,可以将BF读到DB7总线,从而检验模块之工作状态.
字型产生ROM(CGROM)字型产生ROM(CGROM)提供8192个此触发器是用于模块屏幕显示开和关的控制。
DFF=1为开显示(DISPLAYON),DDRAM的内容就显示在屏幕上,DFF=0为关显示(DISPLAYOFF)。
DFF的状态是指令DISPLAYON/OFF和RST信号控制的。
显示数据RAM(DDRAM)模块内部显示数据RAM提供64×2个位元组的空间,最多可控制4行16字(64个字)的中文字型显示,当写入显示数据RAM时,可分别显示CGROM与CGRAM的字型;此模块可显示三种字型,分别是半角英数字型(16*8)、CGRAM字型及CGROM的中文字型,三种字型的选择,由在DDRAM中写入的编码选择,在0000H—0006H的编码中(其代码分别是0000、0002、0004、0006共4个)将选择CGRAM的自定义字型,02H—7FH的编码中将选择半角英数字的字型,至于A1以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成中文字型的编码BIG5(A140—D75F),GB(A1A0-F7FFH)。
字型产生RAM(CGRAM)字型产生RAM提供图象定义(造字)功能,可以提供四组16×16点的自定义图象空间,使用者可以将内部字型没有提供的图象字型自行定义到CGRAM中,便可和CGROM中的定义一样地通过DDRAM显示在屏幕中。
地址计数器AC地址计数器是用来贮存DDRAM/CGRAM之一的地址,它可由设定指令暂存器来改变,之后只要读取或是写入DDRAM/CGRAM的值时,地址计数器的值就会自动加一,当RS为“0”时而R/W为“1”时,地址计数器的值会被读取到DB6——DB0中。
光标/闪烁控制电路
此模块提供硬体光标及闪烁控制电路,由地址计数器的值来指定DDRAM中的光标或闪烁位置。
2.2.2AT89C51芯片
(1)AT89C51简介
AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
AT89C51芯片图如下图所示。
图AT89C51芯片图
(1)AT89C51主要特性:
与MCS-51兼容;4K字节可编程闪烁存储器;寿命:
1000写/擦循环;数据保留时间:
10年;全静态工作:
0Hz-24MHz;三级程序存储器锁定;128×8位内部RAM;32可编程I/O线;两个16位定时器/计数器;5个中断源;可编程串行通道;低功耗的闲置和掉电模式;片内振荡器和时钟电路。
2.2.3计算器键盘
键盘电路的设计原理
首先行列式键盘中的键实际上就是一个机械开关,该开关位于行线和列线的交点处,通过按键加以连接。
当按下某个键时,该交点的行线和列线接通,相应行线或列线上的的电平发生变化,从而可以确定被按下的功能键。
4行×4列的行列式键盘如图:
其次运用线翻转法判断有无键按下:
键盘的高4位用于列控制,低4位用于行控制,并将全部行线P0.0~P0.3置低电平,然后再检查列线电平的状态。
只要其中有一列电平为低,则表示右键按下,并且被按下的键位于低电平和4根行线交叉的某一个按键中。
判断被按下键的位置:
依次将所有的行线P0.4~P0.77置为低电平,在判断4根列线的电平状态,当遇到某一列的
电平为低时表示此键按下。
计算器键盘就是一个4*4的行列扫描,行对应着A、B、C、D(和P1.0~P1.3相连),列对应着1、2、3、4(和P1.4~P1.7相连),读取P1口的值判断哪个键被按下了,执行该操作。
2.2.4电路分析
1、通过AT89C51芯片PO口与键盘相接,键盘中的键就是一个行列开关,该开关位于行列的交点处,通过按下某个键,该交点的行线和列线联通,相应的行列电平发生变化,从而可以确定按下的功能键。
读取P0的值就可以确定按键,再由AT89C51芯片读取按键的值通过P1口和P2口显示在LCD12864上,每显示一个按键值LS1发出声音。
接P3.7口,判断键盘是否按下,一旦键盘某个键按下,此元件会发出声音。
2、时钟电路由AT89S51得18、19引脚的时钟端(XTL1及ATAL2)以及12MHZ晶振、47pF的电容C1、C2组成,采用片内振荡方式。
其时间周期为1/12us,机器周期为1s。
单片机的外部晶振电路如图3
AT89C51中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。
这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成振荡器。
振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平。
3、复位电路采用简单的上位电路,由1K电阻及22uF电容接至AT89S52的RST复位端
电阻给电容充电,电容的电压缓慢上升直到vcc,没到vcc时芯片复位脚近似低电平,于是芯片复位,接近vcc时芯片复位脚近高电平,于是芯片停止复位,复位完成。
按键后:
电容器被短路放电、RST直接和VCC相连,就是高电平,此时进入“复位状态”。
松手后:
电源开始对电容器充电,此时,充电电流在电阻上,形成高电平送到RST,仍然是“复位状态”;
稍后,充电结束,电流降为0,电阻上的电压也将为0,RST降为低电平,开始正常工作。
4键盘电路的设计原理首先行列式键盘中的键实际上就是一个机械开关,该开关位于行线和列线的交点处,通过按键加以连接。
当按下某个键时,该交点的行线和列线接通,相应行线或列线上的的电平发生变化,从而可以确定被按下的功能键其次运用线翻转法判断有无键按下:
键盘的高4位用于列控制,低4位用于行控制,并将全部行线Y0~Y3置低电平,然后再检查列线电平的状态。
只要其中有一列电平为低,则表示右键按下,并且被按下的键位于低电平和4根行线交叉的某一个按键中。
3软件设计
3.1主程序流程图
按键操作子函数
3.2程序代码(见附录1)
4系统的仿真与调试
4.1硬件调试
硬件调试分为静态调试和动态调试,对于硬件调试而言,只要认真焊接,硬件一般不会出现什么问题的。
静态调试一般采用的工具是万用表,它是在用户系统未工作时的一种硬件检测。
动态调试是在用户系统工作的情况下发现和排查错误的一种硬件检测。
调试步骤是:
首先把电路分为若干模块,调试过程中与该模块无关的元件可以不加考虑,这样可把故障限定在一定的范围内;故障清除后,把各个模块合在一起进行联调,即可完成整个硬件调试工作。
4.2软件调试
软件调试是通过对程序的汇编、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。
调试过程:
1、代码录入完成进行调试,运行出现了31个错误
2、在KeiluVision3中检测查找错误,
3、检测过程中总是有一处错误无法解决
4、最后把原程序分开逐个调试,检查每段程序的错误,修正每个代码错误
5、这种分开调试方法的效率还是很不错的,经过几次修改就完成了程序的调试,运行结果没有错误,电路显示也完全正确。
4.3软硬件调试
软硬件联调是指把调试无误的软件程序烧制进单片机芯片内部,通上电源后,检查硬件工作是否有预期的效果,如果没有则需要检测软件是否在实现功能上有欠缺。
若有错误,通过改写软件来调试,直至达到预期效果,则设计圆满成功。
4.4代码分析
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#include
crol(),cror()。
#defineucharunsignedchar,#defineuintunsignedint,definedelayNOP(){nop();nop();nop()}皆属于宏定义,后者是将三个延时周期定义在一起,用一个delayNOP()表示。
VoidLCD_intialize,,voidDisplay_String(char*,char);皆为调用函数,第一个是调用LCD初始化函数;第二个是调用LCD写数据函数。
voidmain()
{
uchari;
LCD_Initialize();
…………
…………
}
主函数,中断允许寄存器IE,IE=0x82=10000010表示EA为1,CPU开放中断;ET0=1,允许外部中断1中断。
定时/计数器方式控制寄存器TMOD,TMOD=0x01=00000001,表示在T0方式字段中工作方式为方式1,是定时器方式,定时器的技术不受外部引脚输入电平的控制,而只受定时器运行控制位(TR0、TR1)的控制。
进行高低8为赋初值。
接着调用初始化LCD子函数,在其子函数中进行顺序执行,每个都先延时5毫秒,接着调用写指令函数。
返回至主程序。
接着调用显示函数,在LCD指定行上显示字符串,Display_String(msg1,0x00),msg1为一个一维数组(SecondWatch0),即Display_String(SecondWatch0,0x00),在该子函数中调用设置显示位置子函数,在该子函数中调用写指令子函数进行或操作。
5总结
本次课程设计收获:
(1)学会了通过寻找芯片资料,弄懂、研究芯片本身来找到解决问题的最优解。
2)要多请教他人,不能有个人主义,有些问题在经过长时间思考后,如果还未解决的话我们就要不耻下问,攻取他人的帮助。
经过此次课程设计,简单带有LCD显示的数字的,系统基本功能基本实现,测试运行也基本正常,该系统基本上完成了日期的显示与计数的功能,感谢老师的指导。
附录1:
程序代码
//12864LCD显示计算器键盘按键实验源代码
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//定义DotMatri.c中的点阵,数字,符号等编码
externucharcodeWord_String[][32];
externucharcodeKeyboard_Chars[][16];
externucharcodeKeyPosTable[];
externucharKeyScan();//keypad.c中的键盘扫描函数
//定义在LCP_12864.c中的相关液晶显示函数
externLCD_Initialize();
voidDisplay_A_Char(uchar,uchar,uchar*);
voidDisplay_A_WORD(uchar,uchar,uchar*);
voidDisplay_A_WORD_String(uchar,uchar,uchar,uchar*);
//键盘扫描开启标志,其值由外部中断0控制
bitKeyPressDown=0;
ucharT_Count=0;
sbitSPK=P3^7;
//Keybord_Chars中数字与符号编码与键盘按键对照表
ucharcodeKeyPosTable[]=
{
7,8,9,10,
4,5,6,11,
1,2,3,12,
15,0,14,13
};
//蜂鸣器发声
voidBeep()
{
uchari,x=20;
while(x--)
{
for(i=0;i<120;i++);SPK=~SPK;
}
}
//主程序
voidmain()
{
uchari;
LCD_Initialize();//初始化LCD
for(i=0;i<7;i++)//从第一页开始,左边距16点,显示7个16*16点阵的中文提示信息
Display_A_WORD_String(1,16*(i+1),1,Word_String[i]);
P1=0x0f;
IE=0x83;//允许外部0和定时器0中断
IT0=1;//设为下降沿中断方式,外部中断0用于启停键盘扫描处理
TH0=(65536-5000)/256;//50ms定时
TL0=(65536-5000)%256;
while
(1)
{
//如果有按键按下则处理按键
if(KeyPressDown==1)
{
Beep();
KeyPressDown=0;
Display_A_Char(4,55,Keyboard_Chars[KeyPosTable[KeyScan()]]);
TR0=0;
}
}
}
//外部中断0控制消抖延时
voidEX0_INT()interrupt0
{
TR0=1;//开启定时器0,延时300ms消抖
}
//定时器用于消抖并确认有键按下,启动主程序中的按键扫描
voidT0_INT()interrupt1
{
if(++T_Count==6)//50*6=300ms延时抖动
{
T_Count=0;
KeyPressDown=1;//确定有键按下
}
TH0=(65526-50000)/256;//50ms定时
TL0=(65526-50000)%256;
}
//---------------------------------------------LCD_12864.C----------------------------------------------
//名称:
12864LCD显示驱动程序(不带字库)
//---------------------------------------------------------------------------------------------------------
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineLCD_DB_PORTP0//液晶DB0~DB7
#defineLCD_START_ROW0xC0//起始行
#defineLCD_PAGE0xB8//页指令
#defineLCD_COL0x40//列指令
//液晶引脚定义
sbitDI=P2^0;
sbitRW=P2^1;
sbitE=P2^2;
sbitCS1=P2^3;
sbitCS2=P2^4;
sbitRST=P2^5;
//检查LCD是否忙
bitLCD_Check_Busy()
{
LCD_DB_PORT=0xFF;
RW=1;_nop_();DI=0;
E=1;_nop_();E=0;
return(bit)(P0&0X80);
}
//向LCD发送命令
voidLCD_Write_Command(ucharc)
{
while(LCD_Check_Busy());
LCD_DB_PORT=0xFF;RW=0;_nop_();DI=0;
LCD_DB_PORT=c;E=1;_nop_();E=0;
}
//向LCD发送数据
voidLCD_Write_Data(uchard)
{
while(LCD_Check_Busy());
LCD_DB_PORT=0xFF;RW=0;_nop_();DI=1;
LCD_DB_PORT=d;E=1;_nop_();E=0;
}
//初始化LCD
voidLCD_Initialize()
{
CS1=1;CS2=1;
LCD_Write_Command(0x38);//8位形式,2行字符
LCD_Write_Command(0x0F);//开显示
LCD_Write_Command(0x01);//清屏
LCD_Write_Command(0x06);//画面不动光标右移
LCD_Write_Command(LCD_START_ROW
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 06 12864LCD显示计算器键盘按键实验 12864 LCD 显示 计算器 键盘 按键 实验
![提示](https://static.bingdoc.com/images/bang_tan.gif)