A19VXZ{CWH4_VMIXP$U8AZJ.png (36.39 KB, 下載次數: 62)
下載附件
仿真
2020-5-17 17:41 上傳
單片機源程序如下:
- #include "reg51.h"
- #include "intrins.h"
- #define SEG7 P0
- #define Key P3
- unsigned char code DIG_CODE[17]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- void Delayms(unsigned int z);
- void Count(void);
- void DigtDisplay(void);
- void scan_key_f(void);
- void Scan_key_b(void);
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- unsigned char Num;
- unsigned char Digt[8];
- void main()
- {
- while(1)
- {
- scan_key_f();
- Count();
- DigtDisplay();
- }
- }
- /*計算各位數碼管顯示段碼*/
- void Count()
- {
- Digt[0]=DIG_CODE[Num/10000000];
- Digt[1]=DIG_CODE[Num%10000000/1000000];
- Digt[2]=DIG_CODE[Num%1000000/100000];
- Digt[3]=DIG_CODE[Num%100000/10000];
- Digt[4]=DIG_CODE[Num%10000/1000];
- Digt[5]=DIG_CODE[Num%1000/100];
- Digt[6]=DIG_CODE[Num%100/10];
- Digt[7]=DIG_CODE[Num%10];
- if(Num<10) Digt[0]=Digt[1]=Digt[2]=Digt[3]=Digt[4]=Digt[5]=Digt[6]=0x00; //消隱
- if(Num<100) Digt[0]=Digt[1]=Digt[2]=Digt[3]=Digt[4]=Digt[5]=0x00;
- if(Num<1000) Digt[0]=Digt[1]=Digt[2]=Digt[3]=Digt[4]=0x00;
- if(Num<10000) Digt[0]=Digt[1]=Digt[2]=Digt[3]=0x00;
- if(Num<100000) Digt[0]=Digt[1]=Digt[2]=0x00;
- if(Num<1000000) Digt[0]=Digt[1]=0x00;
- if(Num<10000000) Digt[0]=0x00;
-
- }
- void DigtDisplay()
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- switch(i)
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;
- case(1):
- LSA=1;LSB=0;LSC=0; break;
- case(2):
- LSA=0;LSB=1;LSC=0; break;
- case(3):
- LSA=1;LSB=1;LSC=0; break;
- case(4):
- LSA=0;LSB=0;LSC=1; break;
- case(5):
- LSA=1;LSB=0;LSC=1; break;
- case(6):
- LSA=0;LSB=1;LSC=1; break;
- case(7):
- LSA=1;LSB=1;LSC=1; break;
- }
- SEG7=Digt[i];
- Delayms(2);
- SEG7=0x00; //清顯示,消除重影
- }
- }
-
- ////反轉法 先列再行
- //void scan_key_f()
- //{
- // Key=0X0F; //0000 1111
- // if(Key!=0X0F)
- // {
- // Delayms(10);
- // if(Key!=0X0F)
- // {
- // Key=0XF0; //判斷列
- // switch(Key)
- // {
- // case 0xE0: Num=1;break;
- // case 0xD0: Num=2;break;
- // case 0xB0: Num=3;break;
- // case 0x70: Num=4;break; //0111
- // default: Num=0;break;
- // }
- // Key=0X0F; //判斷行
- // switch(Key)
- // {
- // case 0x07: Num=Num;break; //1 2 3 4
- // case 0x0B: Num=Num+4;break; //5 6 7 8
- // case 0x0D: Num=Num+8;break; //9 10 11 12
- // case 0x0E: Num=Num+12;break; //13 14 15 16
- // default: Num=0;break;
- // }
- // }
- // while(Key!=0X0F); //要和最后的Key值一樣
- // }
- //}
- //
- //反轉法 先行再列
- void scan_key_f()
- {
- Key=0X0F; //0000 1111
- if(Key!=0X0F)
- {
- Delayms(10);
- if(Key!=0X0F)
- {
-
- Key=0X0F; //判斷行
- switch(Key)
- {
- case 0x07: Num=1;break; //1 2 3 4
- case 0x0B: Num=2;break; //5 6 7 8
- case 0x0D: Num=3;break; //9 10 11 12
- case 0x0E: Num=4;break; //13 14 15 16
- default: Num=0;break;
- }
- }
- Key=0XF0; //判斷列
- switch(Key)
- {
- case 0xE0: Num=Num*4-3;break;
- case 0xD0: Num=Num*4-2;break;
- case 0xB0: Num=Num*4-1;break;
- case 0x70: Num=Num*4;break; //0111
- default: Num=0;break;
- }
-
- while(Key!=0XF0);
- }
- }
- //逐列掃描
- void Scan_key_b()
- {
- Key=0x0f; //無論怎么接線,先確定列線 將列線置為0 行線置為1
- if(Key!=0x0f)
- {
- Delayms(10);
- if(Key!=0x0f)
- {
- Key=0xef; //第一列
- if(Key!=0xef)
- {
- switch(Key)
- {
- case 0xe7:Num=1;while(Key==0xe7);break; //第一列第一行
- case 0xeb:Num=5;while(Key==0xeb);break; //第一列第二行
- case 0xed:Num=9;while(Key==0xed);break;
- case 0xee:Num=13;while(Key==0xee);break;
- default:Num=0;break;
- }
- }
- Key=0xdf; //第二列
- if(Key!=0xdf)
- {
- switch(Key)
- {
- case 0xd7:Num=2;while(Key==0xd7);break;
- case 0xdb:Num=6;while(Key==0xdb);break;
- case 0xdd:Num=10;while(Key==0xdd);break;
- case 0xde:Num=14;while(Key==0xde);break;
- default:Num=0;break;
- }
- }
- Key=0xbf; //第三列
- if(Key!=0xbf)
- {
- switch(Key)
- {
- case 0xb7:Num=3;while(Key==0xb7);break;
- case 0xbb:Num=7;while(Key==0xbb);break;
- case 0xbd:Num=11;while(Key==0xbd);break;
- case 0xbe:Num=15;while(Key==0xbe);break;
- default:Num=0;break;
- }
- }
- Key=0x7f; //第四列
- if(Key!=0x7f)
- {
- switch(Key)
- {
- case 0x77:Num=4;while(Key==0x77);break; //0111 0111
- case 0x7b:Num=8;while(Key==0x7b);break; //0111 1011
- case 0x7d:Num=12;while(Key==0x7d);break; //0111 1101
- case 0x7e:Num=16;while(Key==0x7e);break; //0111 1110
- default:Num=0;break;
- }
- }
-
- }
- }
- }
-
- void Delayms(unsigned int z) //@11.0592MHz
- {
- unsigned char i, j;
- for(;z>0;z--)
- {
- _nop_();
- i = 2;
- j = 199;
- do
- {
- while (--j);
- } while (--i);
- }
- }
復制代碼
所有資料51hei提供下載:
資料.rar
(71.86 KB, 下載次數: 52)
2020-5-17 17:41 上傳
點擊文件名下載附件
源程序和仿真 下載積分: 黑幣 -5
|