![]() |
發布時間: 2023-9-21 04:36
正文摘要://99分倒計時 #include"stc8.h" #include"intrins.h" #define uint unsigned int #define uchar unsigned char uchar A1,A2,count,sec ... |
wulin 發表于 2023-11-25 08:11 顯示正常了 |
hjx5548 發表于 2023-11-24 12:33 ![]() 你提供的兩個圖不一樣。如果按這個圖的接線,數碼管程序應該這樣寫 void time_display() { static uchar i=0; P1|=0xff; switch(i) { case 0: P2=table[min/10]; P1&=0xfe; break; case 1: P2=table[min%10]&0xfe;P1&=0xfd; break; case 2: P2=table[sec/10]; P1&=0xf7; break; case 3: P2=table[sec%10]; P1&=0xfb; break; } i=++i%4; } |
hjx5548 發表于 2023-11-24 21:26 檢查軟件端口定義與實際電路是否相符 ![]() |
wulin 發表于 2023-11-24 13:11 分鐘十位數不能顯示 |
這樣改 void time_display() { static uchar i=0; P1|=0xff; switch(i) { case 0: P2=table[min/10]; break; case 1: P2=table[min%10]&0xfe; break; case 2: P2=table[sec/10]; break; case 3: P2=table[sec%10]; break; } P1&=~(0x01<<i); i=++i%4; } |
數碼管顯示亂碼 |
這個代碼9999和8888交替顯示 |
lkc8210 發表于 2023-11-24 09:12 //99:59分倒計時 #include"stc8H.h" #include "intrins.h" #define uint unsigned int #define uchar unsigned char uchar count; char sec,min; bit flag,flag1,flag2,flag3; sbit time_ge = P1^3; sbit time_shi = P1^2; sbit time_bai = P1^1; sbit time_qian = P1^0; sbit temp_ge = P3^3; sbit temp_shi = P1^5; sbit temp_bai = P1^4; uchar code table[]={ 0x03,/*0*/ 0x9F,/*1*/ 0x25,/*2*/ 0x0D,/*3*/ 0x99,/*4*/ 0x49,/*5*/ 0x41,/*6*/ 0x1F,/*7*/ 0x01,/*8*/ 0x09,/*9*/}; void GPIO_init(); void T0_init() ; void time_display(); void time_daojishi(); void GPIO_init() { P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; } void T0_init() //5毫秒@11.0592MHz { AUXR &= 0x7F; //定時器時鐘12T模式 TMOD &= 0xF0; //設置定時器模式 TL0 = 0x00; //設置定時初始值 TH0 = 0xEE; //設置定時初始值 TF0 = 0; //清除TF0標志 TR0 = 1; //定時器0開始計時 ET0 = 1; //使能定時器0中斷 } void time_display() { static bit i=0; static uchar temp=0; P2=0xff; i=~i; if(++temp>=200)temp=0; if(i==1) { time_ge = 0; time_shi = 1; time_bai = 1; time_qian = 1; P2=table[min/10]; } else if(i==2) { time_ge = 1; time_shi = 0; time_bai = 1; time_qian = 1; if(temp<100) P2=table[min%10]&0xfe;//閃秒 else P2=table[min%10]; } else if(i==3) { time_ge = 1; time_shi = 1; time_bai = 0; time_qian = 1; if(temp<60) P2=table[sec/10]; } else if(i==4) { time_ge = 1; time_shi = 1; time_bai = 0; time_qian = 1; if(temp<60) P2=table[sec%10]&0xfe;//閃秒 else P2=table[min%10]; } } void main() { EA = 1; GPIO_init(); T0_init(); while(1) { if(flag) { flag=0; if(++count >= 200) {count = 0; sec--; if(sec < 0) { sec = 59; min--; if(min < 0) min=99; } } time_display(); } } } void TM0_Isr() interrupt 1 //5毫秒定時器0 { flag=1; } |
hjx5548 發表于 2023-11-23 22:09 ![]()
|
hjx5548 發表于 2023-11-23 22:09 為啥把顯示函數名改了? STC8的定時器模式0是16位自動重裝的 中斷函數里那兩句設置定時初始值可以不要 |
wulin 發表于 2023-9-21 11:35 參考你的代碼修改為四位倒計時(99:59倒計時),哪里不對?下面是代碼: //99:59分倒計時 #include"stc8H.h" #include "intrins.h" #define uint unsigned int #define uchar unsigned char uchar count; char sec,min; bit flag,flag1,flag2,flag3; sbit time_ge = P1^3; sbit time_shi = P1^2; sbit time_bai = P1^1; sbit time_qian = P1^0; sbit temp_ge = P3^3; sbit temp_shi = P1^5; sbit temp_bai = P1^4; uchar code table[]={ 0x03,/*0*/ 0x9F,/*1*/ 0x25,/*2*/ 0x0D,/*3*/ 0x99,/*4*/ 0x49,/*5*/ 0x41,/*6*/ 0x1F,/*7*/ 0x01,/*8*/ 0x09,/*9*/}; void GPIO_init(); void T0_init() ; void time_display(); void time_daojishi(); void GPIO_init() { P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; } void T0_init() //5毫秒@11.0592MHz { AUXR &= 0x7F; //定時器時鐘12T模式 TMOD &= 0xF0; //設置定時器模式 TL0 = 0x00; //設置定時初始值 TH0 = 0xEE; //設置定時初始值 TF0 = 0; //清除TF0標志 TR0 = 1; //定時器0開始計時 ET0 = 1; //使能定時器0中斷 } void time_display() { static bit i=0; static uchar temp=0; P2=0xff; i=~i; if(++temp>=200)temp=0; if(i==1) { time_ge = 0; time_shi = 1; time_bai = 1; time_qian = 1; P2=table[min/10]; } else if(i==2) { time_ge = 1; time_shi = 0; time_bai = 1; time_qian = 1; if(temp<100) P2=table[min%10]&0xfe;//閃秒 // else P2=table[min%10]; } else if(i==3) { time_ge = 1; time_shi = 1; time_bai = 0; time_qian = 1; if(temp<60) P2=table[sec/10]; } else if(i==4) { time_ge = 1; time_shi = 1; time_bai = 0; time_qian = 1; if(temp<60) P2=table[sec%10]&0xfe;//閃秒 else P2=table[min%10]; } } void main() { GPIO_init(); T0_init(); P2=table[8]; temp_ge = 0; temp_shi = 0; //temp_bai = 0; while(1) { if(flag) { flag=0; if(++count >= 200) { count = 0; sec--; if(sec < 0) { sec = 59; min--; if(min < 0) min=99; } } display(); } } } void TM0_Isr() interrupt 1 //5毫秒定時器0 { TL0 = 0x00; //設置定時初始值 TH0 = 0xEE; //設置定時初始值 flag=1; } |
wulin 發表于 2023-9-21 11:35 測試了你的代碼,應該是9分鐘倒計時,怎么改為99分鐘倒計時。 |
hjx5548 發表于 2023-9-21 12:33 你if后面括號里是賦值不是比較啊, ![]() |
man1234567 發表于 2023-9-21 09:12 void TM0_Isr() interrupt 1 { // TL0 = 0x66; //65536-11.0592M/12/1000 // TH0 = 0xfc; //設置定時初始值 count--; } 屏蔽了也不行 |
hcfat51h 發表于 2023-9-21 09:23 中斷計數到了一秒,秒繼續計數到一分鐘啊。怎樣修改? |
man1234567 發表于 2023-9-21 09:12 應該怎樣修改 |
joyb 發表于 2023-9-21 09:57 TL0 = 0x66; //65536-11.0592M/12/1000 TH0 = 0xfc; 這樣設置也不行啊 |
問題比較多,給你改了。
|
設置定時初始值50us count = 20; 50us×20=1000us=1ms TL0 = 0x00; //設置定時初始值5ms TH0 = 0x28; //設置定時初始值 |
if(count = 0) ![]() |
每次進中斷都會進行初始化 ![]() |