基于linux平台c语言的计算器设计内容摘要:

C56800uF/35VR210KVSC6 图 36. 可扩流过压保护 5V稳压电源 综上所述,方案一电路简单,而且已符合本次设计的要求,再加上第二种方案所用元件较多,性能价格比不高,所以我们选择方案一,基于本次设计我们需要5V和 12V电源。 11 键盘设计 方案一:独立键盘。 独立键盘为一端接地,另一端接 I/O 口,并且要接上拉电阻。 这种键盘的硬件都很容易实现,但 每一个按键就要用一个 I/O 口,非常的浪费单片机的 I/O 口资源,不适合本次设计。 方案二:通过 PS2 协 议 用键盘同单片机相接,从而实现单片机与键盘通信。 其电路如图 18 所示。 现在 PC 机广泛采用的 PS/2 接口为 miniDIN 6 引脚的连接器。 1—数据线( DATA); —未用; 3—电源地( GND); 4—电源( +5 V); 5—时钟( CLK); 6—未用。 图 37. 键盘与单片机接口图 由此图可知 ,使用键盘硬件结构比较简单 ,但键盘的体积太大 ,所以此系统不采用此方案。 方案三 :自制编码键盘。 编码键盘的电路如图 19 所示,这种键盘有编程简单,占用资源少,但其硬件比较复杂,要用很多的二极管,不是很理想。 图 38. 自制编码键盘电路图 12 方案四: 4*4 矩阵式键盘。 其电路图如图所示,这种键盘的硬件简单,使用的I/O 口也不多,而且这种键盘的编程方法已很成熟。 所以本次设计采用这种矩阵式键盘。 其电路图如图 图 39. 4*4 矩阵式键盘电路图 显示电路的设计 显示电路目前市场上有以下方案选择: 方案一:数码管显示方案。 数码管显示使用两个四位一体动态数码管显示方案,此设计电路如 图 21 所示。 采用动态数码管显示,具有程序简单, 对外界环境要求低,易于维护,同时其精度比较高,精确可靠,操作简单。 显示直观的特点。 但只能显示数字和一些代码,不能显示汉字及一些常用的符号,且硬件设计 较复杂。 方案二:采用汉字图形点阵液晶显示器显示方案。 RT12864M 汉字图形点阵液晶显示模块,可显示汉字及图形。 供电电源为 ~+5V(内置升压电路,无需负压 ),能采用并行和串行两种通信方式。 并有光标显示、画面移位、自定义字符、睡眠模式等功能。 13 A11B7C4D2E1F10G5H3112283946JP2Q129012Q179012Q189012Q199012VCC VCC VCC VCCR49 10KR50 10KR51 10KR53 10KQ59012Q69012VCC VCC VCC VCCR42 10KR46 10KR47 10KR48 10KKBIT1KBIT2KBIT3KBIT4KBIT5KBIT6KBIT7KBIT8A11B7C4D2E1F10G5H3112293846R57Component_1Q39012Q49012D0 D1 D2 D3 D4 D5 D6 D7 D0 D1 D2 D3 D4 D5 D6 D7 图 14 4 软件设计 本设计中采用 C 语言对单片机进行编程。 采用的是自下而上的设计方式,先设计出每一个模块(子程序),然后再慢慢扩大,最后组成整个系统。 液晶显示设计 本次设计我采用液晶来作显示模块。 对这种器件只要会看时序图,那么所有的问题都会迎难而解。 其时序图如图 图 41 液晶读时序图 图 42 液晶写时序图 15 由时序图我们可以写出液晶的初始化函数、功能设置函数、清屏函数、写指令函数、写数据 函数。 //LCD 初始化 // void lcd_int() { ret=0。 delay(10)。 ret=1。 _nop_()。 psb=1。 //将 PSB 置 1,通信方式为 8BIT 数据并口 // _nop_()。 } //LCD 功能设置 // void lcd_set() { mand=0x30。 //基本指令集 // write_mand(mand)。 mand=0x01。 write_mand(mand)。 mand=0x06。 write_mand(mand)。 mand=0x0c。 write_mand(mand)。 } //清屏程序 // void clear_lcd () { 16 mand=0x01。 write_mand(mand)。 mand=0x34。 write_mand(mand)。 mand=0x30。 write_mand(mand)。 } //写指令程序 // void write_mand(uchar mand) { delay(5)。 rs=0。 rw=0。 P0=mand。 en=1。 _nop_()。 _nop_()。 en=0。 } //写数据程序 // void write_data(uchar data0) { delay(5)。 rs=1。 rw=0。 P0=data0。 en=1。 _nop_()。 _nop_()。 17 en=0。 } 键盘输入设计 这里我 先用 4*4 矩阵式键盘。 键盘扫描函数如下: //键扫描程序 // uchar keyscan() {uchar scancode,tmpcode。 P1=0xf0。 // 行全为 0 if((P1amp。 0xf0)!=0xf0) //有键按下 {delay(100)。 //延时去抖动 if((P1amp。 0xf0)!=0xf0) //判是否真的有键按下 {scancode=0xfe。 //逐 行扫描 while((scancodeamp。 0x10)!=0) {P1=scancode。 if((P1amp。 0xf0)!=0xf0) //本行有键按下 {tmpcode=(P1amp。 0xf0)|0x0f。 //返回特征字节码 ,为 1 的位即对应于行和列 return((~scancode)+(~tmpcode))。 } else scancode=(scancode1)|0x01。 //行扫描码左移一位 } } } return(0)。 //无键按下 ,返回值为 0 } 计算器函数设计 计算器的设计是本次设计的重点。 因为考虑到该硬件中只有 16 个按键,所以我采用了按键复用的方式来解决这一难题。 这 16 个键分别是 0~9 十个数字键。 四个运算符号键,一个小数点键,一个多功能键。 这个多功能键单击时为 “=”,双击时为 18 请零键,三击时为运算类型选择键。 在待机时,该计算器显示万年历,如果要进行计算则按任意键 即可进入计算界面。 默认的计算是加减乘除,如果说要进行加减乘除以外的运算,那么就三键等号键,就可进入运算类型选择模式。 程序流程图 开 始液 晶 初 始 化 , 闹 钟 初 始 化 , 定 时 器 初 始 化1 键 按 下。 否是是否开 定 时 器关 闹 钟0 键 按 下。 调 闹 钟 键 扫 键处 理 程 序否否计 算 器 工 作 模 式初 始 化3 键 按 下。 是“ = ” 连 续 按 下 四 次 ?调 计 算 器 键 扫键 处 理 程 序返 回 图 43 主程序流程图 19 显 示 开 始L C D初 始 化相 应 功 能设 置送 地 址送 数 据返 回显 示 汉 字 或A C S I I 码相 应 功 能设 置送 行 地 址和 列 地 址送 数 据显 示 图 形是否是是否否是 否显 示 完是 否显 示 完是否 图 44 显示程序流程图 20 图 4 5 键扫程序流程图 21 附 录 C 语言程序 include include include include define uchar unsigned char define uint unsigned int define ulong unsigned long sbit rs=P2^0。 sbit rw=P2^1。 sbit en=P2^2。 sbit psb=P2^3。 sbit ret=P2^5。 sbit rd=P3^7。 sbit s=P1^0。 sbit s1=P1^4。 sbit s2=P1^5。 sbit s3=P1^6。 sbit s4=P1^7。 uchar count,s1num。 unsigned int nin,ss。 char yue,re,qi,shi,fen,miao。 uchar dshi,dfen,dmiao,ling,aa,t1,p。 uchar mand,data0,data1,data2,0,j,l。 unsigned char mand,data1,data2,0,bb,bb0,aa,cc,i,yun。 // uchar lcdH,lcdL,key。 float ds,m,k。 ulong ds0。 22 bit flag,flag1,flag2,flag3,flag4。 uchar disbuf[9]={0}。 //定义显示缓冲区 // uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e}。 uchar code table1[]={0xc8,0xd5,0xd2,0xbb,0xb6,0xfe,0xc8,0xfd,0xcb,0xc4,0xce,0xe5,0xc1,0xf9}。 //日 ~六 // uchar code table2[]={0x32,0x30,0x30,0x39,0xc4,0xea,0x30,0x35,。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。