|
- //问题描述:当显示到P2.2位时,P2.7也会显示
- #include<reg51.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- uint Count;
- uint Set_Count;
- uchar code ledcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共阴数码管编码0-9
- uchar data Ledbuff[8]={1};//显示缓冲区
- void delayms(uint ms)
- {
- uchar k;
- while(ms--)
- {
- for(k = 0; k < 120; k++);
- }
- }
- void display() //显示程序display(uchar a,b,c,d,e) char i;
- {
- static unsigned char i = 0;
- Ledbuff[0]=Set_Count%10; //提取设定个位编码
- Ledbuff[1]=Set_Count%100/10; //提取设定十位编码
- Ledbuff[2]=Set_Count/100%10; //提取设定百位编码
- Ledbuff[3]=Set_Count/1000; //提取设定千位编码 这里解码错误P2.2计数百位通的时候同时亮了
- Ledbuff[4]=Count%10; //P2.0提取计数个位编码
- Ledbuff[5]=Count%100/10; //P2.1提取计数十位编码
- Ledbuff[6]=Count/100%10;//%1000/100 P2.2提取计数百位,这里
- Ledbuff[7]=Count/1000;
- for(i=0;i<8;i++)
- {
- switch(i) //使用多分支选择语句 i=count display 0x代表16进制
- {
-
- // 位P2.4=1 段=字码表 位选缓冲 设定值求余[((SD_count%1000)%100 )/ 10]]
- case(0):P2=0xef;P0=ledcode[Ledbuff[0]];break;//显示第一个个位共阴P2.4=ef=1110 1111 共阳P2.4=10=1 0000
- case(1):P2=0Xdf;P0=ledcode[Ledbuff[1]];break;//显示第二个十位P2.5=0xDF=1101 1111 20=0010 0000
- case(2):P2=0Xbf;P0=ledcode[Ledbuff[2]];break;//P2.6=0xbf=1011 1111 40=100 0000
- case(3):P2=0X7f;P0=ledcode[Ledbuff[3]];break;//显示千位共阴P2.7=0x7f=0111 1111 0x80=1000 0000
-
- case(4):P2=0Xfe;P0=ledcode[Ledbuff[4]];break;//显示第一个个位共阴P2.0=fe=1111 1110 共阳P2.0=1=0000 0001
- case(5):P2=0Xfd;P0=ledcode[Ledbuff[5]];break;//显示第二个十位P2.1=0xfd=1111 1101 2=0000 0010
-
- case(6):P2=0x7b;P0=ledcode[Ledbuff[6]];break;//P2.2=0x7b=1111 1011 4=0000 0100这里影响3
-
- case(7):P2=0xf7;P0=ledcode[Ledbuff[7]];break; //P2.3=0xf7=1111 0111 0x8=0000 1000
- default: break;
-
- }
- // P0=ledcode[Ledbuff[i]];
- delayms(1); //显示2MS
- P0=0x00; //消影0xff;共阳位选高电平,段选全部高电平
- }
- }
- void main()
- {
- Set_Count=5678;
- Count=1234; //Count
- while(1)
-
- display();
-
- }
复制代码 |
|