Lcd1602简易计算器

Lcd1602简易计算器
Lcd1602简易计算器

Lcd1602显示实现千位数加减乘除用4*4矩阵按键输入0~9 +,-,*,/,=,和清除建

#include

#define temp P3

sbit RS=P0^0;

sbit RW=P0^1;

sbit E =P0^2;

unsigned char key_num;

unsigned char lcd_tab3[16]=" ";

unsigned char code lcd_tab4[]="0123456789+-*/=";

unsigned char lcd_tab5[16]=" ";

unsigned char lcd_tab6[]=" ";

unsigned char lcd_tab7[]=".";

int a,b,c,d,m,i;

void decide();

long int key_cnt=0,key_number,key_number1;

unsigned char flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;

long int result, result1, result2, result3, result4,result5, result6, result7, result8;

int decimal0,decimal1;

delay_nms(unsigned int i)

{

unsigned int j;

for(;i!=0;i--)

{

for(j=0;j<61;j++);

}

}

key_scan(void)

{

unsigned char a;

temp=0xf0;

if(temp!=0xf0)

{

delay_nms(10);

{

if(temp!=0xf0)

switch(temp)

{

case 0xe0 :key_num= 0; break;

case 0xd0 :key_num= 1; break;

case 0xb0 :key_num= 2; break;

case 0x70 :key_num= 3; break;

}

temp=0x0f;

switch(temp)

{

case 0x0e :key_num=key_num; break;

case 0x0d :key_num= key_num+4; break;

case 0x0b :key_num= key_num+8; break;

case 0x07 : key_num=key_num+12; break;

default :break;

}

while((a<50)&&( temp!=0x0f))

{

delay_nms(1);

a++;

}

temp=0xf0;

}

}

return (key_num);

}

void write_com(char cod)

{

E=0;

RS=0;

RW=0;

E=1;

delay_nms(1);

P2=cod;

E=0;

delay_nms(1);

}

void write_data(char pat)

{

E=0;

RS=1;

RW=0;

E=1;

delay_nms(1);

P2=pat;

E=0;

delay_nms(1);

}

void write_clean()

{

write_com(0x38);

write_com(0x01);

write_com(0x06);

write_com(0x0c);

}

void input()

{

unsigned char i,x;

write_com(0x80);

for(i=0;i<16;i++)

{

write_data(lcd_tab3[i]);

delay_nms(1);

}

write_com(0xc0);

{

for(x=0;x<16;x++)

{

write_data(lcd_tab5[x]) ;

delay_nms(1);

}

}

}

void display()

{

if(flag5==0)

{

lcd_tab5[0]=lcd_tab4[key_num];

lcd_tab5[2]=lcd_tab4[result7];

lcd_tab5[3]=lcd_tab4[result6];

lcd_tab5[4]=lcd_tab4[result5];

lcd_tab5[5]=lcd_tab4[result4];

lcd_tab5[6]=lcd_tab4[result3];

lcd_tab5[7]=lcd_tab4[result2];

lcd_tab5[8]=lcd_tab4[result1];

if((decimal0!=0)||(decimal1!=0))

{

lcd_tab5[9]=lcd_tab7[0];

lcd_tab5[10]=lcd_tab4[decimal1];

lcd_tab5[11]=lcd_tab4[decimal0];

}

i=0;

decide();

}

else

{

lcd_tab5[0]=lcd_tab4[key_num];

lcd_tab5[1]=lcd_tab4[11];

lcd_tab5[2]=lcd_tab4[result8];

lcd_tab5[3]=lcd_tab4[result7];

lcd_tab5[4]=lcd_tab4[result6];

lcd_tab5[5]=lcd_tab4[result5];

lcd_tab5[6]=lcd_tab4[result4];

lcd_tab5[7]=lcd_tab4[result3];

lcd_tab5[8]=lcd_tab4[result2];

lcd_tab5[9]=lcd_tab4[result1];

i=1;

decide();

}

}

void decide()

