久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3175|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

求用AVR與1601LCD設(shè)計的計算器的源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:257293 發(fā)表于 2017-12-7 21:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
18黑幣
AVR1601LCD設(shè)計的計算器
  這是以ATMEGA16單片機為核心實現(xiàn)一個簡易的計算器,它的結(jié)構(gòu)非常簡單,主要由KEYPAD-SMALLCALC4*4矩陣鍵盤,一個液晶顯示屏構(gòu)成,蜂鳴器,一塊ATMEGA16單片機和MM74C922芯片構(gòu)成,通過軟件編程可實現(xiàn)簡單的整數(shù)加減乘除,最多可以顯示七位數(shù)字的加減乘除。
  但是我沒有源程序,然后馬上要交期中作業(yè)了,求大佬幫忙發(fā)一下源程序。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:257293 發(fā)表于 2017-12-11 20:36 | 只看該作者
程序如下:
//-----------------------------------------------------------------
//  名稱: 用AVR與1601LCD設(shè)計的計算器
//-----------------------------------------------------------------
//  說明: 本例運行時,可完成整數(shù)的加、減、乘、除四種運算,該計算器
//        不支持帶優(yōu)先級的表達式運算,但允許連續(xù)進行整數(shù)運算.
//        如果運算結(jié)果超出有效范圍則顯示*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   
//蜂鳴器及鍵盤相關(guān)定義
# define BEEP()       PORTB^=_BV(PB2)         //蜂鳴器定義
# define Key_Pressed  (PINA &_BV(PA0))         //按鍵判斷
# define Key_NO     ((PINA&0xF0))>>4)         //按鍵鍵值
//計算器相關(guān)變量,狀態(tài)及字符表定義
char  Last_OP=0;                            //最近的操作符
long  a=0,b=0;                              //操作數(shù)a,b
char  LCD_DISP-BUFFER[17];                  //LCD顯示緩沖
char NumberStr[17];                         //輸入數(shù)字串緩沖
TNT8UNumber_Idx=0;                        //數(shù)字串緩沖索引
const char KEY_CHAR_TABLE[]=”741C8520963=/*-+=”;//鍵盤字符表
//-----------------------------------------
// 根據(jù)操作符完成運算或清屏等操作
//---------------------------------------------
void Operator_Process(char OP)
{
//根據(jù)OP分別完成“+”,“-”,“*”,“/”,’c’操作
Switch(OP)
     {
       case’+’:a+=b;      break;
       case’-’:a-=b;      break;
       case’*’:a*=b;      break;
       case’/’:if(b)      //除數(shù)非0時才進行運算
             {
                   A/=b;break;
             }
             else     //否則提示出錯,復(fù)位變量并返回
             {
                   ShowString(“*ERR*”);
                  a=b=0;
                  Last_OP=0;
                  return;
             }
     case’C’:a=b=0;
     Last_OP=0;   break;
   }
   //顯示結(jié)果
   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(;;)
{
     //如果無按鍵則繼續(xù)————————————
     if(!Key_Pressed){_delay_ms(10);continue;}
     //輸出按鍵音
     Sounder();
     //根據(jù)鍵值獲取按鍵字符
     Keychar=KEY_CHAR_TABLE[kEY_NO];
     //——————————————
     if(isdigit(Keychar))   //如果輸入的是數(shù)字字符則存入Numberstr
     {
         if(Number_Idx!=MAX_DISPLAY_CHAR-2)
          {
             Numberstr[Number_Idx]=KeyChar;
             Numberstr[++Number_Idx]=’\0’;
             ShowString(NumberStr);
          }
     }
     //————————————————
     else //如果輸入的是“+,-,*,/,C,=”中的某一個則進行運算或清零等處理
     {
           //將NumberStr字符串轉(zhuǎn)換為長整數(shù)a或b
           if (Number_Idx!=0)
           {
                 if (Last_OP==0)
                     a=strtol(NumberStr,’\0’,10)
                 else
                     b==strtol(NumberStr,’\0’,10)
           }
           //如果為“C”則清0且將相關(guān)變量復(fù)位
           if(KeyChar==’C’)      Operator_Process(‘c’);
           //如果為“=,+,-,*,/”且此前有數(shù)字字符輸入則進行運算
           else
           if (Last_OP && Number_Idx) Operator_Process(Last_OP);
           //NumberStr數(shù)字緩沖索引歸0,并清除數(shù)字串輸入緩沖
           Number_Idx=0;NumberStr[0]=‘、0’;
           //Last_OP保存最近按下的操作符
           if(KeyChar !=’c’ && KeyChar !=’=’)
                 Last_OP=KeyChar;
           else
               Last_OP=0;
           }
          //等待釋放按鍵
          While(Key_Pressed);
}
}
回復(fù)

使用道具 舉報

板凳
ID:257293 發(fā)表于 2017-12-11 20:50 | 只看該作者
程序如下:
//-----------------------------------------------------------------
//  名稱: 用AVR與1601LCD設(shè)計的計算器
//-----------------------------------------------------------------
//  說明: 本例運行時,可完成整數(shù)的加、減、乘、除四種運算,該計算器
//        不支持帶優(yōu)先級的表達式運算,但允許連續(xù)進行整數(shù)運算.
//        如果運算結(jié)果超出有效范圍則顯示*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   
//蜂鳴器及鍵盤相關(guān)定義
# define BEEP()       PORTB^=_BV(PB2)         //蜂鳴器定義
# define Key_Pressed  (PINA &_BV(PA0))         //按鍵判斷
# define Key_NO     ((PINA&0xF0))>>4)         //按鍵鍵值
//計算器相關(guān)變量,狀態(tài)及字符表定義
char  Last_OP=0;                            //最近的操作符
long  a=0,b=0;                              //操作數(shù)a,b
char  LCD_DISP-BUFFER[17];                  //LCD顯示緩沖
char NumberStr[17];                         //輸入數(shù)字串緩沖
TNT8UNumber_Idx=0;                        //數(shù)字串緩沖索引
const char KEY_CHAR_TABLE[]=”741C8520963=/*-+=”;//鍵盤字符表
//-----------------------------------------
// 根據(jù)操作符完成運算或清屏等操作
//---------------------------------------------
void Operator_Process(char OP)
{
//根據(jù)OP分別完成“+”,“-”,“*”,“/”,’c’操作
Switch(OP)
     {
       case’+’:a+=b;      break;
       case’-’:a-=b;      break;
       case’*’:a*=b;      break;
       case’/’:if(b)      //除數(shù)非0時才進行運算
             {
                   A/=b;break;
             }
             else     //否則提示出錯,復(fù)位變量并返回
             {
                   ShowString(“*ERR*”);
                  a=b=0;
                  Last_OP=0;
                  return;
             }
     case’C’:a=b=0;
     Last_OP=0;   break;
   }
   //顯示結(jié)果
   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(;;)
{
     //如果無按鍵則繼續(xù)————————————
     if(!Key_Pressed){_delay_ms(10);continue;}
     //輸出按鍵音
     Sounder();
     //根據(jù)鍵值獲取按鍵字符
     Keychar=KEY_CHAR_TABLE[kEY_NO];
     //——————————————
     if(isdigit(Keychar))   //如果輸入的是數(shù)字字符則存入Numberstr
     {
         if(Number_Idx!=MAX_DISPLAY_CHAR-2)
          {
             Numberstr[Number_Idx]=KeyChar;
             Numberstr[++Number_Idx]=’\0’;
             ShowString(NumberStr);
          }
     }
     //————————————————
     else //如果輸入的是“+,-,*,/,C,=”中的某一個則進行運算或清零等處理
     {
           //將NumberStr字符串轉(zhuǎn)換為長整數(shù)a或b
           if (Number_Idx!=0)
           {
                 if (Last_OP==0)
                     a=strtol(NumberStr,’\0’,10)
                 else
                     b==strtol(NumberStr,’\0’,10)
           }
           //如果為“C”則清0且將相關(guān)變量復(fù)位
           if(KeyChar==’C’)      Operator_Process(‘c’);
           //如果為“=,+,-,*,/”且此前有數(shù)字字符輸入則進行運算
           else
           if (Last_OP && Number_Idx) Operator_Process(Last_OP);
           //NumberStr數(shù)字緩沖索引歸0,并清除數(shù)字串輸入緩沖
           Number_Idx=0;NumberStr[0]=‘、0’;
           //Last_OP保存最近按下的操作符
           if(KeyChar !=’c’ && KeyChar !=’=’)
                 Last_OP=KeyChar;
           else
               Last_OP=0;
           }
          //等待釋放按鍵
          While(Key_Pressed);
}
}
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产99视频精品免费播放照片 | 国产一区不卡 | 国产成人99久久亚洲综合精品 | 成人毛片网 | 欧美炮房 | 黑人一级片视频 | 中文字幕日韩欧美一区二区三区 | 中文字幕韩在线第一页 | 国产欧美日韩一区 | 国产成人免费观看 | 波多野结衣一二三区 | 精品久久久久久久久久久久久 | 欧美一区二不卡视频 | 天天激情综合 | 国产精品亚洲第一 | 亚洲天堂中文字幕 | 精品亚洲一区二区 | 一级黄色绿像片 | 欧美综合国产精品久久丁香 | 精品国产欧美一区二区三区成人 | 亚洲精品国产成人 | 日韩av一区二区在线观看 | 天天色天天色 | 国产乱性 | 成人h视频在线 | 国产精品久久久久久238 | 国产一区二区三区 | 91文字幕巨乱亚洲香蕉 | 男人电影天堂 | 日本韩国电影免费观看 | 久久久一区二区 | 婷婷在线视频 | 国产精品成人在线播放 | 国产在线观看一区二区三区 | 国产精品久久久久久久7777 | av免费网址 | 日韩精品免费在线观看 | 成人影视网址 | 国产精品久久久久久二区 | 国产成人高清 | 久久久精品综合 |