完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这是画的原理图,板野焊出来了,程序也拷进了单片机,街上电源后不能用,只有数码管有微弱的光(共阴数码管),求大神看一下哪里有问题(硬件电路都是根据原理图检查没问题)。下面是程序(小白第一次发求助,不知道要发文件还是直接写程序就都发了)(也不知道要选什么主题,见谅)
在此先谢谢各位大神了 /************************************** 工程名:简易计算器 ***************************************/ #include #define uchar unsigned char #define uint unsigned int //定义位选编码 #define WEI1 0xfe //千位控制 #define WEI2 0xfd //百位控制 #define WEI3 0xfb //十位控制 #define WEI4 0xf7 //个位控制 //定义运算操作符代号 #define add 0x0c //加 #define dec 0x0d //减 #define mul 0x0e //乘 #define div 0x0f //除 #define den 0x0b //等于 #define sur 0x0a //清零 ***it P3_4=P3^4; ***it P3_5=P3^5; ***it P3_6=P3^6; ***it P3_7=P3^7; uchar step; //记录操作步骤的变量 uchar sybol; //记录运算符号的变量 uint fir; //记录第一个操作数的变量 uint sec; //记录第二个操作数的变量 uint res; //记录结果的变量 uint tempres; //记录中间结果的变量 uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };//数字0~9的编码,共阴 uchar code err[] = { 0x00,//NULL 0x79,//E 0x50,//R 0x50 //R }; //单词 ERR的编码 void delayms(uint z) { uint i,j; for(i=z;i>0;i--) for(j=120;j>0;j--); } //*********************************************************************************** //功能按键扫描程序 //返回值:有键按下,返回具体的键值,无键按下,返回0xff //*********************************************************************************** uchar keyscan(void) { unsigned char temp; //用于检测按键的临时变量 unsigned char key; P3=0xff; P3_4=0; //第一行输出低电平 temp=P3; //读取P3口数据 temp=temp & 0x0f; //临时变量高4位清零,保持低4位 if (temp!=0x0f) //判断是否有键按下 { delayms(10); //延时10ms temp=P3; //读取P3口数据 temp=temp & 0x0f; if (temp!=0x0f) //再次判断是否有键按下 { temp=P3; //有键按下,读取P3口数据 temp=temp & 0x0f; switch(temp) //判断具体是哪个键按下 { case 0x0e:key=3;break; case 0x0d:key=2;break; case 0x0b:key=1;break; case 0x07:key=0;break; default:break; } temp=P3; temp=temp & 0x0f; while(temp!=0x0f) //等待按键释放 { temp=P3; temp=temp & 0x0f; } return key; } } P3=0xff; P3_5=0; //第二行输出低电平 temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { delayms(10); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { temp=P3; temp=temp & 0x0f; switch(temp) { case 0x0e:key=7;break; case 0x0d:key=6;break; case 0x0b:key=5;break; case 0x07:key=4;break; default:break; } temp=P3; temp=temp & 0x0f; while(temp!=0x0f) { temp=P3; temp=temp & 0x0f; } return key; } } P3=0xff; P3_6=0; //第三行输出低电平 temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { delayms(10); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { temp=P3; temp=temp & 0x0f; switch(temp) { case 0x0e:key=11;break; case 0x0d:key=10;break; case 0x0b:key=9;break; case 0x07:key=8;break; default:break; } temp=P3; temp=temp & 0x0f; while(temp!=0x0f) { temp=P3; temp=temp & 0x0f; } return key; } } P3=0xff; P3_7=0; //第四行输出低电平 temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { delayms(10); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { temp=P3; temp=temp & 0x0f; switch(temp) { case 0x0e:key=15;break; case 0x0d:key=14;break; case 0x0b:key=13;break; case 0x07:key=12;break; default:break; } temp=P3; temp=temp & 0x0f; while(temp!=0x0f) { temp=P3; temp=temp & 0x0f; } return key; } } return 0xff; } //*********************************************************************************** //对两个数进行数学运算 //返回值:返回运算结果,结果为大于或等于零的整数 //*********************************************************************************** uint jisuan() { uint result; switch(sybol) { case(add): result = fir + sec;break; case(dec): result = fir - sec;break; case(mul): result = fir * sec;break; case(div): result = fir / sec;break; default:break; } return result; } void init() //变量初始化 { step = 0; fir = 0; sec = 0; res = 0; tempres = 0; } void display(uint dat) //数码管显示数字 { uchar q,b,s,g; if(dat<0||dat>9999) // 显示错误 { P2 = WEI1; P0 = err[0]; delayms(5); P2 = WEI2; P0 = err[1]; delayms(5); P2 = WEI3; P0 = err[2]; delayms(5); P2 = WEI4; P0 = err[3]; delayms(5); } else { q = dat/1000; b = (dat/100)%10; s = (dat/10)%10; g = dat%10; if(q==0) //最高位数据为0时不显示 { if(b==0) { if(s==0) { P2 = WEI4; P0 = table[g]; delayms(5); } else { P2 = WEI3; P0 = table delayms(5); P2 = WEI4; P0 = table[g]; delayms(5); } } else { P2 = WEI2; P0 = table; delayms(5); P2 = WEI3; P0 = table delayms(5); P2 = WEI4; P0 = table[g]; delayms(5); } } else { P2 = WEI1; P0 = table[q]; delayms(5); P2 = WEI2; P0 = table; delayms(5); P2 = WEI3; P0 = table delayms(5); P2 = WEI4; P0 = table[g]; delayms(5); } } } void main() { uchar key; init(); while(1) { key=keyscan(); if(step==0 && key<10 ) //第一步;第一个运算数据键按下 { fir = fir*10 +key; //连续按键按下进行数据组合 } if(step==0 && (key>=12&&key<=15)) //功能键按下 ,进入第二步 { sybol = key; sec = 0; step = 1; } if(step==1 && (key>12&&key<=15)) //第二次功能键按下,替换原功能键 sybol = key; if(step==1 && key<10) //第二个运算数据按下 ,进入第三步 { // step = 2; sec = sec*10 + key; // key = 0xff; // 为了清除第一个运算数据,显示第二个数据 } // if(step==2 && key<10 ) // sec = sec*10 +key; if(step==1 && key==11) //获得两个运算数据后,按下"="号键进行运算,进入第四步 { res = jisuan(); fir = 0; sec = 0; step = 2; } if(key == 10) //按下清除键"C",清0返回初始状态 { step = 0; fir = 0; sec = 0; res = 0; } //显示部分 if(step==0 ) display(fir); if(step==1) display(sec); if(step==2) display(res); } }
|
|
相关推荐
2个回答
|
|
什么问题?解决了吗?
|
|
|
|
程序下方画横线的程序是怎么回事,是注释掉不要了么?
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1296 浏览 1 评论
836 浏览 0 评论
1298 浏览 0 评论
推动SiCMOSFET国产化,华秋获“芯塔电子”优秀媒体合作伙伴奖
1730 浏览 0 评论
3165 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-23 19:37 , Processed in 0.704686 second(s), Total 74, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号