{

if(lcd_tab5[1+i]==lcd_tab4[0])

{

lcd_tab5[1+i]=lcd_tab5[2+i];

lcd_tab5[2+i]=lcd_tab5[3+i];

lcd_tab5[3+i]=lcd_tab5[4+i];

lcd_tab5[4+i]=lcd_tab5[5+i];

lcd_tab5[5+i]=lcd_tab5[6+i];

lcd_tab5[6+i]=lcd_tab5[7+i];

lcd_tab5[8+i]=lcd_tab5[9];

lcd_tab5[9]=lcd_tab5[10];

lcd_tab5[10]=lcd_tab5[11];

lcd_tab5[11]=lcd_tab6[0];

if(lcd_tab5[1+i]==lcd_tab4[0]) {

lcd_tab5[1+i]=lcd_tab5[2+i];

lcd_tab5[2+i]=lcd_tab5[3+i];

lcd_tab5[3+i]=lcd_tab5[4+i];

lcd_tab5[4+i]=lcd_tab5[5+i];

lcd_tab5[5+i]=lcd_tab5[6+i];

lcd_tab5[6+i]=lcd_tab5[7+i];

lcd_tab5[7+i]=lcd_tab5[8+i];

lcd_tab5[8+i]=lcd_tab5[9];

lcd_tab5[9]=lcd_tab5[10];

lcd_tab5[10]=lcd_tab6[0];

lcd_tab5[11]=lcd_tab6[0];

if(lcd_tab5[1+i]==lcd_tab4[0]) {

if(lcd_tab5[1+i]==lcd_tab4[0]) {

lcd_tab5[1+i]=lcd_tab5[2+i];

lcd_tab5[2+i]=lcd_tab5[3+i];

lcd_tab5[3+i]=lcd_tab5[4+i];

lcd_tab5[4+i]=lcd_tab5[5+i];

lcd_tab5[5+i]=lcd_tab5[6+i];

lcd_tab5[6+i]=lcd_tab5[7+i];

lcd_tab5[7+i]=lcd_tab5[8+i];

lcd_tab5[8+i]=lcd_tab5[9];

lcd_tab5[9]=lcd_tab6[0];

lcd_tab5[10]=lcd_tab6[0];

lcd_tab5[11]=lcd_tab6[0];

if(lcd_tab5[1+i]==lcd_tab4[0]) {

lcd_tab5[1+i]=lcd_tab5[2+i];

lcd_tab5[2+i]=lcd_tab5[3+i];

lcd_tab5[3+i]=lcd_tab5[4+i];

lcd_tab5[4+i]=lcd_tab5[5+i];

lcd_tab5[5+i]=lcd_tab5[6+i];

lcd_tab5[6+i]=lcd_tab5[7+i];

lcd_tab5[7+i]=lcd_tab5[8+i];

lcd_tab5[8+i]=lcd_tab6[0];

lcd_tab5[9]=lcd_tab6[0];

lcd_tab5[10]=lcd_tab6[0];

lcd_tab5[11]=lcd_tab6[0];

if(lcd_tab5[1+i]==lcd_tab4[0]) {

lcd_tab5[1+i]=lcd_tab5[2+i];

lcd_tab5[2+i]=lcd_tab5[3+i];

lcd_tab5[3+i]=lcd_tab5[4+i];

lcd_tab5[4+i]=lcd_tab5[5+i];

lcd_tab5[5+i]=lcd_tab5[6+i];

lcd_tab5[6+i]=lcd_tab5[7+i];

lcd_tab5[7+i]=lcd_tab6[0];

lcd_tab5[8+i]=lcd_tab6[0];

lcd_tab5[9]=lcd_tab6[0];

lcd_tab5[10]=lcd_tab6[0];

lcd_tab5[11]=lcd_tab6[0];

if(lcd_tab5[1+i]==lcd_tab4[0]) {

lcd_tab5[1+i]=lcd_tab5[2+i];

lcd_tab5[2+i]=lcd_tab5[3+i];

lcd_tab5[3+i]=lcd_tab5[4+i];

lcd_tab5[4+i]=lcd_tab5[5+i];

lcd_tab5[5+i]=lcd_tab5[6+i];

lcd_tab5[6+i]=lcd_tab6[0];

lcd_tab5[7+i]=lcd_tab6[0];

lcd_tab5[8+i]=lcd_tab6[0];

lcd_tab5[9]=lcd_tab6[0];

lcd_tab5[10]=lcd_tab6[0];

lcd_tab5[11]=lcd_tab6[0];

if(lcd_tab5[1+i]==lcd_tab4[0]) {

lcd_tab5[1+i]=lcd_tab5[2+i];

lcd_tab5[2+i]=lcd_tab5[3+i];

lcd_tab5[3+i]=lcd_tab5[4+i];

lcd_tab5[4+i]=lcd_tab5[5+i];

lcd_tab5[5+i]=lcd_tab6[0];

lcd_tab5[6+i]=lcd_tab6[0];

lcd_tab5[7+i]=lcd_tab6[0];

lcd_tab5[8+i]=lcd_tab6[0];

lcd_tab5[9]=lcd_tab6[0];

lcd_tab5[10]=lcd_tab6[0];

lcd_tab5[11]=lcd_tab6[0];

}

}

}

}

}

}

}

}

}

void lcd_shiftl(void)

{

lcd_tab3[0]=lcd_tab3[1];

lcd_tab3[1]=lcd_tab3[2];

lcd_tab3[2]=lcd_tab3[3];

lcd_tab3[3]=lcd_tab3[4];

lcd_tab3[4]=lcd_tab3[5];

lcd_tab3[5]=lcd_tab3[6];

lcd_tab3[6]=lcd_tab3[7];

lcd_tab3[7]=lcd_tab3[8];

lcd_tab3[8]=lcd_tab3[9];

lcd_tab3[9]=lcd_tab3[10];

lcd_tab3[10]=lcd_tab3[11];

lcd_tab3[11]=lcd_tab3[12];

lcd_tab3[12]=lcd_tab3[13];

lcd_tab3[13]=lcd_tab3[14];

lcd_tab3[14]=lcd_tab3[15];

lcd_tab3[15]=lcd_tab4[key_num];

}

void displasis()

{

int i;

for(i=0;i<16;i++)

{

lcd_tab3[i]=lcd_tab6[0];

}

for(i=0;i<16;i++)

{

lcd_tab5[i]=lcd_tab6[0];

}

key_cnt=key_number=key_number1=0;

a=b=c=d=0;

result=result1=result2=result3=result4=result5=result6=result7=result8=0;

flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;

decimal0=0;decimal1=0;

}

void main()

{

while(1)

{

write_clean();

input();

m=1;

while(m)

{

P3=0xf0;

if(P3!=0xf0)

{

m=0;

}

}

P3=0xf0;

if(P3!=0xf0)

{

key_scan();

if(key_num<=9)

{

if(key_cnt<4)

{

switch(key_cnt)

{

case 0: a=key_num ; break;

case 1: a=a*10 ;b=key_num; a=a+b; break;

case 2: a=a*10 ;c=key_num; a=a+c; break;

case 3: a=a*10 ;d=key_num; a=a+d; break;

}

lcd_shiftl();

key_cnt++;

}

while(P3!=0xf0)

{

;

}

}

if(key_num==10) //加法

{

flag1=1;

key_number=a;

a=b=c=d=0;

key_cnt=0;

lcd_shiftl();

while(P3!=0xf0)

{

;

}

}

if(key_num==11) //减法{

flag2=1;

key_number=a;

a=b=c=d=0;

key_cnt=0;

lcd_shiftl();

while(P3!=0xf0)

{

;

}

}

if(key_num==12) // 乘法{

flag3=1;

key_number=a;

a=b=c=d=0;

key_cnt=0;

lcd_shiftl();

while(P3!=0xf0)

{

;

}

}

if(key_num==13) //除法{

flag4=1;

key_number=a;

a=b=c=d=0;

key_cnt=0;

lcd_shiftl();

while(P3!=0xf0)

{

;

}

}

