標題: 求用AVR與1601LCD設計的計算器的源程序 [打印本頁]
作者: 湛藍1996 時間: 2017-12-7 21:03
標題: 求用AVR與1601LCD設計的計算器的源程序
用AVR與1601LCD設計的計算器 這是以ATMEGA16單片機為核心實現一個簡易的計算器,它的結構非常簡單,主要由KEYPAD-SMALLCALC型4*4矩陣鍵盤,一個液晶顯示屏構成,蜂鳴器,一塊ATMEGA16單片機和MM74C922芯片構成,通過軟件編程可實現簡單的整數加減乘除,最多可以顯示七位數字的加減乘除。
但是我沒有源程序,然后馬上要交期中作業了,求大佬幫忙發一下源程序。
作者: 湛藍1996 時間: 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);
}
}
作者: 湛藍1996 時間: 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);
}
}
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |