STC15W402AS可以設置為推挽模式用于位碼輸出端口,不需要加三極管放大。段碼端口到數碼管間一定要加8個1K左右限流電阻,以免燒端口。這個代碼是按STC15寫的,仿真用的是8051,兩者管腳不同。按鍵可以短按+長按連+,并有閃秒。
無標題.jpg (179.1 KB, 下載次數: 31)
下載附件
2019-12-14 19:36 上傳
- //適用于STC15系列
- #include <STC15F2K60S2.H>
- //#include "STC15.h"
- #define uint unsigned int
- #define uchar unsigned char
- sbit key1 =P3^0;
- sbit key2 =P3^1;
- sbit seg1 =P5^4;
- sbit seg2 =P3^3;
- sbit seg3 =P3^7;
- sbit seg4 =P5^5;
- sbit a=P1^1;
- sbit b=P3^6;
- sbit c=P1^4;
- sbit d=P1^3;
- sbit e=P1^2;
- sbit f=P1^0;
- sbit g=P1^5;
- sbit h=P3^2;
- //順序共陽極數碼管段碼表
- unsigned char code table[]={//共陽數碼管段碼"0~f-."
- 0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
- uchar hour=12,min=0,sec=0;
- uchar tcnt;
- bit flag;
- void delayms(uint k)//1T
- {
- uint i,j;
- for(i=k;i>0;i--)
- for(j=1250;j>0;j--);//1T
- }
- /*
- void InitTimer0() //50毫秒@11.0592MHz
- {
- AUXR &= 0x7F; //定時器時鐘12T模式
- TMOD &= 0xF0; //設置定時器模式
- TL0 = 0x00; //設置定時初值
- TH0 = 0x4C; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- EA = 1;
- ET0 = 1;
- }*/
- void InitTimer0()//50毫秒@12.000MHz
- {
- AUXR &= 0x7F; //定時器時鐘12T模式
- TMOD &= 0xF0; //設置定時器模式
- TL0 = 0xB0; //設置定時初值
- TH0 = 0x3C; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- EA = 1;
- ET0 = 1;
- }
- void keyscan()
- {
- static uchar count1,count2;
- if(!key1)
- {
- if(++count1>=100)
- {
- count1=0;
- hour++;
- if(hour>=24)
- hour=0;
- }
- }
- else count1=0;
- if(!key2)
- {
- if(++count2>=100)
- {
- count2=0;
- min++;
- tcnt=0;
- sec=0;
- if(min>=60)
- min=0;
- }
- }
- else count2=0;
- }
- void displayHH(uchar i)
- {
- a=i&0x01;i>>=1;
- b=i&0x01;i>>=1;
- c=i&0x01;i>>=1;
- d=i&0x01;i>>=1;
- e=i&0x01;i>>=1;
- f=i&0x01;i>>=1;
- g=i&0x01;i>>=1;
- h=i&0x01;
- }
- /*
- void displayHH(uchar q)
- {
- switch(q)
- {
- case 0:a=b=c=d=e=f=0;g=h=1;break;
- case 1:b=c=0;a=d=e=f=g=h=1;break;
- case 2:a=b=d=e=g=0;c=f=h=1;break;
- case 3:a=b=c=d=g=0;e=f=h=1;break;
- case 4:b=c=f=g=0;a=d=e=h=1;break;
- case 5:a=c=d=f=g=0;b=e=h=1;break;
- case 6:a=c=d=e=f=g=0;b=h=1;break;
- case 7:a=b=c=0;d=e=f=g=h=1;break;
- case 8:a=b=c=d=e=f=g=0;h=1;break;
- case 9:a=b=c=d=f=g=0;e=h=1;break;
- }
- }*/
- void display()
- {
- static uchar i=0;
- seg1=seg2=seg3=seg4=0;//消隱
- switch(i)
- {
- case 0: displayHH(table[hour/10]);seg1=1;seg2=0;seg3=0;seg4=0;break;
- case 1: if(flag==1)
- displayHH(table[hour%10]&0x7f);//加點
- else displayHH(table[hour%10]);//不加點
- seg1=0;seg2=1;seg3=0;seg4=0;break;
- case 2: displayHH(table[min/10]) ;seg1=0;seg2=0;seg3=1;seg4=0;break;
- case 3: displayHH(table[min%10]) ;seg1=0;seg2=0;seg3=0;seg4=1;break;
- }
- delayms(2);
- i++;
- i%=4;
- }
- void main(void)
- {
- P3M1 = 0x00; //P3.3/P3.7 推挽:0000 0000
- P3M0 = 0x88; //P3.3/P3.7 推挽:1000 1000
- P5M1 = 0x00; //P5.4/P5.5 推挽:0000 0000
- P5M0 = 0x30; //P5.4/P5.5 推挽:0011 0000
- InitTimer0();
- while (1)
- {
- keyscan();
- display();
- }
- }
- void Timer0Interrupt(void) interrupt 1
- {
- tcnt++;
- if(tcnt<10)
- flag=1;
- else flag=0;
- if(tcnt>=20)
- {
- tcnt=0;
- sec++;
- if(sec>=60)
- {
- sec=0;
- min++;
- if(min>=60)
- {
- min=0;
- hour++;
- if(hour>=24)
- hour=0;
- }
- }
- }
- }
復制代碼
|