if(key_num==14)

{

while(P3!=0xf0)

{

;

}

key_number1=a;

a=b=c=d=0;

key_cnt=0;

if((flag1==1)&&(key_number1!=0))

{

result=key_number+key_number1; //加法运算result1= result%10;

result2= result/10%10;

result3= result/100%10;

result4= result/1000%10;

result5= result/10000%10;

result6= result/100000%10;

result7= result/1000000%10;

result8= result/10000000;

delay_nms(2);

key_number1=0 ;

key_number=result;

display();

}

if((flag2==1)&&(key_number1!=0)) //减法运算

{

result=key_number-key_number1;

if(result<0)

{

result= key_number1-key_number;

flag5=1;

}

result1= result%10;

result2= result/10%10;

result3= result/100%10;

result4= result/1000%10;

result5= result/10000%10;

result6= result/100000%10;

result7= result/1000000%10;

result8= result/10000000;

delay_nms(2);

key_number1=0 ;

key_number=result;

display();

}

if((flag3==1)&&(key_number1!=0))

{

result=key_number*key_number1; //乘法运算

result1= result%10;

result2= result/10%10;

result3= result/100%10;

result4= result/1000%10;

result5= result/10000%10;

result6= result/100000%10;

result7= result/1000000%10;

result8= result/10000000;

delay_nms(2);

key_number1=0 ;

key_number=result;

display();

}

if((flag4==1)&&(key_number1!=0)) //除法运算

{

result=key_number/key_number1;

decimal0=((key_number*100)/key_number1)%10;

//小数各位

decimal1=((key_number*100)/key_number1)/10%10; //小数十位

result1= result%10;

result2= result/10%10;

result3= result/100%10;

result4= result/1000%10;

result5= result/10000%10;

result6= result/100000%10;

result7= result/1000000%10;

result8= result/10000000;

delay_nms(2);

key_number1=0 ;

key_number=result;

display();

}

}

if(key_num==15)

{

while(P3!=0xf0)

{

;

}

displasis();

}

}

}

}

LCD1602汇编显示程序

;1602显示ABC LCD_RS EQU P2.5 LCD_RW EQU P2.6 LCD_EN EQU P2.7 LCD_DATA EQU P3 ;----------------- ORG0000H JMP START ORG0030H ;----------------- LCD: CALL LCD_INIT MOV A, #80H CALL LCD_WCMD MOV A, #'A' CALL LCD_WDATA MOV A, #'B' CALL LCD_WDATA MOV A, #'C' CALL LCD_WDATA AJMP$ ;---------------- DELAY5MS: MOV R6, #10 DL1:DJNZ R7, $ DJNZ R6, DL1 RET ;---------------- LCD_INIT: CALL DELAY5MS MOV A, #38H CALL LCD_WCMD CALL DELAY5MS

CALL DELAY5MS MOV A, #06H CALL LCD_WCMD MOV A, #01H CALL LCD_WCMD MOV A, #0CH CALL LCD_WCMD RET ;===================================== LCD_WCMD: CALL CHECKBUSY CLR LCD_RS JMP W_LCD ;---------------- LCD_WDATA: CALL CHECKBUSY SETB LCD_RS W_LCD: CLR LCD_RW MOV LCD_DATA, A SETB LCD_EN NOP CLR LCD_EN RET ;---------------- CHECKBUSY: PUSH ACC MOV LCD_DATA, #255 CLR LCD_RS SETB LCD_RW BUSYLOOP: SETB LCD_EN NOP MOV A, LCD_DATA CLR LCD_EN JB ACC.7, BUSYLOOP POP ACC RET

GUI设计的简易计算器附程序

电子信息工程系实验报告 课程名称:MATLAB 应用 实验项目名称:GUI 计算器设计 实验时间:2012-11-22班级:测控081姓名:学号:810707132实验目的: 1.熟悉MATLAB 的菜单设计方法 2.熟悉MATLAB 的主要控件使用方法 3.熟悉MATLAB 的GUI 设计流程 4.运用MATLAB 的GUI 设计一个简单的计算器 实验环境: MATLAB7.8 实验内容: function varargout =jisuanqi1(varargin)%JISUANQI1M-file for jisuanqi1.fig %JISUANQI1,by itself,creates a new JISUANQI1or raises the existing %singleton*.%%H =JISUANQI1returns the handle to a new JISUANQI1or the handle to %the existing singleton*.%%JISUANQI1('CALLBACK',hObject,eventData,handles,...)calls the local %function named CALLBACK in JISUANQI1.M with the given input arguments.%%JISUANQI1('Property','Value',...)creates a new JISUANQI1or raises the %existing singleton*.Starting from the left,property value pairs are %applied to the GUI before jisuanqi1_OpeningFunction gets called.An %unrecognized property name or invalid value makes property application %stop.All inputs are passed to jisuanqi1_OpeningFcn via varargin.%%*See GUI Options on GUIDE's Tools menu.Choose "GUI allows only one %instance to run (singleton)".%%See also:GUIDE,GUIDATA,GUIHANDLES %Edit the above text to modify the response to help jisuanqi1 %Last Modified by GUIDE v2.505-Dec-201022:24:59 %Begin initialization code -DO NOT EDIT gui_Singleton =1;成 绩: 指导教师(签名):

简易计算器的设计与实现

沈阳航空航天大学 课程设计报告 课程设计名称:单片机系统综合课程设计课程设计题目:简易计算器的设计与实现 院(系): 专业: 班级: 学号: 姓名: 指导教师: 完成日期:

沈阳航空航天大学课程设计报告 目录 第1章总体设计方案 (1) 1.1设计内容 (1) 1.2设计原理 (1) 1.3设计思路 (2) 1.4实验环境 (2) 第2章详细设计方案 (3) 2.1硬件电路设计 (3) 2.2主程序设计 (7) 2.2功能模块的设计与实现 (8) 第3章结果测试及分析 (11) 3.1结果测试 (11) 3.2结果分析 (11) 参考文献 (12) 附录1 元件清单 (13) 附录2 总电路图 (14) 附录3 程序代码 (15)

第1章总体设计方案 1.1 设计内容 本设计是基于51系列的单片机进行的十进制计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除1位无符号数字的简单四则运算,并在6位8段数码管上显示相应的结果。 设计过程在硬件与软件方面进行同步设计。硬件方面从功能考虑,首先选择内部存储资源丰富的8751单片机,输入采用4×4矩阵键盘。显示采用6位8段共阳极数码管动态显示。软件方面从分析计算器功能、流程图设计,再到程序的编写进行系统设计。编程语言方面从程序总体设计以及高效性和功能性对C语言和汇编语言进行比较分析,最终选用汇编语言进行编程,并用protel99se涉及硬件电路。 1.2 设计原理 在该课程设计中,主要用到一个8751芯片和串接的共阳数码管,和一组阵列式键盘。作为该设计的主要部分,下面将对它们的原理及功能做详细介绍和说明。 1)提出方案 以8751为核心,和数码管以及键盘用实验箱上已有的器件实现计算器的功能。 2) 总体方案实现 (1)要解决键值得读入。先向键盘的全部列线送低电平,在检测键盘的行线,如果有一行为低电平,说明可能有按键按下,则程序转入抖动检测---就是延时10ms再读键盘的行线,如读得的数据与第一次的相同,说明真的有按键按下,程序转入确认哪一键按下的程序,该程序是依次向键盘的列线送低电平,然后读键盘的行线,如果读的值与第一次相同就停止读,此时就会的到键盘的行码与列码

基于单片机的简易计算器设计

目录 引言 (1) 第一章设计原理及要求 (2) 1.1设计方案的确定 (2) 1.2系统的设计方案 (2) 1.3系统的设计要求 (2) 第二章硬件模块设计 (4) 2.1单片机AT89C51 (4) 2.1.1 AT89C51芯片的特点 (5) 2.1.2 管脚说明 (5) 2.1.3 振荡器特性 (7) 2.1.4 芯片擦除 (7) 2.2键盘控制模块 (7) 2.2.1 矩阵键盘的工作原理 (8) 2.2.2 键盘电路主要器件介绍 (8) 2.3LCD显示模块 (10) 2.3.1 显示电路 (11) 2.3.2 LCD1602主要技术参数 (11) 2.3.3 引脚功能说明 (11) 2.4运算模块(单片机控制) (12) 第三章软件设计 (14) 3.1功能介绍 (14) 3.2系统流程图 (14) 3.3程序 (16) 第四章系统调试 (17) 4.1软件介绍 (17) 4.1.1 Keil uVision2仿真软件简介 (17) 4.1.2 protues简介 (17)

4.2软件调试 (18) 4.2.1 软件分析及常见故障 (18) 4.2.2 仿真结果演示 (20) 4.3硬件调试 (21) 结束语 (23) 参考文献 (24) 附录 (25) 致谢 (36)

引言 计算工具最早诞生于中国,中国古代最早采用的一种计算工具叫筹策,也被叫做算筹。这种算筹多用竹子制成,也有用木头,兽骨充当材料的,约二百七十枚一束,放在布袋里可随身携带。另外直到今天仍在使用的珠算盘,是中国古代计算工具领域中的另一项发明,明代时的珠算盘已经与现代的珠算盘几乎相同。 17世纪初,西方国家的计算工具有了较大的发展,英国数学家纳皮尔发明的“纳皮尔算筹”,英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加、减、乘、除、乘方和开方运算,甚至可以计算三角函数、指数函数和对数函数。这些计算工具不仅带动了计算器的发展,也为现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具。1642年,年仅19岁的法国伟大科学家帕斯卡引用算盘的原理,发明了第一部机械式计算器,在他的计算器中有一些互相联锁的齿轮,一个转过十位的齿轮会使另一个齿轮转过一位,人们可以像拨电话号码盘那样,把数字拨进去,计算结果就会出现在另一个窗口中,但是它只能做加减运算。1694年,莱布尼兹在德国将其改进成可以进行乘除的计算。此后,一直到20世纪50年代末才有电子计算器的出现。

简单计算器设计报告

简单计算器设计报告 045 一、基本功能描述 通过文本编辑框实现基本整数的加减乘除运算 二、设计思路 如下图是整个程序进行的流程图,基本方法是在ItemText文本编辑框输入字符,程序对字符进行判断,若输入不是数字则提示错误。输入正常时,通过下拉框ComboBox_InsertString 选择相应运算符。点击等号IDC_OK,即可得出运算结果。操作简便,算法简单。 三、软件设计 1、设计步骤 打开Microsoft Visual C++ 6.0,在文件中点击新建,在弹出框内选择MFC AppWizard[exe]工程,输入工程名zhoutong及其所在位置,点击确定 1

将弹出MFC AppWizard-step 1对话框,选择基本对话框,点击完成 MFC AppWizard就建立了一个基于对话窗口的程序框架

四、主要程序分析 1、字符判定函数 BOOL IsInt(TCHAR*str) { int i=atoi(str); TCHAR strtemp[256]; wsprintf(strtemp,"%i",i); if(strcmp(str,strtemp)!=0) { return FALSE; } Else { return TRUE; } } 该函数通过atoi把文本编辑框读取的字符转换为数字,再通过wsprintf把转换数字转换为字符,通过strcmp比较原字符和转换得来的字符。如相同返回true,不通则返回false. 3、运算符选择程序 BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { HWND hwndComboOP=GetDlgItem(hwnd,IDC_COMBOOP); ComboBox_InsertString(hwndComboOP,-1,TEXT("+")); ComboBox_InsertString(hwndComboOP,-1,TEXT("-")); ComboBox_InsertString(hwndComboOP,-1,TEXT("*")); ComboBox_InsertString(hwndComboOP,-1,TEXT("/")); return TRUE; } 3

