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) ![]() |
每次进中断都会进行初始化 ![]() |