版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#in clude<avr/io.h>#include<util/delay.h>/延时函数的头文件#include<avr/interrupt.h> / 中断函数的头文件#define uint unsigned int#define uchar unsigned chardefine BIT(k) (1«k)/利用上ICC软件的优点define DI PORTC/夜晶的数据输入端define No_key 255没有按键按下的返回值define key_port PORTD /键盘输入define keyddr DDRDdefine key_p
2、in PIND/宏定义方便以后程序移植define lone_key_port PORTB/独立键盘接口用于输入小数点define lone_key_ddr DDRBdefine lone_key_pin (PINB&BIT(0) /读取独立键盘接口的电平define rs_O PORTA&=BIT(0) /RS 复位define rs.1 PORTA|=BIT(0) /RS 萱位define en_0 PORTA&=BIT /使能端复位#defineen_1 PORTA|=BIT(1) /使能端萱位const uchar tablei You are welcome!
3、”; / 初始显示字符const uchar table2TERROR!"出错提示字符uchara7=0,0,0,0,0,0,0,b11=0,0,0,0,0,0,0,a15=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 deflagl ; /小数点标志uchar deflag2 ; /小数点标志uchar overflag; /数值溢出标志uchar allov/flag
4、=1; /符号允许标志,用于禁止连续两个符号的输出uchar negative;/负数标志,当是负数要作相应的处理long temp3,temp4; 计算的数值得数用其中一个变量存储即可,不用再浪费存开辟其他 变重float tempi, temp2;const unsigned char key_table16=7, 8, 9, 10,4, 5, 6, 11,1,2, 3, 12, 50,0, 21,13;/键盘编码可根据具体情况而设定端口初始化/夜晶初始化/定时器初始化void portjnit(); void devicejnit(); void time_init();void wri
5、ght_(uchar );void v/right_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 fl
6、ow_clew() ; /溢出提示函数int main()portjnit(); devicejnit(); time_init(); /初始化 while flow_clew() ;/溢出提示函数,一旦扫描到出错就会显示错误*中断服务程序*总结资料volatile unsigned int i;/中断服务程序中要使用全局变量,且要加volatileSIGNAL(SIG_OVERFLOWO)TCNTO=2O5; /重装初值 i=keyscan();/返回键盘扫描值if(i!=No_key) /确认有按键按下 if(i=50)wright_(0x01) ;/清显示_delay_ms(10);延时
7、等待清屏指令完成wrighC(0x80);wright_data(O); /重新显示 0reset();flag=1; / 标志起动/初始化if (i< 50&&f lag)/条件为已经启动而旦输入的是有效字符judgechar(i);decimal(i);lcd_handle(i);if(i=21)wright_data(v);calculate。; result(temp1);/判断是不是操作符,要是则要作相应的处理/判断是不是小数点输入,要是则要作相应的处理/对输入的数据进行合理存储并加以显示/按下了等号键/显示等号/计算数值/拆分数值后显示结果环”环定时器初始化“
8、黄”环”void timenit()TCNT0=205; /初值 255-205=50 50 微秒TIMSK|=(1«TOIEO);sei(); /开启总中断TCCRO|= (1«CS01);/8 分频 8M/8=1M广端口初始化void portjnit()DI=Oxff;DDRA| 二 BIT(O);DDRA|二BIT;/输出状态Ion e_key_ddr&=-BIT(O);lone_key_port|=BIT(0); /独立键盘接口设萱为输入,并打开上拉电阻DDRD=O;/全部设为输入,有个上拉电阻,可以输入高电平DDRB 二 Oxff;void device
9、 J n 让()0x0c不显示光标 OxOe光标不闪,OxOf光标en_O; /使能端拉低 wnght_(0x38); 初始化格式 wright_(OxOc) ; /OxOe 打开光标 闪v/right_(OxO1) ;/清显示wright_(0x80);for(i=0;i<17;i+)v/right_data(table1 i);_delay_ms(20);严"夜晶写入指令的函数+void v/right_(uchar )rs_O; 低电平时写指令Dl=;_delay_ms ; enJ;_delay_ms ; en_O;/祕决夜晶写入数据的函数*/ void v/right_
10、data(uchar data)rs_1; /高电平时写数据 Dl=data;_delay_ms ; enJ;_delay_ms ; en_O;厂*4x4矩阵键盘及一个独立键盘的扫描函数*/uchar keyscan (void)unsigned char temp,tempi,key,row,column;key_ddr = OxOf;/高四位输入列线/低四位输出到行线key_port = OxfO;/高四位打开上拉电阻/低四位输出低电平 上拉电阻会把电平拉高if(lo ne_key_pin=O)_de lay_ms (5);/ / 延时消抖if(lone_key_pin=0)_delay_
11、ms(90); /等待松手return(31);if(key_pin & 0xF0)!= OxFO) /作初检查有否键按下,没有,就返回如果列线不全为1,可能有键按下_delay_ms;/延时去抖动if(key_pin & OxFO)!= OxFO) /确认有按键按下_delay_ms(1000); /延时等待松手for(rov/=0,key_port=0b11111110;rov/<4;rov+)for(column=0,temp=0b11101111 ;column<4;column+)/ 设責列线初始值 1110if(key_pin & 0xF0)=(
12、temp & OxFO)/输入列线,查看这列有否键按下key=4*row+column;/键编码二半行输入值+列扫描值 key=key_tablekey;/键盘编码转换键值 return (key);temp«=1;/列线左移1位key_port=(key_port«1) 10x01);/行线扫描值左移1位,扫描下一行return (No_key);/“*对键盘扫描返回值进行判断是不是为符号*/void judgechar(uchar t)/用带参数的函数可以减少键盘扫描次数if(t>9&&t<14&&allovflag)
13、/符号围fuhao=1;/标志为符号,为后面的程序作决断算完后再将其清零allowflag。/禁止下一个符号的输入,只能输入一个符号 if(t=1O)/输入的是减号wright_data('/');if(t=11)/输入的是减号v/right_data('*');if(t=12)/输入的是减号v/right_data('-');if(t=13)/输入的是减号wright_data('+');sym=t;/把符号的编号保存下来,方便以后调用广祕夜晶显示处理,该显示什么,不该显示什么*/void lcd_handle(uchar te
14、mp)/用带参数的函数可以减少键盘扫描次数if(temp>=0ft&temp<10)/以下处理仅对数字有效if(fuhao)/表示已经写了符号了,提示是输入第二个数了if(deflag2)/判断为小数部分if(dd<=3) -总结资料-wright-dataCO'+temp); /输入一个数就显示一个数 b1+dd=temp; /保存小数点后面的数字elseoverflag=1;else/整数部分if(bb<=5) /条件为位数还不足六位 wright.dataCO'+temp); /输入一个数就显示一个数b+bb=temp; 输入的是第二个数保
15、存的是整数部分 elseoverflag=1;/数值溢出else/输入的是第一个数 if(deflagl)/判断为小数部分if(cc<=3)wright.dataCO'+temp); /输入一个数就显示一个数 a1+cc=temp; /保存小数点后面的数字elseoverflag=1;else整数部分if(aa<=5) /条件为位数还不足六位if(aa=O)v/right_(0x80); /从每个位萱起写 wright.dataCO'+temp); /输入一个数就显示一个数a+aa=temp; /保存的是整数部分elseoverflag=1;/数值溢出/*>新
16、初始化的函数*/void reset()/按下复位键后变量要全部变到初始状态uchar k;for(k=1;k<7;k+)ak二 0;bk=O;overflag=0;/溢出标志复位flag=O;启动标志复位allovflag=1;/符号允许标志萱位fuhao=0;符号已使用标志复位aa=0;bb=O;元素个数清零sym=0;/符号的编码萱0;广7“对数值进行计算,a, b存储的是数,sym操作符编号"void calculate(void)switch(aa)/根据位数代入对应的公式case 1: tempi =aaa;break;case 2: tempi =a2+a1*10
17、;break;case 3: tempi =a3+a2*10+a1 *100;break;case 4: temp1=a4+a叮 0+a"00+airi000;break;case 5: tempi =a5+a4*10+a3*100+a2*1000+a1 *10000;break;case 6: tempi =a6+a"0+&4门00+乱3门000+a2"0000+a1100000;SWitch(bb)/根据位数代入对应的公式case 1: temp2=bbb;总结资料break;case 2: temp2=b2+b1 *10;break;case 3:
18、temp2=b3+b2*10+b1*100;break;case 4: temp2=b4+b3*10+b2*100+b1 *1000;break;case 5: temp2=b5+b4FO+b3riOO+b*1000+b1*10000;break;case 6: temp2=b6+b*10+b4*100+b勺000+碰2叮0000小1叮00000;temp3=a1 1 *1000+a1 2*100+a13*10+a14;temp4=b11 *1000+b1 2*100+b1 3*10+b1 4;/小数部分放大 10000 倍tempi =temp1 +temp3/10000.0;temp2=t
19、emp2+temp4/10000.0;/整数与小数的结合switch(sym)/判断输入的是哪个操作符并作相应的计算case 10: tempi =temp1 /temp2;break;case 11: tempi =temp1 *temp2;break;case 12: tempi =temp1 np2;break;case 13: tempi =temp1 +temp2;break;if(temp1 >999999.9999) /数据溢出 要作处理overflag二1;tempi*=10000;/变成整数处理,方便if (tempi <0)tempi =-temp1; /变负为正negative=1;/负数标志厂"把结果数值拆分显示 72/ void result(long value)uchar we10;uchar k;uchar j;if(negative)vright_data(,J);for(k=10;k>5;k-)显示v/e10=value/1000000000; v/e9=value/100000000%10; v/e8=value/10000000%10; v/e7=value/10000009610; we6=value/100000%10; we =value/10000%10; v/e4=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高级能源服务员日常工作规范与要求
- 中级滑雪指导员个人品牌建设与职业形象提升规划
- 博物馆遗址类高级讲解服务标准化作业流程方案
- 安全员工作交流
- 金融投资公司介绍
- 联系上下文解释词语的方法
- 统编版语文一年级上册语文园地五
- 环保行业污水处理技术员面试题目及答案
- 环保行业水质检测工程师面试题目及答案
- 2025年医院职业暴露处理和防护及消毒隔离相关知识考核试题及答案
- 中国矿业大学(北京)《MBA运营管理》2023-2024学年第一学期期末试卷
- 可移动文物管理办法
- 劳模精神教育
- 肛肠科中医课件
- 消防安全自查清单
- 泌尿系结石围手术期护理
- 货物项目保管方案(3篇)
- 2024-2025学年山东省济南市章丘区七年级上学期期中生物试卷
- 乡村学生手机管理制度
- 第三单元写作《如何突出中心》课件 2024-2025学年统编版语文七年级上册
- 商事调解中心管理制度
评论
0/150
提交评论