基于LPC2214的简易计算器设计Word格式.docx
- 文档编号:20550886
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:23
- 大小:149.35KB
基于LPC2214的简易计算器设计Word格式.docx
《基于LPC2214的简易计算器设计Word格式.docx》由会员分享,可在线阅读,更多相关《基于LPC2214的简易计算器设计Word格式.docx(23页珍藏版)》请在冰豆网上搜索。
键盘的设计可以有多种方案,相比之下,矩阵式键盘所需要的硬件资源少,控制灵活,操作简单。
因此,本设计中采用矩阵式键盘来控制。
键盘工作原理:
特别说明:
IO0口悬空时为低电平,故用高电平扫描。
(1)判断键盘中有无键按下将全部行线PO0-PO3置高电平,然后检测列的
状态。
只要有一列的电平为高,则表示键盘中有键被按下,而且闭合的键位于高电平线与4根行线相交叉的4个按键之中。
若所有列线均为低电平,则键盘中无键按下。
(2)判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键
的过程。
其方法是:
依次将行线置为高电平,即在置某根行线为高电平时,其它线为低电平。
在确定某根行线位置为高电平后,再逐行检测各列线的电平状态。
若某列为高,则该列线与置为高电平的行线交叉处的按键就是闭合的按键。
2.2显示电路设计
选择理由:
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如‘A’。
总体来说,操作简单,价格便宜。
四软件设计
4.1设计中的键盘、显示等驱动函数:
*键盘扫描程序:
uint8KEYSCAN(void)
*lcd初始化函数:
lcd_init()
*检查总线是否忙:
voidChkBusy()
*写命令函数:
voidLCD_WriteControl(uint8dat)
*写数据函数:
voidWrDat(uint8dat)
*显示文本函数:
DisText()
(驱动函数见附录)
4.2整体设计流程图如下
参考程序见附录。
五总结与体会:
通过本次设计,我对ARM的C语言编程方法有了很深刻的理解。
通过自己亲自编程实践,我学会了控制1602字符型液晶及矩阵式键盘的方法。
这次设计是对我们在课堂上所学知识的一次检验,虽然在理论课上学习了很多关于单片机的知识,但都没有经过具体的实践,很多东西都不能得到验证。
这次设计使我体会到了实践的乐趣(虽然只是仿真)。
由于是夸专业生,在这次设计碰到了不少困难;
但都通过查阅相关资料,请教老师和同学,以及自己的努力把问题解决掉了。
在这次的设计中,让我们发自内心的明白一些道理,我将好好地记录下这次设计的点点滴滴,我想,这不单是我的经历,更是我的一笔财富。
千里之行,始于足下。
这次学习,让我对ARM有了大概的了解,可以说,坐而言不如立而行,对于这些编程设计还是应该自己动手实际操作才会有深刻理解。
六参考文献:
[1].《ARM嵌入式系统基础教程》周立功
[2].《C语言程序设计》
[3].《MCS-51单片机应用系统设计》
[4].网上有关计算器方面的程序
附录:
结果仿真:
四位以上带小数的加减乘除,完整算式输出,右上角显示时钟。
程序
/************************************
*File:
main.c
*功能:
计算器基本程序
*************************************/
#include"
config.h"
stdlib.h"
string.h"
//memsethanshu
math.h"
#definers(1<
<
13)
#definerw(1<
14)
#defineen(1<
15)
#definebusy(1<
23)
uint8txt0[]={"
Hello!
"
};
uint8time[2]={12,34};
//时、分、秒计数
voidtimeshow(void);
voidtimer0_init(void);
void__irqtimerInt(void);
/***********************************
*名称:
函数及变量声明
*功能:
显示文本
*********************************/
voidport_init(void);
voidcov(longintb,uint8*p);
voidLCD_Cursor(charrow,charcolumn);
voidShowInt(uint8addr,uint16num);
voiddeal_date(void);
voiddeal_ope(void);
doublecalculate(void);
doublecalculate1(void);
uint8KEYSCAN(void);
uint8KEYCODE1[24]={'
C'
'
7'
8'
9'
*'
/'
'
H'
4'
5'
6'
-'
L'
M'
1'
2'
3'
+'
E'
B'
0'
.'
='
D'
};
/*ASCII码*/
longintre_temp1=0,re_temp2=0;
uint8BCD[7]={0};
uint8show[7]={0};
charkeypressed;
charlast_keypres='
;
doubledate[5]={0,0};
double*date_pt=&
date[1];
charoperater[5]={'
N'
char*oper_pt=operater;
uint8place=1;
chardate_temp[17];
char*temp_pt=date_temp;
*名称DelayNS
*功能延时函数
**********************************/
voidDelayNS(uint32dly)
{uint32i;
for(;
dly>
0;
dly--)
for(i=0;
i<
50000;
i++);
}
voidport_init(void)
端口初始化
{PINSEL0=0x00000000;
PINSEL1=0x00000000;
IO0DIR=0x00fff00F;
IO0CLR=0x0000000F;
}
cov(longintb,unsignedchar*p)
数据拆分
voidcov(longintb,unsignedchar*p)
{unsignedcharj=8;
while(--j)
{p[j]=b%10;
b=b/10;
}p[j]=b;
/********************************
ChkBusy()
检查总线是否忙
voidChkBusy()
{
IO0DIR=0xf000;
//700
while
(1)
{
IO0CLR=rs;
IO0SET=rw;
IO0SET=en;
if(!
(IO0PIN&
busy))break;
IO0CLR=en;
IO0DIR=0xfff000;
/****************************************
WrOp()
写命令函数
voidLCD_WriteControl(uint8dat)
{ChkBusy();
IO0CLR=rs;
//全部清零
IO0CLR=rw;
IO0CLR=0xff0000;
//先清零
IO0SET=dat<
16;
//再送数
IO0SET=en;
IO0CLR=en;
*名称CD_Cursor()
光标定位
voidLCD_Cursor(charrow,charcolumn)
{switch(row){
case1:
LCD_WriteControl(0x80+column-1);
break;
case2:
LCD_WriteControl(0xc0+column-1);
case3:
LCD_WriteControl(0x94+column-1);
case4:
LCD_WriteControl(0xd4+column-1);
default:
}}
WrDat()
写数据函数
voidWrDat(uint8dat)
ChkBusy();
IO0SET=rs;
/*************************************
lcd初始化函数
voidlcd_init(void)
{LCD_WriteControl(0x38);
LCD_WriteControl(0x06);
//光标加1
LCD_WriteControl(0x0c);
//开显示
/*********************************
显示文本函数
voidDisText(uint8addr,uint8*p)
{LCD_WriteControl(addr);
while(*p!
\0'
)WrDat(*(p++));
*名称ShowInt(uint8addr,uint16num)
数字显示程序
*********************************/
voidShowInt(uint8addr,uint16num)//在addr处显示数字num
{uint8i;
for(i=8;
i>
i--){BCD[i-1]=(uint8)(num%10+0x30);
num/=10;
i=0;
while(BCD[i]==0x30&
&
i<
7)BCD[i++]='
//NUM转换成数组存放,但还没有加上小数点
DisText(addr,BCD);
/********************************************名称timeshow(void)
时间显示程序
****************************************************************************/
voidtimeshow(void)
{uint8i,j=0;
uint8timebuff[5]={2,3,4,5,6};
for(i=0;
5;
i++)
timebuff[j++]=time[i]/10;
timebuff[j++]=time[i]%10;
j++;
2;
{LCD_Cursor(1,i+15);
WrDat(timebuff[i]+'
);
}
WrDat(0x3A);
i++;
for(i=3;
}LCD_Cursor(1,place);
/********************************************名称timer0_init(void)
中断定时初始化程序
voidtimer0_init(void)
{VICIntSelect=0x00000000;
VICIntEnable=0x00000010;
VICVectCntl0=0x00000024;
VICVectAddr0=(int)timerInt;
T0PR=1000;
//预分频寄存器
T0MR0=60000;
T0MCR=0x00000003;
T0TCR=0x00000003;
T0TCR=0x00000001;
/********************************************名称irqtimerInt(void)
中断处理程序
void__irqtimerInt(void)
{time[1]++;
//fen
if(time[1]>
=60)
{time[1]=0;
time[0]++;
//xiaoshi
if(time[0]>
=24)
{time[0]=0;
VICVectAddr=0;
T0IR=0x00000001;
*名称ate_or_ope()
判断是数值还是计算符
intdate_or_ope(charkey)
{if((key>
='
&
key<
)||(key=='
))
{return1;
return0;
/********************************************名称:
main()
intmain(void)
{uint8keyvalue1,keyvalue2;
uint8flag;
lcd_init();
port_init();
timer0_init();
//时钟初始化
DisText(0x80,txt0);
{timeshow();
keyvalue1=KEYSCAN();
if(keyvalue1!
=0xff)//有键按下
do{keyvalue2=KEYSCAN();
}while(keyvalue1==keyvalue2);
//作按键释放检查
keypressed=KEYCODE1[keyvalue1];
elsekeypressed=0xff;
//得到键符
//******************************************if(keypressed!
=0xff)
{flag=date_or_ope(keypressed);
if(flag==1)
{deal_date();
}
else
{deal_ope();
}
}//whileend
}//main函数结束
deal_date(void)
数值处理
voiddeal_date(void)
{if(date_or_ope(last_keypres)==1)
//如果上一个键值是数字字符
{*temp_pt++=keypressed;
Else
{memset(date_temp,0,15);
//用字符‘0’填充date_temp的前15个字节
temp_pt=date_temp;
*temp_pt++=keypressed;
last_keypres=keypressed;
WrDat(keypressed);
//显示字符可以在主函数中
place++;
return;
/********************************************名称voiddeal_ope(void)
符号处理
voiddeal_ope(void)//符号处理
{doubledate_value;
doubledate_result;
uint8i;
if(keypressed=='
)
{memset(date_temp,0,15);
last_keypres='
date[0]=0;
date[1]=0;
date_pt=&
oper_pt=operater;
operater[0]='
LCD_WriteControl(0x01);
LCD_Cursor(2,9);
WrDat('
place=1;
return;
//返回什么?
//elseif
elseif(keypressed=='
)//清除一位数或符号
{
if(date_or_ope(last_keypres)==1)
{intj;
j=strlen(date_temp);
date_temp[j-1]='
LCD_Cursor(1,place-1);
WrDat('
LCD_Cursor(1,place--);
return;
else{
*oper_pt='
oper_pt--;
}
}//elseifend
elseif(keypressed=='
||keypressed=='
)
{switch(keypressed)
{
case'
:
if(time[0]==24)time[0]=0;
break;
time[1]++;
if(ti
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 LPC2214 简易 计算器 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)