|
个人网上查找资料,然后自己修改总结的。希望对那些需要的人有所帮助。
数码管校准时闪烁案例——附带proteus仿真
数码管校准时闪烁案例——附带proteus仿真.rar
(118.05 KB, 下载次数: 25)
- /**************************************************************
- C51四位数码管动态扫描让其中一位闪烁
- 阅读人数:1306人 页数:9页 价值:1下载券 tj3188
- 思路说明:将显示程序放入定时器中断,设定一闪烁标志位。
- 定时时间为2MS,定时时间到则将标志位取反,同时也可以将按
- 键扫描程序放入该定时器,则在视觉上可以看到要求位的闪烁。
- P0段选
- P1位选
- 按键P3^2控制闪烁与否;
- 4*4键盘最后一行 控制哪一位闪
- 前三行控制显示哪个数字
- 前两位数码管控制显示 01~12 后两位数码管显示第几行第几列
- ***************************************************************/
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//duan
- uchar dbuf[4]; //wei
- uchar outnum,cnt;
- bit flashflag=0;
- uchar flashbit=0;
- sbit key1=P3^2;
- void setint()
- {
- TMOD=0X01;
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- void delayus(uint z)
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void display()
- {
- if(flashflag==1&&flashbit==1)
- {
- P0=0xff;
- }
- else
- {
- P0=num[dbuf[0]];
- }
- P1=0x01;
- delayus(20);
- P1=0x00;
- if(flashflag==1&&flashbit==2)
- {
- P0=0xff;
- }
- else
- {
- P0=num[dbuf[1]];
- }
- P1=0x02;
- delayus(20);
- P1=0x00;
- if(flashflag==1&&flashbit==3)
- {
- P0=0xff;
- }
- else
- {
- P0=num[dbuf[2]];
- }
- P1=0x04;
- delayus(20);
- P1=0x00;
- if(flashflag==1&&flashbit==4)
- {
- P0=0xff;
- }
- else
- {
- P0=num[dbuf[3]];
- }
- P1=0x08;
- delayus(20);
- P1=0x00;
- }
- void keynum()
- {
- uchar temp;
- P2=0x0f;
- if(P2!=0x0f)
- {
- delayus(10);
- if(P2!=0x0f)
- {
- P2=0xf7;
- delayus(10);
- temp=P2;
- switch(temp)
- {
- case 0xe7:flashbit=1;break;
- case 0xd7:flashbit=2;break;
- case 0xb7:flashbit=3;break;
- case 0x77:flashbit=4;break;
- } //控至哪一位闪烁
- P2=0xfe;
- delayus(10);
- temp=P2;
- switch(temp)
- {
- case 0xee:outnum=1;break;
- case 0xde:outnum=2;break;
- case 0xbe:outnum=3;break;
- case 0x7e:outnum=4;break;
- }
- P2=0xfd;
- delayus(10);
- temp=P2;
- switch(temp)
- {
- case 0xed:outnum=5;break;
- case 0xdd:outnum=6;break;
- case 0xbd:outnum=7;break;
- case 0x7d:outnum=8;break;
- }
- P2=0xfb;
- delayus(10);
- temp=P2;
- switch(temp)
- {
- case 0xeb:outnum=9;break;
- case 0xdb:outnum=10;break;
- case 0xbb:outnum=11;break;
- case 0x7b:outnum=12;break;
- }
- }
- }
- if(!key1)
- {
- delayus(10);
- if(!key1)
- {
- //outnum=5;
- flashbit=0;
- while(!key1);
- //delayus(10);
- }
- }
- }
- void main()
- {
- setint();
- while(1)
- {
- dbuf[0]=outnum/10;
- dbuf[1]=outnum%10;
- if(!outnum)
- dbuf[2]=0;
- if(outnum>0&&outnum<5)
- {
- dbuf[2]=1;
- dbuf[3]=outnum%5;
- }
- else if(outnum>4&&outnum<9)
- {
- dbuf[2]=2;
- dbuf[3]=(outnum-4)%5;
- }
- else if(outnum>8)
- {
- dbuf[2]=3;
- dbuf[3]=(outnum-8)%5;
- }
- keynum();
- display();
- }
- }
- void timer1() interrupt 1
- {
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
- cnt++;
- if(cnt==30)
- {
- cnt=0;
- flashflag=~flashflag;
- }
- }
复制代码 |
评分
-
查看全部评分
|