基于AVR单片机的计算器程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;