完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在做代码,要把矩阵键盘按下后识别出数字并且向前进位,但是一直全部显示0,不能读入。求助。用的共阴数码管付图和全部代码求指导
代码: #include #define uint unsigned int #define uchar unsigned char ***it p30=P3^0; ***it DU=P2^6; ***it WE=P2^7; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar code chose[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //uchar code sel[]={0xfe,0xfd,0xfb,0xf7}; uint shu[8]={1,2,3,4,5,6,7,8}; uchar q=0; uint count,miaoshu,sv; //定义计数值,实际温度值,设定的温度值 uchar sec,tcnt,flag,flag1; int rk,yk,uk,uk_1=0,ek,ek_1=0,ek_2=0; //PID计算参数 signed char T=20,Kp=30,Td=8,ti=100,q0,q1,q2; //PID参数其值经反复调试得来 //延时1ms子程序 void delay(uchar z) { uchar x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } //显示子程序 void display(uint a,uint b) { char i; shu[0]=a/1000; shu[1]=a/100%10; shu[2]=a%100/10; shu[3]=a%10; shu[4]=b/100; shu[5]=b/100%10; shu[6]=b%100/10; shu[7]=b%10; for(i=0;i<8;i++) { DU=1;P0=table[shu[i]];DU=0;delay(5); WE=1;P0=chose[i];WE=0; } } // 定时器中断0子程序 void t0(void) interrupt 1 using 0 //定时T0中断服务函数 { tcnt++; //每过250ust tcnt 加一 if(tcnt==40) //计满40 次(1/100 秒)时 { tcnt=0; //重新再计 sec++; if(sec==10) //定时0.1 秒,在从零开始计时 { sec=0; TH0=0x06; //对TH0 TL0 赋值 TL0=0x06; miaoshu=count; count=0; } } } void sdf(void) interrupt 2 using 0 //计数T1中断服务函数 { count=count+1; } //左移一位 void yishu(uchar num) { uchar qian,bai,shi,ge; qian=sv/100%10; bai=sv%100/10; shi=sv%10; ge=num; sv=qian*1000+bai*100+shi*10+ge; } //按键子程序 void key() { uchar i,temp,lie,hang,shu; for(i=0;i<3;i++) //求出按键值 { P1=~chose[i]; temp=P1; temp=temp&0xf0; if(temp!=0xf0) { hang=i; if(temp==0xe0) lie=1; else if(temp==0xd0) lie=2; else if(temp==0xb0) lie=3; else if(temp==0x70) lie=4; break; } } shu=hang*4+lie; //数为对应的按键 switch(shu) { case 1: if(!flag) yishu(0);break; case 2: if(!flag) yishu(1);break; case 3: if(!flag) yishu(2); break; case 4: if(!flag) yishu(3);break; case 5: if(!flag) yishu(4); break; case 6: if(!flag) yishu(5);break; case 7: if(!flag) yishu(6);break; case 8: if(!flag) yishu(7);break; case 9: if(!flag) yishu(8);break; case 10: if(!flag) yishu(9);break; case 11: flag++;flag1++; break; case 12: sv=0;miaoshu=0;flag=0;flag1=0;break; case 13: flag1++; break; default: break; } while(temp!=0xf0) //放键检测 { temp=P1; temp=temp&0xf0; for(i=0;i<10;i++) display(sv,miaoshu); } } //按键检测程序 void keyscan() { uchar temp; P1=0xf0; temp=P1; temp=temp&0xf0; if(temp!=0xf0) { delay(5); //消除抖动 P1=0xf0; temp=P1; temp=temp&0xf0; if(temp!=0xf0) key(); } } /******************************************************/ void pid(void) //PID 计算输出量 { ek=sv-miaoshu; uk=uk_1+q0*ek+q1*ek_1+q2*ek_2; ek_2=ek_1; ek_1=ek; uk_1=uk; if(uk>501) uk=501; //限定输出上限 if(uk<1) uk=1; //限定输出下限 } /******************************************************/ main() { DU=0;WE=0; q0=Kp*(1+T/Ti+Td/T);//先算出PID的计算参数 q1=-Kp*(1+2*Td/T); q2=Kp*Td/T; p30=0; EX0=1; IT1=1; TMOD=0x02; //定时器T0工作在方式2 自动重装方式,计数器T1工作在方式2 自动重装方式 TH0=0x06; //对TH0 TL0 赋值 TL0=0x06; TR0=1; //开始定时 ET0=1; //允许T0 产生中断 EA=1; EX1=1; EA=1; sec=0; SCON=0x90; //MODER1,REN=1; PCON=0x00; miaoshu=0;tcnt=0;count=0;sv=0; flag=0; while(1) { keyscan(); if(flag==2) p30=0; if(flag1==2) { // uint i; pid(); if(ek>100) { p30=1; } else if(ek>=0) { p30=1; delay(uk/10); display(sv,miaoshu); p30=0; delay(50-uk/10); } // else if(ek<0) // p30=0; } display(sv,miaoshu); } } 再付上文件
|
|
相关推荐 |
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
503 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1756 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1183 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
1053 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1287 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12022 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 19:29 , Processed in 0.493659 second(s), Total 67, Slave 50 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号