[讨论] 键盘控制三位数码管显示实验程序

qincai0066   2007-8-24 14:04 楼主
小弟新手上路,第一次写程序,先请各位海涵,里面肯定有很多繁琐的地方和缺陷,只是能够演示实验的基本要求了,希望大家看完之后能够多给点意见,给小弟指出一个方向,如何更好的编写程序代码,能够适应现在工程开发设计思想。小弟不胜感激~ 实验要求: 总体需求:根据设定的时间、时间范围为1-999分钟,使用3位数码管显示 具体要求:使用3个健,分别为开始修改键s1、光标移位键s2、修改数字键s3 按键含义:开始修改键s1:单次按键进入修改状态,偶次按键退出修改状态并开始倒计时,倒计时设定的数字值每分钟减一并显示,倒计时计时到零时,蜂鸣器响10秒钟后停止。 光标移位键s2:在修改状态下,按s2键光标依次在数码管移动,该位数码管0.5秒闪烁。在此闪烁位置,每按修改数字键s3一次,该位置上的数字加1,当数字为9时加一数字变为0. 数字修改键 s3: 见上s2键说明。 手动复位键 s6: 复位电路使用专用的复位芯片。 电源使用:使用外接未稳压电源。要求使用7805做电源电压稳压。 电路板设计要求:电路板尺寸为10cm*10cm 程序: #include <reg52.h> #include <ABSACC.H> #define uint unsigned int #define uchar unsigned char bit t10msflag=0; bit onceflag=1; bit keysuccflag=0; bit shanshuoflag=0; bit modeflag=0; bit baojingflag=0; sbit P1_1=P1^1; bit jianyiflag=0; bit tingflag=0; bit startflag=0; uchar keystate=0; uchar keyvalue=0; uchar key_cou=0; uchar keytime=0x23; uchar guangbiaosel=0; uint changedata=0; uchar key1=0xf8; uchar key2=0xf4; uchar key3=0xec; uchar key4=0xdc; uchar key5=0xbc; uchar key6=0x7c; uchar s100=0; uchar s10=0; uchar s1=0; uchar code disppos[3]={0xfb,0xfd,0xfe}; uchar xdata dispbuffer[3]={0xf9,0xa4,0xb0}; uchar code shuzhi[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void keyscan(); void keycheck(); void dec_disp(); void change_dec_disp(); void msDelay(uint delay); void t1_timer() interrupt 3 using 1 {static uchar x=0; static uint m=0; static uint n=0; TH1=(65536-10000)/256; TL1=(65536-10000)%256; t10msflag=1; if(++x>=50) {shanshuoflag=~shanshuoflag; x=0;} if(baojingflag) {if(++m>=1000) {tingflag=1; m=0;} } if(startflag) {if(++n>=6000) {jianyiflag=1; n=0; startflag=0;} } } void main() {P1_1=1; TH1=(65536-5000)/256; TL1=(65536-5000)%256; TMOD=0x10; TR1=1; EA=1; ET1=1; while(1) {if(t10msflag) {t10msflag=0; onceflag=~onceflag;} if(onceflag) {dec_disp(); } if(t10msflag) {t10msflag=0; onceflag=~onceflag; keyscan(); } if(keysuccflag) {keysuccflag=0; keycheck(); } if(baojingflag) {P1_1=0; if(tingflag) {P1_1=1; baojingflag=0;} } } } void keyscan() {uchar x; P1=P1|0xfc; x=P1&0xfc; if(x==0xfc)keystate=0; switch(keystate) {case 0:keyvalue=x; keystate=1; break; case 1:if(x==keyvalue)keystate=2; else keystate=0; break; case 2:if(x==keyvalue) {++key_cou; if(key_cou==keytime) {keysuccflag=1; key_cou=0; } } else keystate=0; break; } } void keycheck() { if(keyvalue==key1) {modeflag=~modeflag; if(modeflag==0) {dispbuffer[0]=shuzhi[s100]; dispbuffer[1]=shuzhi[s10]; dispbuffer[2]=shuzhi[s1]; startflag=1; } } if(keyvalue==key2) {if(++guangbiaosel>=4)guangbiaosel=1; } if(keyvalue==key3) {switch(guangbiaosel) {case 1:if(++s100>=10)s100=0; break; case 2:if(++s10>=10)s10=0; break; case 3:if(++s1>=10)s1=0; break; } } if(keyvalue==key4) {} if(keyvalue==key5) {} if(keyvalue==key6) {} } void dec_disp() {if(modeflag) {if(shanshuoflag) {switch(guangbiaosel) {case 0:{dispbuffer[0]=0xff; dispbuffer[1]=0xff; dispbuffer[2]=0xff; }break; case 1:{dispbuffer[0]=0xff; dispbuffer[1]=shuzhi[s10]; dispbuffer[2]=shuzhi[s1]; }break; case 2:{dispbuffer[0]=shuzhi[s100]; dispbuffer[1]=0xff; dispbuffer[2]=shuzhi[s1]; }break; case 3:{dispbuffer[0]=shuzhi[s100]; dispbuffer[1]=shuzhi[s10]; dispbuffer[2]=0xff; }break; } } else {dispbuffer[0]=shuzhi[s100]; dispbuffer[1]=shuzhi[s10]; dispbuffer[2]=shuzhi[s1];} } if(jianyiflag) {jianyiflag=0; change_dec_disp();} XBYTE[0xc800]=disppos[0]; XBYTE[0xcb00]=dispbuffer[0]; msDelay(6); XBYTE[0xc800]=disppos[1]; XBYTE[0xcb00]=dispbuffer[1]; msDelay(6); XBYTE[0xc800]=disppos[2]; XBYTE[0xcb00]=dispbuffer[2]; msDelay(6); } void change_dec_disp(void) {changedata=s100*100+s10*10+s1; if(changedata>0) {changedata=changedata-1; if(changedata==0){baojingflag=1;} s100=changedata/100; s10=changedata%100; s10=s10/10; s1=(changedata%100)%10; dispbuffer[0]=shuzhi[s100]; dispbuffer[1]=shuzhi[s10]; dispbuffer[2]=shuzhi[s1]; } } void msDelay(uint delay) {static uint i; for(;delay>0;delay--) {for(i=0;i<125;i++) {;} } }
人的上半生:要不犹豫;人的下半生:要不后悔; 活在当下,把握每次的机会~~

回复评论 (3)

: 太乱了。编排下更好
点赞  2009-5-25 10:57
点赞  2012-5-10 20:42
哈哈,回想起当年读大学了,好遥远的事情了,10年就过去了。
无线网络摄像机 ,高清网络摄像机,网络视频监控
点赞  2012-5-10 20:53
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复