|
程序可以了,但是有中斷會(huì)觸發(fā)很多次甚至是十幾次,請(qǐng)問(wèn)要怎么用定時(shí)器消抖動(dòng)呢,不用軟件延時(shí),我寫的定時(shí)器好像不起作用。程序如下:
- #include<reg52.h>
- //#include <STC8G.h>
- #include <intrins.h>
- #define u8 unsigned char
- #define u16 unsigned int
- unsigned char flagkey =0;
- sbit DIO = P1^1;
- sbit CLK = P1^2;
- sbit p00 = P0^0;
- //u8 num[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7f,0x6F};
- u8 num[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFf,0xEF};
- u16 ms,second,min,hour;
- u16 dingshinum;
- void Delay2us() //@12.01MHz
- {
- unsigned char i;
- i = 6;
- while (--i);
- }
- void Delay3us() //@12MHz
- {
- unsigned char i;
- i = 10;
- while (--i);
- }
- void Delay5us() //@12MHz
- {
- unsigned char i;
- i = 18;
- while (--i);
- }
- void I2CStart()
- {
- CLK = 1;
- DIO = 1;
- Delay2us();
- DIO = 0;
- }
- void I2CAsk()
- {
- CLK = 0;
- Delay5us();
- while(DIO);
- CLK = 1;
- Delay2us();
- CLK = 0;
- }
- void I2CStop()
- {
- CLK = 0;
- Delay2us();
- DIO = 0;
- Delay2us();
- CLK = 1;
- Delay2us();
- DIO = 1;
- }
- void I2CWriteByte(u8 dat)
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- CLK = 0;
- if(dat&0x01)
- {
- DIO = 1;
- }
- else
- {
- DIO = 0;
- }
- Delay3us();
- dat>>=1;
- CLK = 1;
- Delay3us();
- }
- }
- void Display(u8 m,u8 s)
- {
- I2CStart(); //1637 開(kāi)始
- I2CWriteByte(0x40);
- I2CAsk();
- I2CStop();
- I2CStart();
- I2CWriteByte(0xC0); //設(shè)置顯示首地址即第一個(gè)LED
- I2CAsk();
- I2CWriteByte(num[m/10]);
- I2CAsk();
- I2CWriteByte(num[m%10]);
- I2CAsk();
- I2CWriteByte(num[s/10]);
- I2CAsk();
- I2CWriteByte(num[s%10]);
- I2CAsk();
- I2CWriteByte(0xFF);
- I2CAsk();
- I2CWriteByte(0xFF);
- I2CAsk();
- I2CStop();
- I2CStart();
- I2CWriteByte(0x8F);
- I2CAsk();
- I2CStop();
- }
- void main()
- {
- p00 = 1;
- P1=0x55; //P1口初始值
- EA=1; //全局中斷開(kāi)
- EX0=1; //外部中斷0開(kāi)
- IT0=1; //邊沿觸發(fā)
-
-
- while(1)
- {
- Display(min,second);
- }
- }
- /*------------定時(shí)器----------------*/
- void Timer0Init(void) //5毫秒@12.01MHz
- {
- TMOD = 0x01; // 設(shè)置定時(shí)器0為模式1
- TH0 = 0x0EC; // 設(shè)置定時(shí)器0的初始值,用于產(chǎn)生10ms的定時(shí)中斷
- TL0 = 0x78;
- EA = 1; // 允許中斷
- ET0 = 1; // 允許定時(shí)器0中斷
- TR0 = 1; // 啟動(dòng)定時(shí)器0
- }
- /*------------外部中斷程序----------------*/
- void ISR_Key(void) interrupt 0 using 1 {
- if(flagkey==1){
- Timer0Init();
- p00 = ~p00;
- second++;
- if(second==60){
- second=0;
- min++;
- if(min==60)
- {
- min=0;
- hour++;
- if(hour==24)
- {
- hour=0;
- }
- }
-
- }
- }
-
- }
- /*------------定時(shí)器中斷子程序----------------*/
- void Timer0_isr(void) interrupt 1 using 1
- {
- TH0=0x0EC; //重新賦值
- TL0=0x78;
- dingshinum++;
- if(dingshinum<100){
- flagkey = 0;
- }else{
- flagkey = 0;
- dingshinum = 1;
- }
- }
復(fù)制代碼 |
|