基于AVR单片机的计算器程序.doc_第1页
基于AVR单片机的计算器程序.doc_第2页
基于AVR单片机的计算器程序.doc_第3页
基于AVR单片机的计算器程序.doc_第4页
基于AVR单片机的计算器程序.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include#include/延时函数的头文件#include / 中断函数的头文件#define uint unsigned int#define uchar unsigned char#define BIT(k) (1k) /利用上ICC软件的优点#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 a7=0,0,0,0,0,0,0,b11=0,0,0,0,0,0,0,a15=0,0,0,0,0,b15=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_table16 = 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_com(uchar com); /夜晶写指令函数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;/中断服务程序中要使用全局变量,且要加volatileSIGNAL(SIG_OVERFLOW0) TCNT0=205; /重装初值 i=keyscan(); /返回键盘扫描值if(i!=No_key) /确认有按键按下 if(i=50) wright_com(0x01) ;/清显示_delay_ms(10); /延时等待清屏指令完成 wright_com(0x80); wright_data(0); /重新显示0reset(); /初始化 flag=1; / 标志起动 if(i50&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|=(1TOIE0);sei(); /开启总中断TCCR0|= (1CS01);/8分频 8M/8=1M /*端口初始化*/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; /*夜晶初始化*/void device_init() en_0; /使能端拉低wright_com(0x38) ; /初始化格式wright_com(0x0c) ;/0x0e打开光标 0x0c不显示光标0x0e光标不闪,0x0f光标闪wright_com(0x01) ;/清显示 wright_com(0x80); for(i=0;i17;i+) wright_data(table1i); _delay_ms(20);/*夜晶写入指令的函数*/void wright_com(uchar com)rs_0; /低电平时写指令DI=com; _delay_ms(1);en_1;_delay_ms(1); en_0;/*夜晶写入数据的函数*/void wright_data(uchar data)rs_1; /高电平时写数据 DI=data;_delay_ms(1);en_1;_delay_ms(1);en_0;/*4x4矩阵键盘及一个独立键盘的扫描函数*/uchar keyscan(void) unsigned char temp,temp1,key,row,column; key_ddr = 0x0f;/ 高四位输入列线/低四位输出到行线 key_port = 0xf0;/ 高四位打开上拉电阻/低四位输出低电平 上拉电阻会把电平拉高 if(lone_key_pin=0) _delay_ms(5); /延时消抖 if(lone_key_pin=0) _delay_ms(90); /等待松手 return(31); if(key_pin & 0xF0)!= 0xF0) / 作初检查有否键按下,没有,就返回 如果列线不全为1,可能有键按下 _delay_ms(5);/ 延时去抖动 if(key_pin & 0xF0)!= 0xF0) /确认有按键按下 _delay_ms(1000); /延时等待松手 for(row=0,key_port=0b11111110;row4;row+) for(column=0,temp=0b11101111;column4;column+)/ 设置列线初始值1110 if(key_pin & 0xF0)=(temp & 0xF0)/ 输入列线,查看这列有否键按下 key=4*row+column;/ 键编码=4*行输入值+列扫描值 key=key_tablekey;/ 键盘编码转换键值 return (key); temp=1;/ 列线左移1位 key_port=(key_port9&t=0&temp10) /以下处理仅对数字有效 if(fuhao) /表示已经写了符号了,提示是输入第二个数了 if(deflag2) /判断为小数部分 if(dd=3) wright_data(0+temp); /输入一个数就显示一个数b1+dd=temp; /保存小数点后面的数字else overflag=1;else /整数部分 if(bb=5) /条件为位数还不足六位 wright_data(0+temp); /输入一个数就显示一个数 b+bb=temp; /输入的是第二个数 保存的是整数部分 else overflag=1; /数值溢出 else/输入的是第一个数if(deflag1) /判断为小数部分 if(cc=3) wright_data(0+temp); /输入一个数就显示一个数a1+cc=temp; /保存小数点后面的数字else overflag=1;else /整数部分 if(aa=5) /条件为位数还不足六位 if(aa=0) wright_com(0x80); /从每个位置起写 wright_data(0+temp); /输入一个数就显示一个数 a+aa=temp; / 保存的是整数部分 else overflag=1; /数值溢出 /*重新初始化的函数*/void reset() /按下复位键后变量要全部变到初始状态uchar k;for(k=1;k999999.9999) /数据溢出 要作处理 overflag=1; temp1*=10000; /变成整数处理,方便 if(temp15;k-) /只能十位以上的数字进行检测,个位的不管是不是零都要显示 if(wek!=0) break; /确定第一个非零数字,只显示有效数字 for(j=k;j0;j-) /从第一个非零数字开始显示 if(j=4) wright_data(.); /小数部分前面要加个小数点 wright_data(0+wej);_delay_ms(2);/*溢出提示函数*/void flow_clew() uchar num; if(overflag) wright_com(0x80+0x40+5); for(num=0;num6;num+) wright_data(table2num);_delay_ms(2); /*判断是不是小数点*/void decimal(uchar

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论