ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:19.44KB ,
资源ID:5495084      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5495084.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(一个基于AVR单片机的计算器程序.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

一个基于AVR单片机的计算器程序.docx

1、一个基于AVR单片机的计算器程序一个基于AVR单片机的计算器程序#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 /宏定义方便以后程序移植

2、#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 ucha

3、r 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; /符号允许标志,用于禁止连续两个符

4、号的输出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_co

5、m(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); /显

6、示结果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(0x0

7、1) ; /清显示 _delay_ms(10); /延时等待清屏指令完成 wright_com(0x80); wright_data(0); /重新显示0 reset(); /初始化 flag=1; / 标志起动 if(i50&flag) /条件为已经启动而且输入的是有效字符 judgechar(i); /判断是不是操作符,要是则要作相应的处理 decimal(i); /判断是不是小数点输入,要是则要作相应的处理 lcd_handle(i) ; /对输入的数据进行合理存储并加以显示 if(i=21) /按下了等号键 wright_data(=); /显示等号 calculate(); /计算数

8、值 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; /全部设为输入,有个上拉电阻,

9、可以输入高电平 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;

10、_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;/ 高四位打开上拉电阻/低四位输出低电平 上

11、拉电阻会把电平拉高 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,t

12、emp=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_

13、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 over

14、flag=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-) /只能十位以上的

15、数字进行检测,个位的不管是不是零都要显示 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 de) if(de=31) if(fuhao=0&deflag1=0) /条件为正在输入的是第一个数且此数之前还没有小数点出现 wright_data(.); /显示小数点 deflag1=1; /不能再有下一个小数点了,置位可以防止有第二个小数点 if(fuhao&deflag2=0) /条件为正在输入的是第一个数且此数之前还没有小数点出现 wright_data(.); /显示小数点 deflag2=1; /不能再有下一个小数点了,置位可以防止有第二个小数点

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1