wulin 发表于 2024-1-29 08:19 t=++t%10; 这句的意义是什么?0-10循环么?那不建议这么写啊,取模计算速度有点慢。不如用三目运算符了或者if了。 t=(++t >= 10) ? 0 : t; |
hjx5548 发表于 2024-1-29 00:09 由于数据类型不同,CPU处理速度也不同,同一个函数,在不同的运行环境,也会产生不同效果。将数码管扫描放在定时器中断中运行。
|
wulin 发表于 2024-1-26 21:21 这样修改了数码管显示不均匀 |
hjx5548 发表于 2024-1-24 10:05 void Write(unsigned int i) { w1=i&0x01;i>>=1; w2=i&0x01;i>>=1; w3=i&0x01;i>>=1; w4=i&0x01;i>>=1; w5=i&0x01;i>>=1; w6=i&0x01;i>>=1; w7=i&0x01;i>>=1; w8=i&0x01;i>>=1; w9=i&0x01;i>>=1; w10=i&0x01; } void Led_Seg() //显示函数 { static unsigned int i; P2=0xff; Write(~(0x01<<i)); P2=a[i ]; i=++i%10; } 注意数据类型 |
wulin 发表于 2024-1-23 22:05 #ifndef __KEY_H__ #define __KEY__ #include "STC8H.h" sbit k1 = P3^6 ; sbit k2 = P3^7 ; sbit k3 = P0^3 ; sbit k4 = P5^4 ; extern unsigned int Temp_Off,Temp_On; #define KEY_DELAY_TIME 50 void Key_Service(); extern unsigned int Temp_Off,Temp_On; #endif #include "key.h" unsigned int Temp_Off = 25,Temp_On =12; unsigned char key1_lock_flag; unsigned char key1_cnt; //按键蜂鸣器响 时长 unsigned char key2_lock_flag; unsigned char key2_cnt; //按键蜂鸣器响 时长 unsigned char key3_lock_flag; unsigned char key3_cnt; //按键蜂鸣器响 时长 unsigned char key4_lock_flag; unsigned char key4_cnt; //按键蜂鸣器响 时长 unsigned char keyscan() { unsigned char KeyNum = 0 ; if (k1) //如果没有按下 { key1_lock_flag = 0; //清零自锁标志 key1_cnt = 0 ; //累计循环次数,也是消抖时间 } else if(!key1_lock_flag) { key1_cnt ++ ; if(key1_cnt > KEY_DELAY_TIME) { key1_cnt = 0; //清零 key1_lock_flag = 1 ; //自锁标记,防止按键多次触发 KeyNum = 1 ; //赋键值编码 } } if (k2) //如果没有按下 { key2_lock_flag = 0; //清零自锁标志 key2_cnt = 0 ; //累计循环次数,也是消抖时间 } else if(!key1_lock_flag) { key2_cnt ++ ; if(key2_cnt > KEY_DELAY_TIME) { key2_cnt = 0; //清零 key2_lock_flag = 1 ; //自锁标记,防止按键多次触发 KeyNum = 2 ; //赋键值编码 } } if (k3) //如果没有按下 { key3_lock_flag = 0; //清零自锁标志 key3_cnt = 0 ; //累计循环次数,也是消抖时间 } else if(!key3_lock_flag) { key3_cnt ++ ; if(key1_cnt > KEY_DELAY_TIME) { key3_cnt = 0; //清零 key3_lock_flag = 1 ; //自锁标记,防止按键多次触发 KeyNum = 3 ; //赋键值编码 } } if (k4) //如果没有按下 { key4_lock_flag = 0; //清零自锁标志 key4_cnt = 0 ; //累计循环次数,也是消抖时间 } else if(!key4_lock_flag) { key4_cnt ++ ; if(key4_cnt > KEY_DELAY_TIME) { key4_cnt = 0; //清零 key4_lock_flag = 1 ; //自锁标记,防止按键多次触发 KeyNum = 4 ; //赋键值编码 } } return KeyNum; } void Key_Service() { unsigned char a; a = keyscan() ; switch(a) { case0: break; case1: Temp_Off = 0; Temp_Off++;if (Temp_Off>150) Temp_Off=150;break; case2: Temp_Off = 0; Temp_Off--;if (Temp_Off<0) Temp_Off=0;break; case3: Temp_On = 0; Temp_On++;break; case4: Temp_On = 0; Temp_On--;break; default: break; } } 你的可以的,我这样数码管为什么就不能工作? |
lkc8210 发表于 2024-1-23 17:33 消隐问题 |
lkc8210 发表于 2024-1-23 17:33 每组数码管需要消隐 |
wulin 发表于 2024-1-23 22:05 谢谢,这个程序在板子上能实现功能了,如果我要增加四个数码管应该这样修改。增加的数码管段码还是P2,位码分别为P10-P13. |
hjx5548 发表于 2024-1-23 23:10 中断里不要用延时! 中断里不要用延时! 中断里不要用延时! |
zhuls 发表于 2024-1-23 16:53 现在主要是按键控制问题了,数码管问题解决了。 |
hjx5548 发表于 2024-1-23 12:47 不要把简单的事情复杂化。给你改了。仿真没有问题。
|
newlined 发表于 2024-1-23 12:01 硬件没有问题的,P2直接驱动是根据stc实验箱电路做的,已经点亮数码管了 |
不说一下数码管程序显示亮度不一致原因是什么吗? |
感觉流程有点问题: void TM1_Isr0()interrupt 1 //数码管扫描定时器0 { 。。。 Led_Seg(Num); //15ms+ P00=1; Led_Seg1(Num1);//15ms+ 。。。 } 中断才1ms,进入后要呆满30ms+...去北京开会,顺便去芬兰泡个桑拿。。 ================= 这个测试过的,OK,定时、动扫、6位、共阴数码管。 每进一次中断只显示一位。 你参考一下。 void timer1() interrupt 3 { char temp; dis_dig++; dis_dig %= 6; //6位数码管 led_bus = 0x00; //消隐@共阴 temp = 0xfe; led_com =_crol_(temp,dis_dig); //位选 led_bus = dis_buf[dis_dig]; //段码 } |
这个四个按键分别控制两组三位数码管加减的程序,没有人能解决啊! |
P2口应该是驱动数码管的,如果是直接接的话,不一定能驱动,是不是要加三极管?再就是您可以加一个小的发光二极管,当检测到按键按下的,可以用另一个IO口,点亮这个二极管,先看看程序和硬件能不能检测到按键按下,一步一步的来。 |