计算器模拟系统设计-毕业设计

计算器模拟系统设计 学生:XXX 指导教师:XXX 内容摘要:本设计是基于51系列的单片机进行的简易计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除3位无符号数字的简单四则运算,并在LED 上相应的显示结果。 设计过程在硬件与软件方面进行同步设计。硬件选择AT89C51单片机和 74lS164,输入用4×4矩阵键盘。显示用5位7段共阴极LED静态显示。软件从分析计算器功能、流程图设计,再到程序的编写进行系统设计。选用编译效率最高的Keil 软件用汇编语言进行编程,并用proteus仿真。 关键词:LED 计算器 AT89C51芯片 74LS164

Calculator simulation system desig n Abstract:The design is a simple calculator based on 51 series microcontroller system design, to complete the calculator keyboard input, add, subtract, multiply, and in addition to three unsigned numeric simple four operations, and the corresponding result will be displayed on the LED. The design process of hardware and software aspects of the synchronous design. Hardware choose AT89C51 microcontroller and 74ls164--enter the 4 × 4 matrix keyboard. Static display with five 7-segment common cathode LED display. Software calculator function from the analysis, flow charts, design, and then program the preparation of system design. Selected to compile the most efficient Keil software in assembly language programming, and with proteus simulation. Keywords: LED calculator AT89C51 chip 74LS164

lcd1602按键显示程序

#include<> #include<> //包含_nop_()函数定义的头文件 typedef unsigned int uint ; typedef unsigned char uchar ; sbit RS=P2^0; //寄存器选择位,将RS位定义为引脚 sbit RW=P2^1; //读写选择位,将RW位定义为引脚 sbit E=P2^2; //使能信号位,将E位定义为引脚 sbit BF=P0^7; //忙碌标志位,,将BF位定义为引脚 " uchar keyscan(); void delay1ms(); void delay(unsigned char n); unsigned char BusyTest(void); void WriteInstruction (unsigned char dictate); void WriteAddress(unsigned char x); … void WriteData(unsigned char y); void LcdInitiate(void); void delay1ms() { unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++); } ! void delay(unsigned char n) { unsigned char i; for(i=0;i

VerilogHDL简单计算器设计

目录 第一章设计目的及任务要求..................................................................................... 错误!未定义书签。 设计目的................................................... 错误!未定义书签。 设计任务................................................... 错误!未定义书签。 课设要求................................................... 错误!未定义书签。第二章设计思路............................................... 错误!未定义书签。 设计总体框图............................................... 错误!未定义书签。 设计原理................................................... 错误!未定义书签。 计算其原理............................................. 错误!未定义书签。 数码显示原理........................................... 错误!未定义书签。 八位数码管扫描的原理................................... 错误!未定义书签。第三章设计源程序及分析....................................... 错误!未定义书签。 计算器模块................................................. 错误!未定义书签。 计算器源程序........................................... 错误!未定义书签。 计算器程序分析......................................... 错误!未定义书签。 数码管显示部分...................................................................................................... 错误!未定义书签。 数码管显示源程序.......................................................................................... 错误!未定义书签。 数码管显示程序分析..................................................................................... 错误!未定义书签。 循环扫描模块........................................................................................................... 错误!未定义书签。 循环扫描程序................................................................................................... 错误!未定义书签。 循环程序分析................................................................................................... 错误!未定义书签。 总程序及其分析...................................................................................................... 错误!未定义书签。第四章时序仿真和结果验证..................................................................................... 错误!未定义书签。

单片机设计简易计算器

简易计算器 Simply Calculator 1 设计思想 此计算器有键盘部分、单片机、显示部分三部分组成,键盘部分主要完成输入功能;单片机主要完成数据处理功能,包括确定按键,完成运算,以及输出数据;显示器部分主要完成单片机输出的显示。 本设计的思路是利用单片机性能好,稳定性强的优点来实现系统的运行。设计大致可以分为三个步骤:第一步,硬件的选取和设计;第二步,程序的设计和调试;第三步,Protues 系统仿真。 硬件是设计的骨骼,不仅关系到设计总体方向的确定,还要综合考虑节能,环保,以及稳定性和经济性等各种因素。因此需要花费大量的时间。硬件的选取最为重要,包括选用的芯片,显示设备的选取,输入设备的选取等。本设计是通过单片机来实现的,因此选用了ATMEGA16单片机作为主体,输入设备选用矩阵键盘。程序是硬件的灵魂,是实现设计的中心环节。本设计使用的程序语言是C语言,在“ICC AVR”中运行,调试,直到运行出正确结果,然后输出后缀名为.HEX格式的文件,以备在Protues中仿真使用。程序是设计的关键,程序的调试需要大量的时间,耐心,还够要有足的细心才能成功。本设计中就出现了大量的错误,经过认真修改,最终才能运行出正确结果。最后的系统仿真是设计是否成功的验证,是设计不可缺少的重要环节。这就要求能掌握Protues的一些基本操作。2原理分析 2.1矩阵键盘的扫描 图2.1 矩阵键盘图

