《2022年2022年计算器键盘按键显示 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年计算器键盘按键显示 .pdf(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、计算器键盘按键显示摘要为了满足利用 AT89C51 单片机结合 12864LCD 显示器设计计算器4*4 键盘按键的要求, 我设计了利用 AT89C51 控制整个电路显示12864LCD 显示器设计计算器键盘按键的系统。系统主要包括硬件和软件两部分。其中包括各模块的器件选择和电路设计。将计算器按键上的信息传送至AT89C51 主芯片之中, 利用 P2端口使之显示于 12864LCD液晶显示屏上,包含复位、定时电路。通过在proteus 和 keil仿真软件联合仿真环境下, 系统达到了通过按键显示计算器键盘按键的需求,12864LCD精准的显示了按键信息,达到了目的。关键字:计算器键盘、液晶显示
2、屏、按键、复位、定时名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 17 页 - - - - - - - - - 1 一、系统方案论证与选择根据题目要求, 系统可以分为定时电路模块、复位电路模块、 液晶显示电路模块、键盘模块、控制电路模块,控制电路是以AT89C51 为主控芯片,其他电路模块都是由控制电路模块AT89C51芯片进行控制。如图 1,为系统总电路模块框图。定时图 1 系统总框图1.1 系统基本方案论证为实现各模块的功能, 分别论证了几种不同的设计方案并进行了讨
3、论,并且就各方案的优缺点进行了方案选择。1.1.1 液晶显示电路的选择方案一:选用 LCD1602 液晶显示器, LCD1602 是字符型的模组, 为 16 字乘 2行字符型。但只能显示数字与字符, 不可以显示汉字。不能显示出题目目的的汉字字符。方案二:选用 LCD12864液晶显示器, 12864屏幕为 64 行,每行显示 128个字符,是点阵型显示器。 可根据需求任意显示字符、 数字 、 汉字、图形,LCD12864是图形型的模组。显示器控制器接口信号说明如表1 所示。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心
4、整理 - - - - - - - 第 2 页,共 17 页 - - - - - - - - - 2 表 1 控制器借口信号说明RS R/W 功能说明L L MPU 写指令到 IR L H 读出 BF及 AC状态H L MPU 写数据到 DR H H MPU 从 DR读出数据综上所述,配合我的 AT89C51 控制系统和液晶显示系统, 我选择方案二, 达到了我需要显示汉字、符号、数字的要求。1.1.2 控制电路的选择方案一:选用 PIC、或 AVR 、或凌阳 SPCE061A 等作为控制核心;这些单片机资源丰富,可以实现复杂的逻辑功能,功能强大,完全可以实现对小车的控制。但对于本题目而言,其优势
5、资源无法得以体现,且成本稍高。方案二: 采用 AT89C5 高速单片机来作为整机的控制单元。 AT89C51与 MCS-51 兼容; 4K 字节可编程闪烁存储器;寿命:1000 写/ 擦循环;数据保留时间: 10年;全静态工作: 0Hz-24MHz ;三级程序存储器锁定; 1288 位内部 RAM ;32可编程 I/O 线;两个 16 位定时器 / 计数器; 5 个中断源;可编程串行通道;低功耗的闲置和掉电模式; 片内振荡器和时钟电路。 此系统比较灵活, 采用软件方法来解决复杂的硬件电路部分, 使系统硬件简洁化, 各类功能易于实现, 能很好地满足实际的需要。综上所述,配合循迹探测系统, 我们选
6、择采用方案二, 达到了用软件方法解决硬件电路系统的目的。1.2 系统各模块的最终方案经过仔细分析和论证,决定了系统各模块的最终方案如下:(1)液晶显示模块:采用LCD12864为系统显示器(2)控制模块:采用 AT89C51单片机名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 17 页 - - - - - - - - - 3 二、系统的硬件设计与实现2.1 系统硬件的基本组成部分通过 AT89C51芯片 PO口与键盘相接,键盘中的键就是一个行列开关,该开关位于行列的交点处
7、, 通过按下某个键, 该交点的行线和列线联通, 相应的行列电平发生变化,从而可以确定按下的功能键。读取P0的值就可以确定按键,再由 AT89C51芯片读取按键的值通过P1口和 P2口显示在 LCD12864 上,每显示一个按键值 LS1发出声音。 接 P3.7 口,判断键盘是否按下, 一旦键盘某个键按下,此元件会发出声音。如图2,为系统总体电路图。图 2 系统总电路图2.2 主要单元电路的设计2.2.1 时钟电路时钟电路由 AT89S51得 18、19 引脚的时钟端( XTL1及 ATAL 2)以及 12MHZ晶振、47pF的电容 C1、C2组成,采用片内振荡方式。其时间周期为1/12us ,
8、机名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 17 页 - - - - - - - - - 4 器周期为 1s。单片机的外部晶振电路如图3 所示。AT89C51 中有一个用于构成内部振荡器的高增益反相放大器, 引脚 XTAL1和 XTAL2分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成振荡器。振荡器特性 : XTAL1和 XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。 石晶振荡和陶瓷振荡均可采用。
9、 如采用外部时钟源驱动器件, XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平。图 3 时钟电路图2.2.2 复位电路复位电路采用简单的上位电路, 由 1K电阻及 22uF电容接至 AT89S52的 RST复位端电阻给电容充电,电容的电压缓慢上升直到vcc,没到 vcc 时芯片复位脚近似低电平, 于是芯片复位, 接近 vcc 时芯片复位脚近高电平, 于是芯片停止复位,复位完成。按键后电容器被短路放电、RST直接和 VCC 相连,就是高电平,此时进入“复位状态” 。松手后电源开始对电容器充电,此时,充电电流在电阻上,形成
10、高电平送到RST ,仍然是“复位状态” ,稍后,充电结束,电流降为0,电阻上的电压也将为0,RST降为低电平,开始正常工作。如图 4 ,为复位电路截图。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 17 页 - - - - - - - - - 5 图 4 复位电路图2.2.3 按键电路键盘电路的设计原理首先行列式键盘中的键实际上就是一个机械开关,该开关位于行线和列线的交点处,通过按键加以连接。 当按下某个键时, 该交点的行线和列线接通, 相应行线或列线上的的电平发生变化
11、,从而可以确定被按下的功能键其次运用线翻转法判断有无键按下:键盘的高 4 位用于列控制,低4 位用于行控制,并将全部行线Y0Y3置低电平,然后再检查列线电平的状态。只要其中有一列电平为低, 则表示右键按下, 并且被按下的键位于低电平和4 根行线交叉的某一个按键中。如图 5,为 4*4 按键电路图。图 5 4*4 按键电路图三、系统软件设计3.1 主程序流程图如图 6,为系统主流程图,程序开始启动显示器,单片机判断是否有按键按下,如果有进行按键扫描,否则一直进行检测直到按键按下。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师
12、精心整理 - - - - - - - 第 6 页,共 17 页 - - - - - - - - - 6 图 6 系统主流程图3.2 按键操作子函数流程图当按键程序启动的时候, 通过扫描按键, 判断有误按键按下, 如果有按键按下,则进行数据处理、显示处理,否则一直判断是否有按键按下。如图 7,为按键操作流程图。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 17 页 - - - - - - - - - 7 Ke图 7 按键操作流程图四、系统测试4.1 测试仪器表 2 测试使
13、用的仪器设备序号名称、型号、规格数量备注1 UNI-T 数字万用表1 2 秒表 精度 0.01s 1 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 17 页 - - - - - - - - - 8 4.2 指标测试4.2.1 硬件调试硬件调试分为静态调试和动态调试,对于硬件调试而言, 只要认真焊接, 硬件一般不会出现什么问题的。 静态调试一般采用的工具是万用表,它是在用户系统未工作时的一种硬件检测。 动态调试是在用户系统工作的情况下发现和排查错误的一种硬件检测。 调试步
14、骤是: 首先把电路分为若干模块, 调试过程中与该模块无关的元件可以不加考虑,这样可把故障限定在一定的范围内;故障清除后,把各个模块合在一起进行联调,即可完成整个硬件调试工作。4.2.2 软件调试软件调试是通过对程序的汇编、 连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。调试过程: 1、代码录入完成进行调试。2、在 Keil uVision3中检测查找错误。3、检测过程中总是有一处错误无法解决。4、最后把原程序分开逐个调试,检查每段程序的错误,修正每个代码错误。5、这种分开调试方法的效率还是很不错的,经过几次修改就完成了程序的调试,运行结果没有错误,电路显示也完全正确。4.
15、2.3 软硬件调试软硬件联调是指把调试无误的软件程序烧制进单片机芯片内部,通上电源后,检查硬件工作是否有预期的效果,如果没有则需要检测软件是否在实现功能上有欠缺。若有错误,通过改写软件来调试,直至达到预期效果,则设计圆满成功。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 17 页 - - - - - - - - - 9 参考文献1 范立南 , 谢子殿等 . 单片机原理及应用教程 M. 北京大学出版社2 马忠梅,籍顺心,张凯等 . 单片机的 C语言应用程序设计 M. 北京
16、航空航天大学出版社,2006. 3 张毅刚,彭喜元,董继成 . 单片机原理及应用高等教育出版社, 2003. 4 谭浩强 C语言程序设计(第二版) 清华大学出版社 1999 年 12 月第二版 2005 年 1 月第 58 次印刷5 王丽娟,徐军,戴宝华,荣政C程序设计西安电子科技大学出版社 2003 年 6 月第五版 2000 年 8 月出版6 彭伟单片机 C语言程序设计实训100 例电子工业出版社 2012 年 6 月第六次印刷名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10
17、 页,共 17 页 - - - - - - - - - 10 附录 1:程序代码/ 12864LCD 显示计算器键盘按键实验源代码#include #include #define uchar unsigned char #define uint unsigned int / 定义 DotMatri.c 中的点阵,数字,符号等编码extern uchar code Word_String32; extern uchar code Keyboard_Chars16; extern uchar code KeyPosTable; extern uchar KeyScan();/ keypad.c中
18、的键盘扫描函数/ 定义在 LCP_12864.c中的相关液晶显示函数extern LCD_Initialize(); void Display_A_Char(uchar,uchar,uchar*); void Display_A_WORD(uchar,uchar,uchar*); void Display_A_WORD_String(uchar,uchar,uchar,uchar*); / 键盘扫描开启标志,其值由外部中断0 控制bit KeyPressDown = 0; uchar T_Count = 0; sbit SPK = P37; /Keybord_Chars 中数字与符号编码与键盘
19、按键对照表uchar code KeyPosTable= 7,8,9,10, 4,5,6,11, 1,2,3,12, 15,0,14,13 ;/ 蜂鸣器发声void Beep() uchar i,x=20; while (x-) for(i=0;i120;i+); SPK=SPK; / 主程序void main() uchar i; LCD_Initialize(); /初始化 LCD 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 17 页 - - - - - - -
20、 - - 11 for (i=0;i7;i+) /从第一页开始,左边距16 点,显示 7 个 16*16 点阵的中文提示信息Display_A_WORD_String (1,16*(i+1),1,Word_Stringi); P1=0 x0f; IE=0 x83; / 允许外部 0 和定时器 0 中断IT0=1; / 设为下降沿中断方式,外部中断0 用于启停键盘扫描处理TH0=(65536-5000)/256;/50ms定时TL0=(65536-5000)%256; while(1) / 如果有按键按下则处理按键if(KeyPressDown=1) Beep(); KeyPressDown=0
21、; Display_A_Char(4,55,Keyboard_Chars KeyPosTableKeyScan() ); TR0=0; / 外部中断 0 控制消抖延时void EX0_INT() interrupt 0 TR0=1;/ 开启定时器 0,延时 300ms消抖 / 定时器用于消抖并确认有键按下,启动主程序中的按键扫描void T0_INT() interrupt 1 if(+T_Count=6) /50*6=300ms延时抖动 T_Count=0; KeyPressDown=1; /确定有键按下 TH0=(65526-50000)/256; /50ms定时 TL0=(65526-5
22、0000)%256; /-LCD_12864.C- / 名称: 12864LCD 显示驱动程序 ( 不带字库 ) /- 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 17 页 - - - - - - - - - 12 #include #include #define uchar unsigned char #define uint unsigned int #define LCD_DB_PORT P0 /液晶 DB0DB7 #define LCD_START_ROW
23、 0 xC0 /起始行#define LCD_PAGE 0 xB8 /页指令#define LCD_COL 0 x40 /列指令/ 液晶引脚定义sbit DI=P20; sbit RW=P21; sbit E=P22; sbit CS1=P23; sbit CS2=P24; sbit RST=P25; / 检查 LCD是否忙bit LCD_Check_Busy() LCD_DB_PORT=0 xFF; RW=1;_nop_();DI=0; E=1;_nop_();E=0; return (bit)(P0 & 0X80); / 向 LCD发送命令void LCD_Write_Command(uc
24、har c) while (LCD_Check_Busy(); LCD_DB_PORT=0 xFF;RW=0;_nop_();DI=0; LCD_DB_PORT=c;E=1;_nop_();E=0; / 向 LCD发送数据void LCD_Write_Data(uchar d ) while (LCD_Check_Busy(); LCD_DB_PORT=0 xFF;RW=0;_nop_();DI=1; LCD_DB_PORT=d; E=1;_nop_();E=0; / 初始化 LCD void LCD_Initialize() CS1=1; CS2=1; LCD_Write_Command(0
25、 x38); /8位形式, 2 行字符名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 17 页 - - - - - - - - - 13 LCD_Write_Command(0 x0F); /开显示LCD_Write_Command(0 x01); /清屏LCD_Write_Command(0 x06); /画面不动光标右移LCD_Write_Command(LCD_START_ROW); /设置起始行 / 通用显示函数/ 从第 P页第 L 列开始显示 W字节数据,数据
26、在r 所指向的缓冲/ 每字节 8 位是垂直显示的,高位在下,低位在上/ 每个 8*128 的矩形区域为一页(每页分左半页与右半页)/ 整个 LCD又由 64*64 的左半习工和 64*64 的右半屏构成void Common_Show(uchar P,uchar L,uchar W,uchar *r) uchar i; if(L64) /显示在左半屏或右半屏 CS1=1;CS2=0; LCD_Write_Command(LCD_PAGE+P); LCD_Write_Command(LCD_COL+L); if(L+W64) /全部显示在左半屏 for(i=0;iW;i+) LCD_Write_
27、Data(ri); else /如果越界则跨越左右半屏显示 for(i=0;i64-L;i+) LCD_Write_Data(ri); /左半屏显示CS1=0; CS2=1; /右半屏显示LCD_Write_Command(LCD_PAGE+P); LCD_Write_Command(LCD_COL); for(i=64-L;iW;i+) LCD_Write_Data(ri); else /全部显示在右半屏 CS1=0;CS2=1; LCD_Write_Command(LCD_PAGE+P); LCD_Write_Command(LCD_COL+L-64); for(i=0;iW;i+) LC
28、D_Write_Data(ri); / 显示一个 8*16 点阵字符 ( 字符上半部分与下半部分分别处在相邻两页中) void Display_A_Uchar(uchar P,uchar L,uchar *M) Common_Show(P,L,8,M); Common_Show(P+1,L,8,M+8); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 17 页 - - - - - - - - - 14 / 显示一个 16*16 点阵汉字(汉字上半部分与下半部分分别处在
29、相邻两页中)void Display_A_WORD(uchar P,uchar L,uchar *M) Common_Show(P,L,16,M); /显示汉字上半部分Common_Show(P+1,L,16,M+16); / 显示汉字下半部分 / 显示一串 16*16 点阵汉字void Display_A_WORD_String(uchar P,uchar L,uchar C,uchar *M) uchar i; for (i=0;iC;i+) Display_A_WORD(P,L+i*16,M+i*32); /-DotMatrix.c- / 本例中相关汉字与数字的点阵编码/-#define
30、 uchar unsigned char #define uint unsigned int / 中文提示( 16*16 点阵)uchar code Word_String32= 0 x10,0 x28,0 xE7,0 x24,0 x24,0 xC2,0 xB2,0 x8E,0 x10,0 x54,0 x54,0 xFF,0 x54,0 x7C,0 x10,0 x00, 0 x01,0 x01,0 x7F,0 x21,0 x51,0 x24,0 x18,0 x27,0 x48,0 x89,0 x89,0 xFF,0 x89,0 xCD,0 x48,0 x00 , 0 x20,0 x20,0 x
31、20,0 xFE,0 x22,0 x22,0 xAB,0 x32,0 x22,0 x22,0 x22,0 xFF,0 x22,0 x30,0 x20,0 x00, 0 x40,0 x42,0 x7D,0 x44,0 x44,0 x7C,0 x44,0 x45,0 x44,0 x7D,0 x46,0 x45,0 x7C,0 x40,0 x40,0 x00 ; /键盘数字与符号点阵( 8*16 点阵) uchar code Keyboard_Char16= 0 x00,0 xE0,0 x10,0 x08,0 x08,0 x10,0 xE0,0 x00,0 x00,0 x0F,0 x10,0 x20
32、,0 x20,0 x10,0 x0f,0 x00, 0 x00,0 x00,0 x00,0 x00,0 x80,0 x60,0 x18,0 x04,0 x00,0 x60,0 x18,0 x60,0 x01,0 x00,0 x00,0 x00, 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 17 页 - - - - - - - - - 15 0 x40,0 x40,0 x80,0 xF0,0 x80,0 x40,0 x40,0 x00,0 x02,0 x02,0 x0
33、1,0 x0f,0 x01,0 x01,0 x01,0 x01, 0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x01,0 x01,0 x01,0 x01,0 x01,0 x01,0 x01, 0 x00,0 x00,0 x00,0 xF0,0 x00,0 x00,0 x00,0 x00,0 x01,0 x01,0 x01,0X1F,0 x01,0 x01,0 x01,0 x00, 0 x40,0 x40,0 x40,0 x40,0 x40,0 x40,0 x40,0 x40,0 x00,0 x04,0 x04,0 x04,0
34、x04,0 x04,0 x04,0 x00, 0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00, ; /-KeyPad.c- / 键盘扫描程序#include #define uchar unsigned char #define uint unsigned int / 扫描键盘时发送到 03 列上的扫描uchar KeyboardScanCode4=0 xEF,0 xDF,0 xBF,0 x7F; / 扫描键盘并返回按键在键盘上的位置序号uchar K
35、eyScan () uchar Row=0,Col=0,Temp; EX0=0; / 防抖关闭for(Col=0;Col4;Col+) / 扫描各列 P1=KeyboardScanCodeCol; / 输出扫描位Temp=P1 & 0 x0F; / 读取扫描位if(Temp!=0 x0F) switch(Temp) / 判断第 i 列是否有按键下 case 0 x0E: Row=0;break;/得到对应的行号case 0 x0D: Row=1;break; case 0 x0B: Row=2;break; case 0 x07: Row=3;break; break; P1=0 x0F; E
36、X0=1; / 重新许可按键中断return Row*4+Col; / 返回按键位置序号015 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 17 页 - - - - - - - - - 16 附录 2、电路原理图D0D1D2D3D4D5D6D7D0D1D2D3D4D5D6D7DIRWERSTCS1CS2CS1CS2DIRWED0D1D2D3D4D5D6D7RSTXTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138
37、P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51234567891RP1RESPACK-8LS1SOUNDERCS11CS22GND3VCC4V05DI6R/W7E8DB09DB110DB211DB312DB413DB514DB615DB716RST17-Vout18LCD1LGM12641BS1R12365489=7+CON0ABCD1243ABC234D1U2AND_4AINT0BCDINT0ABCD1234C122PFC222PFC310uFX112MR110k名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 17 页 - - - - - - - - -
限制150内