单片机独立按键控制LED数码管显示数字及左移
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
proteus仿真
单片机源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- disp_DK[]= {0xc0,0xf9,0xa4,0xb0,0x99,
- 0x92,0x82,0xf8,0x80,0x90,0xbf};
- uchar find[]={0,0,0,0};
- void Delay_ms(uint xms)
- {
- uchar t;
- while (xms--)
- for(t=0;t<120;t++);
- }
- uchar keychuli()
- {
- uchar key;
- P1=0xff;
- key=P1;
- key=~key;
- key=key&0xff;
- return key;
- }
- uchar keyscan()
- {
- uchar keys,keyzhi;
- keys= keychuli();
- if(keys!=0)
- {Delay_ms(1);
- Delay_ms(1);
- keys=keychuli();
- if(keys!=0)
- {
- keyzhi=keys;
- while(keys!=0)
- {
- Delay_ms(1) ;
- keys=keychuli();
- }
- }
- }
- else keyzhi=0;
- return keyzhi;
- }
-
- void display()
- {
- uchar i, k, aa=0x08;
- for(i=0;i<4;i++)
- {
- P2=aa;
- k=find[i];
- P0=disp_DK[k];
- aa=_cror_(aa,1) ;
- Delay_ms(1);
- P0=0xff;
- }
- }
- void dischuli()
- {
- find[3]=find[2];
- find[2]=find[1];
- find[1]=find[0];
- }
- void keyaa()
- {
- find[0]=1;
- }
- void keybb()
- {
- find[0]=2;
- }
- void keycc()
- {
- find[0]=3;
- }
- void keydd()
- {
- find[0]=4;
- }
- void keyee()
- {
- find[0]=5;
- }
- void keyff()
- {
- find[0]=6;
- }
- void keygg()
- {
- find[0]=7;
- }
- void keyhh()
- {
- find[0]=8;
- }
- void main(void)
- { uchar keys;
- while(1)
- {
- display();
- keys=keyscan();
- if (keys!=0) {dischuli();}
- switch(keys)
- {case 0x00:break;
- case 0x01:keyaa();break;
- case 0x02:keybb();break;
- case 0x04:keycc();break;
- case 0x08:keydd();break;
- case 0x10:keyee();break;
- case 0x20:keyff();break;
- case 0x40:keygg();break;
- case 0x80:keyhh();break;
- default:break;
- }
- }
- }
复制代码
Keil代码与Proteus仿真下载:
LED数码管显示.zip
(91.66 KB, 下载次数: 29)
|