找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2309|回复: 2
收起左侧

求用AVR与1601LCD设计的计算器的源程序

[复制链接]
ID:257293 发表于 2017-12-7 21:03 | 显示全部楼层 |阅读模式
18黑币
AVR1601LCD设计的计算器
  这是以ATMEGA16单片机为核心实现一个简易的计算器,它的结构非常简单,主要由KEYPAD-SMALLCALC4*4矩阵键盘,一个液晶显示屏构成,蜂鸣器一块ATMEGA16单片机和MM74C922芯片构成,通过软件编程可实现简单的整数加减乘除,最多可以显示七位数字的加减乘除。
  但是我没有源程序,然后马上要交期中作业了,求大佬帮忙发一下源程序。

回复

使用道具 举报

ID:257293 发表于 2017-12-11 20:36 | 显示全部楼层
程序如下:
//-----------------------------------------------------------------
//  名称: 用AVR与1601LCD设计的计算器
//-----------------------------------------------------------------
//  说明: 本例运行时,可完成整数的加、减、乘、除四种运算,该计算器
//        不支持带优先级的表达式运算,但允许连续进行整数运算.
//        如果运算结果超出有效范围则显示*ERR*
//
//-----------------------------------------------------------------
#include <avr/io.h>            //定义
#include <avr/pgmspace.h>
#include <util/delay.h>         
#include <stdio.h>      
#include <string.h>
#include <stdlib.h>   
#include <ctype.h>
#include "LCD1601.h"
#define INT8U unsigned char   
//蜂鸣器及键盘相关定义
# define BEEP()       PORTB^=_BV(PB2)         //蜂鸣器定义
# define Key_Pressed  (PINA &_BV(PA0))         //按键判断
# define Key_NO     ((PINA&0xF0))>>4)         //按键键值
//计算器相关变量,状态及字符表定义
char  Last_OP=0;                            //最近的操作符
long  a=0,b=0;                              //操作数a,b
char  LCD_DISP-BUFFER[17];                  //LCD显示缓冲
char NumberStr[17];                         //输入数字串缓冲
TNT8UNumber_Idx=0;                        //数字串缓冲索引
const char KEY_CHAR_TABLE[]=”741C8520963=/*-+=”;//键盘字符表
//-----------------------------------------
// 根据操作符完成运算或清屏等操作
//---------------------------------------------
void Operator_Process(char OP)
{
//根据OP分别完成“+”,“-”,“*”,“/”,’c’操作
Switch(OP)
     {
       case’+’:a+=b;      break;
       case’-’:a-=b;      break;
       case’*’:a*=b;      break;
       case’/’:if(b)      //除数非0时才进行运算
             {
                   A/=b;break;
             }
             else     //否则提示出错,复位变量并返回
             {
                   ShowString(“*ERR*”);
                  a=b=0;
                  Last_OP=0;
                  return;
             }
     case’C’:a=b=0;
     Last_OP=0;   break;
   }
   //显示结果
   Sprintf(LCD_DISP_BUFFER,”%1d”,a);
   showString(LCD_DISP_BUfFER);
}  

//-----------------------------------------------------------------
// 蜂鸣器输出提示音
//-----------------------------------------------------------------
void Sounder()
{
      INT8U i;
      for(i=0;i<20;i++)
      {
           BEEP();_delay_us(350);
      }
}

//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
int main()
{
char KeyChar;
DDRA=0x00;PORTA=0xFF;         //配置端口
DDRB=0xFF;
DDRC=0xFF;
DDRD=0xFF;
//初始化LED并在最右端显示“0”
Initialize_LCD();showString(“0”);
for(;;)
{
     //如果无按键则继续————————————
     if(!Key_Pressed){_delay_ms(10);continue;}
     //输出按键音
     Sounder();
     //根据键值获取按键字符
     Keychar=KEY_CHAR_TABLE[kEY_NO];
     //——————————————
     if(isdigit(Keychar))   //如果输入的是数字字符则存入Numberstr
     {
         if(Number_Idx!=MAX_DISPLAY_CHAR-2)
          {
             Numberstr[Number_Idx]=KeyChar;
             Numberstr[++Number_Idx]=’\0’;
             ShowString(NumberStr);
          }
     }
     //————————————————
     else //如果输入的是“+,-,*,/,C,=”中的某一个则进行运算或清零等处理
     {
           //将NumberStr字符串转换为长整数a或b
           if (Number_Idx!=0)
           {
                 if (Last_OP==0)
                     a=strtol(NumberStr,’\0’,10)
                 else
                     b==strtol(NumberStr,’\0’,10)
           }
           //如果为“C”则清0且将相关变量复位
           if(KeyChar==’C’)      Operator_Process(‘c’);
           //如果为“=,+,-,*,/”且此前有数字字符输入则进行运算
           else
           if (Last_OP && Number_Idx) Operator_Process(Last_OP);
           //NumberStr数字缓冲索引归0,并清除数字串输入缓冲
           Number_Idx=0;NumberStr[0]=‘、0’;
           //Last_OP保存最近按下的操作符
           if(KeyChar !=’c’ && KeyChar !=’=’)
                 Last_OP=KeyChar;
           else
               Last_OP=0;
           }
          //等待释放按键
          While(Key_Pressed);
}
}
回复

使用道具 举报

ID:257293 发表于 2017-12-11 20:50 | 显示全部楼层
程序如下:
//-----------------------------------------------------------------
//  名称: 用AVR与1601LCD设计的计算器
//-----------------------------------------------------------------
//  说明: 本例运行时,可完成整数的加、减、乘、除四种运算,该计算器
//        不支持带优先级的表达式运算,但允许连续进行整数运算.
//        如果运算结果超出有效范围则显示*ERR*
//
//-----------------------------------------------------------------
#include <avr/io.h>            //定义
#include <avr/pgmspace.h>
#include <util/delay.h>         
#include <stdio.h>      
#include <string.h>
#include <stdlib.h>   
#include <ctype.h>
#include "LCD1601.h"
#define INT8U unsigned char   
//蜂鸣器及键盘相关定义
# define BEEP()       PORTB^=_BV(PB2)         //蜂鸣器定义
# define Key_Pressed  (PINA &_BV(PA0))         //按键判断
# define Key_NO     ((PINA&0xF0))>>4)         //按键键值
//计算器相关变量,状态及字符表定义
char  Last_OP=0;                            //最近的操作符
long  a=0,b=0;                              //操作数a,b
char  LCD_DISP-BUFFER[17];                  //LCD显示缓冲
char NumberStr[17];                         //输入数字串缓冲
TNT8UNumber_Idx=0;                        //数字串缓冲索引
const char KEY_CHAR_TABLE[]=”741C8520963=/*-+=”;//键盘字符表
//-----------------------------------------
// 根据操作符完成运算或清屏等操作
//---------------------------------------------
void Operator_Process(char OP)
{
//根据OP分别完成“+”,“-”,“*”,“/”,’c’操作
Switch(OP)
     {
       case’+’:a+=b;      break;
       case’-’:a-=b;      break;
       case’*’:a*=b;      break;
       case’/’:if(b)      //除数非0时才进行运算
             {
                   A/=b;break;
             }
             else     //否则提示出错,复位变量并返回
             {
                   ShowString(“*ERR*”);
                  a=b=0;
                  Last_OP=0;
                  return;
             }
     case’C’:a=b=0;
     Last_OP=0;   break;
   }
   //显示结果
   Sprintf(LCD_DISP_BUFFER,”%1d”,a);
   showString(LCD_DISP_BUfFER);
}  

//-----------------------------------------------------------------
// 蜂鸣器输出提示音
//-----------------------------------------------------------------
void Sounder()
{
      INT8U i;
      for(i=0;i<20;i++)
      {
           BEEP();_delay_us(350);
      }
}

//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
int main()
{
char KeyChar;
DDRA=0x00;PORTA=0xFF;         //配置端口
DDRB=0xFF;
DDRC=0xFF;
DDRD=0xFF;
//初始化LED并在最右端显示“0”
Initialize_LCD();showString(“0”);
for(;;)
{
     //如果无按键则继续————————————
     if(!Key_Pressed){_delay_ms(10);continue;}
     //输出按键音
     Sounder();
     //根据键值获取按键字符
     Keychar=KEY_CHAR_TABLE[kEY_NO];
     //——————————————
     if(isdigit(Keychar))   //如果输入的是数字字符则存入Numberstr
     {
         if(Number_Idx!=MAX_DISPLAY_CHAR-2)
          {
             Numberstr[Number_Idx]=KeyChar;
             Numberstr[++Number_Idx]=’\0’;
             ShowString(NumberStr);
          }
     }
     //————————————————
     else //如果输入的是“+,-,*,/,C,=”中的某一个则进行运算或清零等处理
     {
           //将NumberStr字符串转换为长整数a或b
           if (Number_Idx!=0)
           {
                 if (Last_OP==0)
                     a=strtol(NumberStr,’\0’,10)
                 else
                     b==strtol(NumberStr,’\0’,10)
           }
           //如果为“C”则清0且将相关变量复位
           if(KeyChar==’C’)      Operator_Process(‘c’);
           //如果为“=,+,-,*,/”且此前有数字字符输入则进行运算
           else
           if (Last_OP && Number_Idx) Operator_Process(Last_OP);
           //NumberStr数字缓冲索引归0,并清除数字串输入缓冲
           Number_Idx=0;NumberStr[0]=‘、0’;
           //Last_OP保存最近按下的操作符
           if(KeyChar !=’c’ && KeyChar !=’=’)
                 Last_OP=KeyChar;
           else
               Last_OP=0;
           }
          //等待释放按键
          While(Key_Pressed);
}
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表