




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/*程序功能:实现六位数的加,减,乘,除和数的n次方,键盘K0K9的键值为09,K12K15分别为+,*和/,K10为=,K11为上次输入数的n方。*/#include #include #define uint unsigned int #define uchar unsigned charconst uchar segment19=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xb7,0xc8,0x8f,0xbf,0x89,0xb9,0xff,0x86,0x88;uchar static key_flag;uchar static key1;uchar A6=0,0,0,0,0,0; /第一次输入的各位数uchar B6=0,0,0,0,0,0; /第二次输入的各位数uchar F8=0,0,0,0,0,0,16,16; /存放显示的数long int c=0; /第一次输入的数值long int d=0; /第二次输入的数值int e=0; /存放符号位long int g;/*键盘初始化函数*/void int_I_O(void) /扫描键盘p1口及数码管p2,p4,p5口的板上资源初始化(数码管共阳极) P1DIR |=BIT0+BIT1+BIT2+BIT3; / p1.0至p1.3为输出(p1.0至p1.3为键盘的行) P1OUT &=0x00; /p1输出初始化全为0 P5DIR |=BIT7; /p5.7输出 P5OUT &=BIT7; /使能UC573SJ芯片,p5.7为锁存器使能端,低电平有效 P2DIR |=0XFF; /p2口与阴极接口端有连接,控制p2口能获得想要的显示 P4DIR |=0XFF; /p4口与数码管控制端有连接,p4端能控制数码管的熄灭或开启/*系统时钟初始化函数*/void int_clk() /时钟设置为smclk=mclk=xt2clk uchar i; BCSCTL1&=XT2OFF; /xt2off=0,打开高频晶振 BCSCTL2|=SELM1+SELS;/设置smclk=mclk,并使用高频晶振 do IFG1&=OFIFG; for(i=0;i100;i+) _NOP(); while(IFG1&OFIFG)!=0);/直至OFIFG标志位清为0 IFG1&=OFIFG;/*timerA初始化函数*/void int_timer() /smclk为时钟来源,8分频,1MHz,增加模式,10ms来一个中断 TACTL|=TASSEL1+TACLR+ID0+ID1;/smclk为时钟来源,8分频,1MHz TACTL|=MC0+TAIE; /增加模式,并且使能中断 TACCR0=9999; /10ms来一个中断/*检测键盘有无输入函数*/void fast_scan() /检测键盘有无输入,没输入key_flag=0,有输入 key_flag=1 uchar temp; P1OUT &=0xf0; /p1口低四位清0,高四位不变, temp=P1OUT&0xf0; /p1口为oxf0,没输入,否则有输入 if(temp=0xf0)key_flag=0; /没输入key_flag=0,有输入 key_flag=1else key_flag=1; /*行扫描读列值函数*/uchar scan_key(uchar line) /表示每行扫描一次,判断一下列值 uchar key; P1OUT=line; /接受扫描行,用p1第四位控制,就是其中1位为低位,剩余3位为高位 switch(P1IN&0xf0) /p1高四位输入判断第几列,如第一列0111 case 0x70:key=0x01;break; /第一列0x01表示,列为从左往右数 case 0xb0:key=0x02;break; /第二列0x02表示 case 0xd0:key=0x03;break; /第三列0x03表示 case 0xe0:key=0x04;break; /第四列0x04表示 default:key=0xff;break; return(key); /返回列键值/*获取键盘数值函数*/uchar get_key() /对行扫描,读列值的方法获取键盘数值 uchar key; while(1) /一直扫描,直到扫描完为止 key=scan_key(0x7); /第一行的扫描,从下往上为第一行,将0111给p1的低4位 if(key!=0xff)key|=0x10;P1OUT=0x0f;break; /第一行用0x10 key=scan_key(0xb); /第二行的扫描,将1011给p1的低4位 if(key!=0xff)key|=0x20;P1OUT=0x0f;break; /第二行用0x20 key=scan_key(0xd); /第三行的扫描,将1101给p1的低4位 if(key!=0xff)key|=0x30;P1OUT=0x0f;break; /第三行用0x30 key=scan_key(0xe); /第四行的扫描,将1110给p1的低4位 if(key!=0xff)key|=0x40;P1OUT=0x0f;break; /第四行用0x40 switch(key) case 0x11:key=0;break; /第一行第一列键值为0,以后键值往后推 case 0x21:key=1;break; case 0x31:key=2;break; case 0x41:key=3;break; case 0x12:key=4;break; case 0x22:key=5;break; case 0x32:key=6;break; case 0x42:key=7;break; case 0x13:key=8;break; case 0x23:key=9;break; case 0x33:key=10;break; case 0x43:key=11;break; case 0x14:key=12;break; case 0x24:key=13;break; case 0x34:key=14;break; case 0x44:key=15;break; _NOP(); /延时 return(key); /返回键盘数值给调用函数/*over函数*/void over() uchar temp; P1OUT&=0xc0; do temp=P1IN&0xc0; if(temp=0xc0)break; while(1);/*可调时间的延时函数*/void delay(t) /延时一段时间 uint i; for(i=0;it;i+) _NOP();/*延时一段时间函数*/void delay2(void) /延时一段时间 uint i=0,j=0; for(i=0;i=200;i+) for(j=0;j=300;j+); /*Fi数码管显示函数*/uchar display(void) /显示以Fi为数组内的内容,第二支数码管一直不亮 uchar i; for(i=0;i8;i+) P2OUT=segmentFi;/数码管后六位显示Ai内容,数码管第一位显示符号 P4OUT=0x01i; /动态显示符号及数字 delay(700); /调整t值可调整显示闪烁与亮度 return 0;/*算结果功能函数*/long int int_key(e)/根据输入符号计算值long int f=0; int j; long int ji=1; c=A5*100000+A4*10000+A3*1000+A2*100+A1*10+A0;/第一次输入的数值 d=B5*100000+B4*10000+B3*1000+B2*100+B1*10+B0;/第二次输入的数值 switch(e) /c的数值为最终值返回 case 11:for(j=1;j=d;j+)ji=ji*c; f=ji;break; case 12:f=c+d;break; case 13:f=c-d;break; case 14:f=c*d;break; case 15:f=c/d;break; default:f=c*c;break; return(f);/*主函数*/void main(void) WDTCTL=WDTPW+WDTHOLD; int i=0; int j; long int sum; int_clk(); /初始化系统时钟 int_timer(); /初始化timer,10ms一次中断 int_I_O(); /初始化板上资源设置 _EINT(); /开系统中中断 while(1) fast_scan(); /判断是否有键盘按下,有key_flag=1,无key_flag=0 if(key_flag=0) continue; key_flag=0; delay2(); /延时看是否为抖动 fast_scan(); /再扫描 if(key_flag=1) /有键盘0到9按下,用数组Ai存放,大于9用变量e存放 key_flag=0; /清键盘标志位 do key1=get_key(); /key1存放键盘数值 if(key1=0;j-)Fj+1=Fj; F0=key1; i+; display(); delay2(); fast_scan(); if(key_flag=0) continue; key_flag=0; delay2(); fast_scan(); over(); delay2(); while(key1=9&i=6); for(j=0;j=5;j+)Aj=Fj; e=key1; /e为符号,e=12为加,e=13为减,e=14为乘,e=15为除 F7=e; display();/x显示符号 for(i=0;i=5;i+)Fi=0; display(); i=0; fast_scan(); if(key_flag=0) continue; key_flag=0; delay2(); fast_scan(); if(key_flag=1) key_flag=0; do key1=get_key(); if(key1=0;j-)Fj+1=Fj; F0=key1; i+; display(); fast_scan(); if(key_flag=0) continue; key_flag=0; delay2(); fast_scan(); over(); delay2(); while(key1=9&i=6); for(j=0;j999999)F7=16;F6=16;F5=16;F4=16;F3=16;F2=17;F1=17;F0=18; else F5=sum/100000; F4=(sum/10000)%10; F3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届江苏省扬州市江都区邵凡片重点达标名校中考数学最后一模试卷含解析
- 装饰公司总经办管理制度
- 监狱安全生产意识课件
- 面向自动驾驶汽车的室外单目ORB-SLAM技术研究
- 体温监测与护理安全流程
- 术后伤口护理及感染预防
- 重症病房护理中的安全保障机制
- 输液过程中护士核心技能的强化
- 肿瘤化疗期间的健康教育护理
- 健康管理与护理服务的整合查房
- 脊髓损伤的护理课件
- 海尔冰箱BCD-210DCX使用说明书
- 生物膜技术革新:MBBR与IFAS工艺中功能性生物膜挂膜驯化的深入探讨
- 全国工会系统经审业务技能大赛知识题(附答案)
- 2023年国家烟草专卖局笔试真题
- 心肺复苏课件
- 2024年度可持续发展报告-泡泡玛特-
- 生物炭固碳机制-洞察及研究
- 药厂物料编码管理制度
- 2025年云南中考道德与法治试题及答案
- Q-GDW10250-2025 输变电工程建设安全文明施工规程
评论
0/150
提交评论