AVR单片机简单计算器的Proteus仿真实现+源码

发布者:Meilin8888最新更新时间:2019-10-17 来源: 51hei关键字:AVR单片机  计算器  Proteus仿真 手机看文章 扫描二维码
随时随地手机看文章

0.png

单片机源程序如下:

#include "mega16.h"

#include "1602.h"

#include "key.h"



float k1,k2;              //记录最终输入运算的两个数


uint one,two,three,four;   //记录每次输入的数字


uint flag;                //计数标志位


uint flag1,flag2;   //第一个数   第二个数 完成标志位


uint flag3;//记录加减乘除标志位


long Result;     //最后运算的结果



void main()

{

     init();  //液晶初始化

    // write_com(0x80+15);

    // write_date('0');

     Init_Keypad();   //键盘初始化

     flag1 = 1;

     while(1)

    {

        Key_Event();  //扫描键盘

    

        if(key_Flag == 1)

        {

            key_Flag = 0;

            if(key_val <= 10)   //小于10  则为需要的数字

            {

            

              if(flag1)       //flag1为1  表示正在输入第一个数字

              {

                switch(flag)

                {

                    case 0:

                     flag = 1;

                     one = key_val%10;

                     write_com(0x80+6);

                     write_date(tab[key_val]);

                     k1 = (float)one;

                     break;

                    case 1:

                       flag = 2;

                       two = key_val%10;

                       write_com(0x80+7);

                       write_date(tab[key_val]);

                       k1 = (float)(one*10 + two);

                     break;

                 case 2:

                      flag = 3;

                         three = key_val%10;

                       write_com(0x80+8);

                       write_date(tab[key_val]);

                      k1 = (float)(one*100 + two * 10 + three);

                      break;

                 case 3:

                     flag = 4;

                        four = key_val%10;

                     write_com(0x80+9);

                     write_date(tab[key_val]);

                        k1 = (float)(one*1000 + two * 100 + three*10 + four);

                     break;

                   case 4:

                      flag = 0;

                      break;   

                 }

                }

                

                

                

                

                

                if(flag2)        //flag2为1  表示正在输入第2个数字

              {

                switch(flag)

                {

                    case 0:

                     flag = 1;

                     one = key_val%10;

                     write_com(0x80+12);

                     write_date(tab[key_val]);

                     k2 = (float)one;

                     break;

                    case 1:

                       flag = 2;

                       two = key_val%10;

                       write_com(0x80+13);

                       write_date(tab[key_val]);

                       k2 = (float)(one*10 + two);

                     break;

                 case 2:

                      flag = 3;

                         three = key_val%10;

                       write_com(0x80+14);

                       write_date(tab[key_val]);

                      k2 = (float)(one*100 + two * 10 + three);

                      break;

                 case 3:

                     flag = 4;

                        four = key_val%10;

                     write_com(0x80+15);

                     write_date(tab[key_val]);

                        k2 = (float)(one*1000 + two * 100 + three*10 + four);

                     break;

                   case 4:

                      flag = 0;

                      break;   

                 }

                }

                

                

            }

            

            

            

            else if(key_val>=13 || key_val <= 16)  //判断运算符

            {

                flag1 = 0;

                flag2 = 1;

                flag = 0;

                switch(key_val)

                {

                    case 13:

                      write_com(0x80+11);

                      write_date('+');

                      flag3 = 1;

                      break; 

                    case 14:

                      write_com(0x80+11);

                      write_date('-');

                      flag3 = 2;

                      break; 

                    case 15:

                      write_com(0x80+11);

                      write_date('*');

                      flag3 = 3;

[1] [2]
关键字:AVR单片机  计算器  Proteus仿真 引用地址:AVR单片机简单计算器的Proteus仿真实现+源码

上一篇:ATMEGA16单片机Timer1的OC1A脚输出占空比可调的PWM信号
下一篇:ATmega16计算器代码(数码管显示)

推荐阅读最新更新时间:2024-11-02 20:15

解决AVR单片机烧写过程中弄错熔丝位而造成无法读写问题
在AVR单片机烧写的过程中,难免有弄错熔丝位的时候,结果是AVR单片机无法读写了!这时我们该怎么办呢,将昂贵的芯片丢掉,再用一块新的。其实这一般是没有必要的,写错熔丝位而导致单片机不能读写,一般不外乎(个人愚见)设设置错了时钟模式,比如说本来是用内部晶振的,结果弄成了外部晶振,而单片机的外部有没有接晶振,这时单片机没有了时钟信号,当然就没有办法在读写了,估计大家也猜到了怎么办了吧,是的,就是由外部提供时钟源。 有第一张图的时钟选择,我们就知道我们得准备多种时钟源: 高频石英/陶瓷晶振,这个直接接在 单片机 晶振位置就可以了,注意频率不要太高,4~5M的就可以了,不放心的话,接两个20P~30P的电容也行! 低频晶振,和
[单片机]
解决<font color='red'>AVR单片机</font>烧写过程中弄错熔丝位而造成无法读写问题
AVR单片机的掉电保护
简介:在掉电时怎样保护数据到EEPROM中 我想在掉电时保存数据(3个字节)到EEPROM中,用BOD掉电检测,不知怎样使用。望高手指点: 1、在BOOT区设置好BODEN,BODLEVEL,后软件还要怎样设置? 2、掉电中断是否是产生复位?我的写EEPROM程序应该放在什么地方?他和其他复位怎样区别? 3、设置了BOOT区后,硬件上是否要加电源到一个管脚比较后才产生中断?? 掉电检测BOD的误解 AVR自带的BOD(Brown-outDetection)电路,作用是在电压过低(低于设定值)时产生复位信号,防止CPU意外动作. 对EEPROM的保护作用是当电压过低时保持RESET信号为低,防止CPU意外动作,错误修改
[单片机]
AVR单片机的RTOS-AVRX应用
引 言   随着技术的发展,嵌入式系统的设计及应用对人们的生活产生了很大的影响,并将逐渐改变人们未来的生活方式。在特定的操作系统上开发应用程序,可以使开发人员忽略掉很多底层硬件细节,使得应用程序调试更方便、易于维护、开发周期缩短并且降低开发成本,因而嵌入式操作系统深得开发人员的青睐。   AVR微处理器是Atmel公司开发的8位嵌入式RISC处理器,它具有高性能、高保密性、低功耗、非易失性等优点,而且程序存储器和数据存储器可独立编址,并具有独立访问的哈佛结构。AVR单片机内核有丰富的指令集,通过32个通用寄存器直接与逻辑运算单元相连接,允许在一个周期内一条单一指令访问两个独立的寄存器,这样的结构使代码的执行效率比传统的复杂指令集
[单片机]
DS3906电阻计算器
该应用笔记提到的电子数据表是用Microsoft Excel制作。用户可下载这个文件,其中包含两个工作表。 第一个工作表是"WithoutExtR,",其中包含了内部可变电阻对应于每个编程台阶的标称值。这仅是DS3906数据资料中数据的简单拷贝。该工作表还给出了考虑最大偏差(由于工艺变化)后的电阻阻值。不带任何外部电阻的标称电阻变化曲线如图1所示。因为电阻R0和R1相对于编程值具有相同的变化规律,所以用一张图来表示这两个电阻(R0,1)。 图1. 没有外接电阻时标称电阻的变化曲线 第二个工作表是"WithExtR,",其中包含了可变电阻的值。该工作表还给出了使用外部电阻与DS3906内部电阻并联后对应每个编程台阶所计算出来的等效电
[模拟电子]
DS3906电阻<font color='red'>计算器</font>
AVR单片机中如何自己写头文件
在avr单片机中,用iic编程自己怎么写头文件?有这方面的资料可以给提供吗? 1、ASM可以直接用官方studio中的头文件。 2、C的话,应该在ICC的安装目录下已经给了头文件的吧! 首先在存放C文件的目录下 建立一个h文件(就是TXT重命名为.h即可)然后向h头文件里编写你要添加的代码,最后只需在你需要用的C文件里 #include你的头文件名即可”
[单片机]
LCD12864子程序
/********************************************************************* 目 的: 建立LCD12864操作库 目标系统: 基于AVR单片机 应用软件: ICCAVR 版 本: Version 1.0 *********************************************************************/ /*0101010101010101
[单片机]
AVR单片机ATMEGA16编译软件ICCAVR的使用技巧与应用示例
一、先来一段朴实的独白吧 写这篇文的时间是2018年3月21日。大学2013毕业,专业是机械,但喜欢电子。篇首声明:哪一行都有鄙视链,就连打个游戏都不例外。如果大神路过这里,请您show your mercy然后walk away就当nothing happened. 当然,大牛都是很低调的,因为他们身心都沉进编程的世界里不能自拨。好了本文就ICCAVR的使用说明作一个入门式的引导,方便新、老网友作一种可供使用的参考。 上大学并不是为了纯读书,而是自我发现、反馈、然后决定的心理成熟过程,好吧这就是我的层次。上学时为了搞懂一个东西,在网上查找所有的有用的信息资料,当然必须免费的,唉不谈。。现在如果需要一些资源直接买买买,省时省力
[单片机]
<font color='red'>AVR单片机</font>ATMEGA16编译软件ICCAVR的使用技巧与应用示例
AVR单片机矩阵键盘程序(2种方法)
AVR矩阵键盘2种方法实现! 普通方法: #include iom16v.h // #include macros.h // #define uchar unsigned char// #define uint unsigned int// #define setb(val,bitn) (val|=(1 (bitn)))//设置某IO口某位为1 #define clr(val,bitn) (val&=~(1 (bitn)))//设置某IO口某位为0 #define get(val,bitn) (val&(1 (bitn)))//读取某位状态如if(get(PORTC,7))即判断PC7口是否为1 #pragma data:code
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved