完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我是一名在校学生,这次是单片机的课程设计,要求做一个简易计算器,实现支持5个一位数的混合计算,以及可以回读10次计算结果,但是出现了两个问题无法解决,老师又是打太极懒得看程序。故求各位帮帮忙指导一下。 程序如下:( = =新手,多余代码或者写法繁琐请见谅。。。。) #include #include #define uchar unsigned char #define uint unsigned int #define ulong unsigned long ***it R=P2^0; //使能 ***it W=P2^1; ***it E=P2^2; void delay(unsigned int k); //延时 void init(); //LCD初始化 void write_com_1602(uchar command); //写命令 void write_data_1602(uchar datum); //写数据 void desplay(uint a); //显示程序 void show(ulong x ); //显示第二行 uchar anjian(void) ; //键盘扫描 ulong js(void) ; //计算函数 uint key; uint a[9]; //存储九次按键 uint du[10]; //存储十次计算结果 uchar time,p,t,r; void DelayMS(uint x) //延时函数 { uchar i; while(x--) for(i=0;i<250;i++); } void main()//主函数 { ulong x,i,j;// _nop_(); init(); t=0; j=0; r=0; P1=0xf0; //p1赋值后 矩阵键盘开启 time=9; //倒计时初值,在定时函数里进行自减 p=0; IT0=1;//选择外部中断0为跳沿触发方式 TMOD=0x01; ET0=1; //定时器中断允许 EA=1; EX0=1;//外中断0允许 TH0=(65535-50000)/256; TL0=(65535-50000)%256; TR0=1; while(time==-1?0:1);//倒计时归零判断 TR0=0; write_com_1602(0X01);//清屏 while(1) { while(P1==0xf0); key=anjian(); //按键输入 if(key<=9&&key>=0) //判定键值 { a[j]=key; //数字键值,显示数字 desplay(key); j++; while(P1!=0xf0); delay(30); } else if(key<=13&&key>=10) //符号键值,显示加减乘除号 { switch (key) { case 10: write_data_1602('+'); a[j]=10; j++; break; case 11: write_data_1602('-'); a[j]=11; j++; break; case 12: write_data_1602('*'); a[j]=12; j++; break; case 13: write_data_1602('/'); a[j]=13; j++; break; default: break; delay(130); } delay(130); } else if(key==15) //等号键值 { write_com_1602(0x80+0x40); //给AC送值 write_data_1602('='); x=js(); du[r]=x; t=r; r++; show(x); } else if(key==14) //清零键值 { write_com_1602(0X01); //清屏 write_com_1602(0X80); //给AC送值 for(i=0;i<9;i++) a=0; j=0; } } } void init() //LCD初始化 { E=0; W=0; write_com_1602(0X38);//数据位为8位,显示2行字符.5*7点阵字符体 write_com_1602(0X0F);//开显示,光标消失,不闪烁 write_com_1602(0X06);//光标右移,AC递增 write_com_1602(0X01);//清屏 write_com_1602(0X80);//给AC送值 } void write_com_1602(uchar command)//写命令 { E = 0; R = 0; W = 0; P0 = command; delay(2); E = 1; delay(4); E = 0; } void write_data_1602(uchar datum)//写数据 { E = 0; W = 0; R = 1; P0 = datum; delay(2); E = 1; delay(4); E = 0; } uchar anjian(void) //键盘扫描 { uchar x; while(P1==0xf0); P1=0XFE; //键扫第一行 if (P1!=0XFE) { DelayMS(20); if (P1!=0XFE) { switch (P1) { case 0XEE : while(P1==0XEE); x=7;//P1=0XFf; break; case 0XDE :while(P1==0XDE); x=8;// P1=0XFf; break; case 0XBE :while(P1==0XBE); x=9; //P1=0XFf; break; case 0X7E :while(P1==0X7E); x=10;// P1=0XFf; break; } } } P1=0XFD; //键扫第二行 if (P1!=0XFD) { DelayMS(20); if (P1!=0XFD) { switch (P1) { case 0XED : while(P1==0XED); x=4;// P1=0XFf; break; case 0XDD : while(P1==0XDD);x=5; // P1=0XFf; break; case 0XBD : while(P1==0XBD);x=6; //P1=0XFf; break; case 0X7D : while(P1==0X7D);x=11; // P1=0XFf; break; } } } P1=0XFB; //键扫第三行 if (P1!=0XFB) { DelayMS(20); if (P1!=0XFB) { switch (P1) { case 0XEB : while(P1==0XEB); x=1;// P1=0XFf; break; case 0XDB : while(P1==0XDB);x=2;// P1=0XFf; break; case 0XBB : while(P1==0XBB);x=3; //P1=0XFf; break; case 0X7B : while(P1==0X7B);x=12;// P1=0XFf; break; } } } P1=0XF7; //键扫第四行 if (P1!=0XF7) { DelayMS(20); if (P1!=0XF7) { switch (P1) { case 0XE7 : while(P1==0XE7); x=14; // P1=0XFf; break; case 0XD7 : while(P1==0XD7); x=0;// P1=0XFf; break; case 0XB7 : while(P1==0XB7); x=15; // P1=0XFf; break; case 0X77 : while(P1==0X77); x=13; //P1=0XFf; break; } } } P1=0xf0; while(P1!=0xf0); return x; } void desplay( uint a) // 一位数输出显示 { uchar b; b=a+0x30; write_data_1602(b); } void delay(uint k) //延时函数 { int l; while(--k!=0) { for(l=0;l<125;l++); } } void show( ulong x )//LCD多位数显示 { uint num,c,j; ulong a=1,k; uchar table[]={"0123456789"}; uchar y; num=0; write_com_1602(0x80+0x41); k=x; while(k!=0) { num++; k=k/10; } for(j=1;j a=a*10; } while(num) { c=x/a; x=x%a; a=a/10; y=table[c]; num--; write_data_1602(y); delay(50); } } ulong js(void) //计算函数(判定符号,计算,左移位) { ulong x,i,j; for(i=1;i<9;i=i+2) { if(a==12||a==13) { if(a==12) { a[i-1]=a[i-1]*a[i+1]; for(j=i;j<9;j++) a[j]=a[j+2]; a[7]=0; a[8]=0; } if(a==13) { a[i-1]=a[i-1]/a[i+1]; for(j=i;j<9;j++) a[j]=a[j+2]; a[7]=0; a[8]=0; } i=-1; } } for(i=1;i<9;i=i+2) { if(a==10||a==11) { if(a==10) { a[i-1]=a[i-1]+a[i+1]; for(j=i;j<9;j++) a[j]=a[j+2]; a[7]=0; a[8]=0; } if(a==11) { a[i-1]=a[i-1]-a[i+1]; for(j=i;j<9;j++) a[j]=a[j+2]; a[7]=0; a[8]=0; } i=-1; } } x=a[0]; return x; } void time0() interrupt 1 //定时中断 { TH0=(65535-50000)/256; TL0=(65535-50000)%256; p++; if(p==20) { write_com_1602(0X01); write_data_1602(time+0x30); time--;//倒计时变量自减 p=0; } } void int0() interrupt 0 //回读函数 { uint num,c,j; ulong a=1,k; uchar table[]={"0123456789"}; uchar y; num=0; write_com_1602(0x80+0x41); k=du[t]; write_com_1602(0X01); while(k!=0) { num++; k=k/10; } for(j=1;j a=a*10; } while(num) { c=du[t]/a; du[t]=du[t]%a; a=a/10; y=table[c]; num--; write_data_1602(y); delay(50); } t--; } 仿真图: |
|
相关推荐
5个回答
|
|
|
|
|
|
那个,这不是Proteus仿真吗?
咋不发到Proteus仿真板块呢?
KEY.c
(3.04 KB, 下载次数: 39
)
KEY.h
(437 Bytes, 下载次数: 37
)
MCU_Drive.h
(2.23 KB, 下载次数: 21
)
给你键盘驱动吧,这个是430仿真做的。 我在其他类型单片机仿真也都是用他。至于移植,你看MCU_Drive.h.就可以了! |
|
|
|
0XFE,0XFD是啥意思,个人觉得高四位打的顺序是1000,0100,0010,0001,然后分别测低四位是不是有高电平.
|
|
|
|
觉得高四位打的顺序是1000,0100,0010,0001,然后分别测低四位是不是有高电平.
|
|
|
|
不错的文件,值得收藏
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
7 浏览 0 评论
26 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
13 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
644 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1000 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11770 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 06:58 , Processed in 0.556520 second(s), Total 49, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号