基于AVR单片机的计算器程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

#include //延时函数的头文件

#include // 中断函数的头文件

#define uint unsigned int

#define uchar unsigned char

#define BIT(k) (1<

#define DI PORTC //夜晶的数据输入端

#define No_key 255 //没有按键按下的返回值

#define key_port PORTD //键盘输入

#define key_ddr DDRD

#define key_pin PIND //宏定义方便以后程序移植

#define lone_key_port PORTB //独立键盘接口用于输入小数点

#define lone_key_ddr DDRB

#define lone_key_pin (PINB&BIT(0)) //读取独立键盘接口的电平

#define rs_0 PORTA&=~BIT(0) //RS复位

#define rs_1 PORTA|=BIT(0) //RS置位

#define en_0 PORTA&=~BIT(1) //使能端复位

#define en_1 PORTA|=BIT(1) //使能端置位

const uchar table1[]=" You are welcome!"; // 初始显示字符

const uchar table2[]="ERROR!"; //出错提示字符

uchar a[7]={0,0,0,0,0,0,0},b[11]={0,0,0,0,0,0,0},a1[5]={0,0,0,0,0},b1[5]={0,0,0,0,0}; //用来存储输入的两个数字,位数不可超过10位

uchar aa,bb,cc,dd; //用来记数输入的位数

uchar sym; //用来保存符号

uchar flag;//起动标志

uchar fuhao; //符号标志

uchar deflag1 ; //小数点标志

uchar deflag2 ; //小数点标志

uchar overflag; //数值溢出标志

uchar allowflag=1; //符号允许标志,用于禁止连续两个符号的输出

uchar negative; //负数标志,当是负数要作相应的处理

long temp3,temp4; //计算的数值得数用其中一个变量存储即可,不用再浪费存开辟其他变量

float temp1, temp2;

const unsigned char key_table[16] =

{

7, 8, 9, 10,

4, 5, 6, 11,

1, 2, 3, 12,

50,0, 21,13

}; // 键盘编码可根据具体情况而设定

void port_init(); //端口初始化

void device_init(); //夜晶初始化

void time_init(); //定时器初始化

void wright_(uchar ); //夜晶写指令函数

void wright_data(uchar date) ; //夜晶写数据函数

void lcd_handle(uchar temp); //夜晶显示处理,该显示什么,不该显示什么

uchar keyscan(); //键盘扫描

void judgechar(uchar t); //判断字符为符号还是数字

void decimal(uchar de) ; //判断是不是小数点,只能出现两个小数点,且不能连续出现

void reset() ; //复位函数

void calculate(void); //对数值进行计算

void result(long value); //显示结果

void flow_clew() ; //溢出提示函数

int main()

{

port_init();

device_init();

time_init(); //初始化

while(1)

{

flow_clew() ; //溢出提示函数,一旦扫描到出错就会显示错误

}

}

/***********中断服务程序***********/

volatile unsigned int i; //中断服务程序中要使用全局变量,且要加volatile SIGNAL(SIG_OVERFLOW0)

{

TCNT0=205; //重装初值

i=keyscan(); //返回键盘扫描值

if(i!=No_key) //确认有按键按下

{

if(i==50)

{

wright_(0x01) ; //清显示

_delay_ms(10); //延时等待清屏指令完成

wright_(0x80);

wright_data('0'); //重新显示0

reset(); //初始化

flag=1; // 标志起动

}

if(i<50&&flag) //条件为已经启动而且输入的是有效字符

{

judgechar(i); //判断是不是操作符,要是则要作相应的处理

decimal(i); //判断是不是小数点输入,要是则要作相应的处理

lcd_handle(i) ; //对输入的数据进行合理存储并加以显示

}

if(i==21) //按下了等号键

{

wright_data('='); //显示等号

calculate(); //计算数值

result(temp1); //拆分数值后显示结果

}

}

}

/*******定时器初始化*********/

void time_init()

{

TCNT0=205; //初值255-205=50 50微秒

TIMSK|=(1<

sei(); //开启总中断

TCCR0|= (1<

}

/****端口初始化****/

void port_init()

{

DI=0xff;

DDRA|=BIT(0);

DDRA|=BIT(1);//输出状态

lone_key_ddr&=~BIT(0);

lone_key_port|=BIT(0); //独立键盘接口设置为输入,并打开上拉电阻

DDRD=0; //全部设为输入,有个上拉电阻,可以输入高电平

DDRB=0xff;

相关文档
最新文档