如图2.1所示,单片机的8个I/O口和矩阵键盘相连,用8个I/O口来控制矩阵键盘的16个按键是非常有意思的,首先我们设置单片机的PD0—PD7为输出,且PD0—PD3依次设置为低电平,而PD4—PD7设置为高电平,然后我们设置PD4—PD7为输入,而PD0—PD3仍然为输出,假如此时M1键按下,则PD0与PD4相连,因为PD0是低电平,而PD4是输入,所以PD4会被拉为低电平,同理,如果M2被按下,则PD5会被拉低,M3按下,PD6会被拉低,M4按下,PD7被拉低。这是判断有无键盘按下的过程,当我们判断是那一个键盘按下时,我们首先设置8个I/O口为输出,输出为FE,即,PD0为低电平,其他全为高电平,然后我们设置PD4—PD7为输入,如果M1被按下,则PD4会比被拉为低电平,此时会变成EE,同理可以知道M2被按下时会变为DE,M3被按下时会变为BE,M4被按下时会变为7E。同理我们可以设置8个I/O口输出FD来检测M5—M8是否被按下,设置8个I/O口输出FC来来检测M9—M12,设置8个I/O口输出F7来检测M13—M16,如果M1—M4没有被按下,就继续检测M4—M8,一次类推,就可以检测出16个按键了。在这次设计中,16个按键M1—M16所对应检测值分别为:EE,DE,BE,7E,ED,DD,BD,7D,EB,DB,BB,7B,E7,D7,B7,77。 2.2 数字显示与计算 本次设计选用的显示器是1602液晶显示器,此液晶显示器能显示32个字符,VSS接地,VDD接电源正极,E为时使能信号,R/W为读写选择端(H/L),RS为数据/命令选择端(H/L),D0—D7为数据I/O口。 首先我们初始化液晶显示器,然后显示出第一个被按下的数,并且使光标右移,如果有第二个数按下,则据继续显示,以此类推,然后把所有显示出来的数换算成一个数,如果按下“+”号,则显示出“+”,并且同理显示出“+”号后面按下的数字,然后调用加子程序,运算出结果,如果按下的是“-”,则调用减子程序,如果按下“*”,则调用乘子程序,如果按下“/”,则调用除子程序。然后再调用显示结果子程序,显示出结果。

简易计算器设计实验报告

简易计算器设计实验报告 一.设计任务及要求 1.1实验任务: 根据计算器的原理设计一个具有加减乘除功能的简易计算器。如:5+3*4/8=4。 1.2 实验基本要求: (1)实现最大输入两位十进制数字的四则运算(加减乘除)。 (2)能够实现多次连算(无优先级,从左到右计算结果)。 如:12+34*56-78/90+9=36 (3)最大长度以数码管最大个数为限,溢出报警。 二.实验设计方案 (1)用QuartusII的原理图输入来完成系统的顶层设计。 (2)用VHDL编写以及直接拖模块来各功能模块。 (3)通过2个脉冲分别实现个位数和十位数的输入。 (4)通过选择每次的输出数值,将输出值反馈到运算输入端 (4)通过除法运算实现十六进制到十进制的转换输出。 其具体实现流程图如下:

三系统硬件设计 FPGA: EP2C5T144C8目标板及相应外围硬件电路。(从略) 四系统软件设计 1.数据输入模块 原理:用VHDL创建模块,通过两个脉冲分别对两个数码管进行输入控制,再通过相应运算模块将两个独立数据转化成两位十进制数字。 2.运算模块 原理:用VHDL创建模块,四种运算同步运行,通过按键加、减、乘、除选择输出对应的计算结果,当按键等号来时,将所得结果反馈给运算模块输入端。具体实现代码见附录二。 3.输出模块 原理:用VHDL创建模块,通过按键等号来控制显示运算对象还是运算结果,当等号按下时,输出计算结果,否则显示当前输入的数据,并且通过除法模块将十六进制转化为十进制。当输出结果溢出是LED0亮,同时数码管显示都为零。部分实现见附录二。 五实验调试 输入数据12,再按加法键,输入第二个数字25,按等号键,数码管显示37;按灭加法、等号键,输入第二个数据2,依次按等号键,减法键,数码管显示35;同上,按灭减法键、等号键,输入第三个数据7,依次按等号键,除法键,数码管显示5;按灭除法键、等号键,输入第四个数据99,依次按等号键,乘法键,数码管显示495,按灭乘法键、等号键,当前显示为99,依次按等号键、乘法键,数码管显示49005,同上进行若干次之后,结果溢出,LED0亮,同时数码管显示都为零。当输出为负数时,LED0灯变亮,同时数码管显示都为零。六实验结论 本实验基本实现了计算器的加减乘法运算功能,但是存在一个突出的缺陷,就是当输出结果时,必须先按等号键导通数据反馈,再按运算键选择输出结果。这与实际应用的计算器存在很大的差距。但是,本设计可以通过等号键实现运算对象和运算结果之间的切换。

(完整版)基于51单片机简易计算器的设计毕业设计

本科毕业论文 题目:基于51单片机简易计算器的设计 院(系):物理与电子工程学院 专业:应用物理学 学生姓名:王彬 指导教师:王强 职称:

2014年11月5日 目录 摘要 (1) 关键字 (1) 引言 (1) 1、单片机及其应用 (2) 1.1 单片机介绍 (2) 1.2 单片机应用 (2) 1.3 AT89C51单片机 (3) 2、LCD1602和74LS08的工作理 (7) 2.1 选取LCD1602 ……………………………………………………… 2.2 LCD1602的功能和指令现………………………………………………… 2.3 74LS08的功能………………………………………… 3、系统实现模块框 架…………………………………………………………… 3.1 硬件设计电路框 图……………………………………………………… 3.2 实现原理框

图…………………………………………………………… 4、硬件设计及仿真…………………………………………………………… 4.1 晶振、复位电路的设 计………………………………………………… 4.2 按键电路的设计……………………………………………… 4.3 LCD1602显示电路的设计………………………………………… 5、软件设计…………………………………………………………… 6、总结…………………………………………………………… 7、参考文献…………………………………………………………… 8、附件…………………………………………………………… 摘要:简易计算器在人们的生活中应用极为广泛,由于它主要进行一些简单的运算,适用性强,并且方便携带,所以在许多的地方都必不可缺,比如在办公,交易等等。本系统主要介绍计算器实现简易计算的这个详细的过程,它的电路是以AT89C51单片机作为核心器件的,并且它的功耗低,能再3V的低压下工作,有时也可按照要求提升一定的电压。它的硬件部分主要由AT89C51单片机、按键、LCD1602显示屏、指示灯系统等部分构成。软件部分,是在Keil平台用C语言编写程序,包括运算、复位、延时、计算等。其次电路的设计会再proteus上面进行仿真,以保障硬件电路的正确。 关键字:AT89C51单片机;LCD1602显示屏;74LS08;按键;C语言。引言:计算器是日常学习和生活中的好帮手,比如对工科的学生来说,常常要用到基本的 +,-,* ,/ 运算,备有一个科学计算器在手边,可以把繁琐的计算迅速解决,对学习事半功倍。单片机是一种集成的电路芯片,它是采用超大规模集成电路技术把具有数据处理能力的中央处理器

简易计算器的设计

一、功能实现:利用1602液晶显示器实现整数和小数的加法、减法、乘法、除法、开根号的运算。第一行显示输入的数据,第二行显示运算结果。 二、Proteus仿真图

三、操作说明:每次运算完后必须按一下清零键,该系统才会重新开始执行。 四、程序: #include #include #define int unsigned int #define char unsigned char void inti(); //初始化

void delay(); //延时 void anjian(); //按键显示数字和符号,第一个数存在a内 void sheji(); //设计显示完后的参数 void jsab(); //存储两个输入数 void jisuanxs(); //计算显示 void chufa(); //除法计算部分 void chengfa(); //乘法计算部分 void jianfa(); //减法计算部分 void jiafa(); //加法计算部分 void kaigenhao(); //开根号运算部分 void benshenxs(); //一个数本事显示 void leijixiaoshudian(); //小数点的累计 void fenli(); //计算后的结果分离,以便于显示 void ql(); //清屏 void xshuju(char shuju); //写数据 void xzhiling(char zhiling); //写指令 //char num[]="I LOVE YOU"; 显示在屏幕上 int sz[]={'0','1','2','3','4','5','6','7','8','9','+','-','*','/','=','.'}; char xs[]="ENRRO"; sbit e=P2^2; sbit rs=P2^0; sbit rw=P2^1; sbit key0=P2^6; sbit key1=P2^7; sbit key2=P3^0; sbit key3=P3^1; sbit key4=P3^2; sbit key5=P3^3; sbit key6=P3^4; sbit key7=P3^5; sbit key8=P3^6; sbit key9=P3^7; sbit key10=P1^3; sbit key11=P1^4; sbit key12=P1^5; sbit key13=P1^6; sbit key14=P1^7; sbit qingling=P1^0; sbit key15=P1^1; sbit key16=P1^2; int fuhao,num,m,n,q,w,s,fuhao1,fuhao2,fuhao3,fuhao4,fuhao5,xiaoshu,cishu1,cishu2; int i,g,j,p; int t,f,h; float a,b,c,d;

简易计算器课程设计报告

《C++程序设计》(MFC)课程设计报告 设计题目:简易计算器 班级: 姓名: 学号: 指导教师: 时间:2010年6月30日

目录 1.设计目标…………………………………………………………… 2.设计内容…………………………………………………………… 3.设计思想…………………………………………………………… 4.设计说明…………………………………………………………… 5.设计步骤…………………………………………………………… 6.主要成员函数关系图……………………………………………… 7.程序主要代码……………………………………………………… 8. 难点分析…………………………………………………………… 9. 总结…………………………………………………………………

简易计算器(MFC) 1.设计目标 了解Windows应用程序的结构与DOS程序的不同,掌握应用MFC类库编写Windows应用程序的基本模式。 2.设计内容 以简易计算器为例,通过对简单应用软件计算器的设计,编制、调试,实现简单的加,减,乘,除等运算,以学习应用MFC库类编写对话框的原理,加深对C++类的学习及应用。 3. 设计思想 基于MFC库类对对话框界面的设计,通过创建类成员函数成员变量,编辑控件创建消息映射,调用消息函数完成数据的输入输出,实现计算功能。生成简单的应用软件。 4.设计说明 (1)包含的功能有:加、减、乘、除运算,开方、平方等功能。 (2)计算器上数字0—9为一个控件数组,加、减、乘、除为一个控件数组,其余为单一的控件。 (3)输入的原始数据、运算中间数据和结果都显示在窗口顶部的同一个标签中。 (4)计算功能基本上是用系统内部函数。 (5)程序可以能自动判断输入数据的正确性,保证不出现多于一个小数点、以0开头等不正常现象。 (6)“CE”按钮可以清除所有已输入的数据从头计算 5. 设计步骤 (1)选择FileNewlProject命令,选择MFC AppWizard(exe)创建Project名为Caa,按确定。在弹出界面选择创建对话框,单击Finish按钮 (2)在生成的设计界面中加入控件,得到计算器应用界面。如图:

设计一个简单计算器的C语言课程设计报告

C语言课程设计报告题目:设计一个简单计算器 目录 1. 设计目的 2. 内容

3. 总体设计(有流程图) 4. 源程序编写(附上了运行图) 5. 执行结果 6. 心得体会 一、设计目的 设计一个简单计算器,在功能上功能尽量模拟windows 操作系统中的计算器,系统界面不做强制要求。 全面熟悉、掌握C语言基本知识,掌握C程序设计中的顺序、分支、循环三种结构及数组、函数、指针和文件的操作,把编程和实际结合起来,增强对不同的问题运用和灵活选择合适的数据结构以及算法描述的本领,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用计算机解决实际问题的能力,规范编程思想,为以后在专业

课程中应用计算机系统解决计算、分析、实验和设计等学习环节打下较扎实的基础。 二、内容 1、程序设计的一般步骤 a、确定数据结构 b、确定算法 C、编程 d、调试 e、总结资料 2、基本要求 a .设计正确,方案合理,能实现相应功能。 b .界面友好,使用方便。 c .程序精炼,结构清晰。 d .设计报告含程序设计说明,用户使用说明,源程序清单及程序框图。 e .上机演示。

三、总体设计(程序设计组成框图、流程图)

四、源程序编与 #in clude #in clude #in clude double jisua n( char a[]) { int i=1,j,k,m,cnt=0,t1=0,t2=0,t3=0; char nibo[50],zha n2[50]; double x,n, l,z=0,zha n3[20]; typedef struct { double d1; int d2; }dd; typedef struct {

java课程设计报告_简单图形界面计算器的设计

Java 课程设计 简单图形界面计算器的设计 课程名称 Java程序设计 选题名称简单图形界面计算器的设计 专业 班级 姓名 学号 指导教师 简单图形界面计算器的设计

一、设计任务与目标 本次java程序设计我的设计任务是设计一个图形界面(GUI)的计算器应用程序并且能够完成简单的算术运算。本次任务的基本要求是这个计算器应用程序可以完成十进制的加、减、乘、除、求倒、取余、开方运算,且有小数点、正负号、退格和清零功能。而我要在此基础上添加一项千位符分隔符的功能,即以三位为一级,在输入的一串数字中每三位加入一个逗号,这项功能国际通用,并已经成为惯例,会计记账都用这种方法便于账目核算与管理。 GUI计算器设计的具体目标: 1.完成十进制的加、减、乘、除、求倒、取余和开方运算; 2.有小数点和正负号加入运算; 3.有退格、复位和清零的功能; 4.有千位符分隔符的功能,即在输入的一串数字中每三位加入一个逗号。 二、方案设计与论证 1.设计目标的总体分析 (1)设计目标的需求分析:计算器是现在一个普遍应用的工具,能够解决许多人工所无法计算的数据,节省大量宝贵的时间。 (2)设计目标的功能分析:实现计算器系统的功能,主要有两个功能模块:输入和输出。 (3)设计原则:基于计算器系统要具有适用性广、操作简便等特点,本系统预计要达到以下几个目标:①满足以上的基本功能要求;②能够在常见的计算机及其操作系统上运行。 2.设计的基本思路 利用GUI的界面设计,将整个大设计分为三块,分别是数据的输入,运算符

功能符的控制和数据的输入输出显示。利用Swing控件,数据的输入由0~9这10个按钮来表示,用“+”、“-”、“*”、“/”、“1/x”、“%”、“sqrt”这7个按钮来表示加、减、乘、除、求倒、取余、开方运算,用“.”和“±”这2个按钮来表示小数点和正负号,用“Back”、“CE”和“C”这3个按钮来表示退格、复位和清零的功能,数据的输入输出显示由文本字段来表示。将计算器的总体界面设计好后,再将代码分别写入不同的按钮的源程序中。 我要完成的一项改进,即添加一个拥有千位符分隔符功能的按钮,按下这个按钮能够在输入的一串数字中每三位加入一个逗号并且显示出来。我要在之前的界面设计的基础上多添加一个按钮“$”来表示千位符分隔符,并且将功能代码写入这个按钮的源程序中。 三、程序流程图,程序清单与调用关系 1. 程序流程图:

lcd1602液晶封装函数

//端口定义 #define DBPort P0 //LCD数据端口 sbit LcdRs = P2^0; sbit LcdRw = P2^1; sbit LcdEn = P2^2; sbit Lcdbf = P0^7; //LCD忙标志Busy Flag void delay(unsigned int t) //延时 { while(t--); } void LCD_Wait(void) //读忙状态 { LcdRs=0; LcdRw=1; LcdEn=1;delay(10);LcdEn=0; //下降沿 while(Lcdbf) { LcdEn=0;LcdEn=1; //仿真才需要此语句,实际硬件中不需要} } void LCD_Write(bit style, unsigned char input) //写数据1/命令0 { LcdRs=style; LcdRw=0; DBPort=input; LcdEn=1;delay(10);LcdEn=0; LCD_Wait(); } void LCD_Initial(void) //初始化LCD { LCD_Write(0,0x38); //8位数据端口,2行显示,5*7点阵 delay(300); LCD_Write(0,0x0c); //显示模式 LCD_Write(0,0x01); //清屏 LCD_Write(0,0x06); //输入模式 } void GotoXY(unsigned char x, unsigned char y) //移动光标到指定位置{ if(y==0) LCD_Write(0,0x80|x);

单片机简易计算器设计(汇编语言)

KEYBUF EQU 40H ;键号存放单元 ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV KEYBUF,#0 ;初始键号设位0,也可以为任意值 MOV R0,#30H ;显示首地址 MOV R2,#0CH ;计算数据存放单元个数 CLR A QING: MOV @R0,A;将数据存放单元清零 INC R0 DJNZ R2,QING MOV P0,#8FH ;关闭显示 MOV R1,#30H ;将显示首地址存放R1里 ;=============================================== ;五位无符号显示子程序 DIS1: MOV R0,#30H ;把显示数据第一位放在R0里 MOV R2,#04H ;把显示的位码放在R2里 MOV R3,#05H ;把显示的长度放在R3里 DIS2: MOV A,@R0 ANL A,#0FH ;屏蔽显示数据的高四位 MOV B,A MOV A,R2 ANL A,#0FH ;屏蔽位码的高四位 SW AP A ORL A,B MOV P0,A;送总显示数据到P0显示 LCALL DELY4ms ;调用延时4ms INC R0 ;取下一个显示数据 DEC R2 DJNZ R3,DIS2 ;四位显示晚后重新开始显示 ;=================================================== ;键盘扫描子程序 WAIT: MOV P1,#0FFH ;P1口送高电平 CLR P1.0 ;第一行清零 MOV A,P1 ;读P1口 ANL A,#0F0H ;低位屏蔽 XRL A,#0F0H ;判断低位是否有低电平,即判断是否有按键按下 JZ NOKEY1 ;地位有低电平继续扫描,否者跳到第而行去扫描 LCALL DELY10ms ;延时10ms去抖在进行判断是否有按键按下 MOV A,P1 ;继续读P1口 ANL A,#0F0H ;判断低位是否有低电平 CJNE A,#0E0H,NK1 ;如果扫描数据不为0E0H就转到NK1 MOV KEYBUF,#0 ;否者判断为0号键 AJMP DK ;转DK1查表程序

相关文档
最新文档