QDMLIT 发表于 2023-11-26 20:23 void display()//显示函数 { static uint i=0; if(++i>=400) { i=0; flashing=~flashing; } |
您好,在这个程序上改变LED闪烁时间怎么修改程序,如点亮2S,灭2秒,谢谢 |
朋友谢谢您的辛苦付出 |
tyrl800 发表于 2023-11-24 20:58 谢谢您辛苦付出 |
QDMLIT 发表于 2023-11-24 19:16
|
QDMLIT 发表于 2023-11-24 19:16 #include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit Key =P3^7; uchar cnt,flashcnt; sbit led1=P1^0; sbit led2=P1^1; bit bit_10ms=0,flag1,flag2; uchar bdata flag_key_byte=0xff; sbit keyflag=flag_key_byte^0; sbit keyflag1=flag_key_byte^1; /**********************************************************/ uchar keyscan(void) {uchar kv=0; keyflag1=keyflag; keyflag=Key; switch(flag_key_byte&0x03) { case 0:cnt++;break; case 2:cnt++;break; case 1:if(cnt>30)kv=2; else if(cnt>5)kv=1; else kv=0; cnt=0; flag_key_byte=0xff; break; } return kv; } /**********************************************************/ void main() { uchar kv=0; TH0=(65536-20000)/256; TL0=(65536-20000)%256; TMOD=0X01; ET0=EA=TR0=1; while(1) { if(bit_10ms) {kv=keyscan(); bit_10ms=0; if(kv==1) {flag1=!flag1;} if(kv==2) {flag2=!flag2;} if(!flag1) led1=1; if(!flag2) led2=1; flashcnt++; if(flashcnt==10) { flashcnt=0; if(flag1) led1=!led1; if(flag2) led2=!led2; } } } } /**********************************************************/ void DelayInt() interrupt 1 {TH0=(65536-20000)/256; TL0=(65536-20000)%256; bit_10ms=1; } /**********************************************************/ |
tyrl800 发表于 2023-11-24 15:47 您好,您的程序我仿真后是按键短按下LED1点亮,再短按LED1灭,LED1并没有闪烁,我这个实验是按键分别控制两个LED灯闪烁C程序,一个按键短按一下LED1灯闪亮,再短按一下LED1灭,长按一下LED2灯闪亮,再短按一下LED2灭,谢谢。 |
QDMLIT 发表于 2023-11-24 12:47 #include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit Key =P3^7; uchar cnt,kv; sbit led1=P1^0; sbit led2=P1^1; bit bit_10ms=0; uchar bdata flag_key_byte=0xff; sbit keyflag=flag_key_byte^0; sbit keyflag1=flag_key_byte^1; /**********************************************************/ void keyscan(void) { keyflag1=keyflag; keyflag=Key; switch(flag_key_byte&0x03) { case 0:cnt++;break; case 2:cnt++;break; case 1:if(cnt>30)kv=2; else if(cnt>5)kv=1; else kv=0; cnt=0; flag_key_byte=0xff; break; } } /**********************************************************/ void main() { TH0=(65536-20000)/256; TL0=(65536-20000)%256; TMOD=0X01; ET0=EA=TR0=1; while(1) { if(bit_10ms) {keyscan(); bit_10ms=0; } if(kv==1) {led1=!led1;kv=0;} if(kv==2) {led2=!led2;kv=0;} } } /**********************************************************/ void DelayInt() interrupt 1 {TH0=(65536-20000)/256; TL0=(65536-20000)%256; bit_10ms=1; } /**********************************************************/ |
tyrl800 发表于 2023-11-24 09:06 我是个小白,这个程序不完整,麻烦补充一下子呗,谢谢 |
man1234567 发表于 2023-11-24 10:18 3种结果,0,1,2;1短,2长,0 无 |
做出以下三个变量: 1、闪动变量FL:在定时器中断服务程序中,每0.4秒FL求反一次。 2、长按变量CA:界定出长按时,让CA =1。 3、短按变量DA:界定出短按时,让DA = !DA。 输出这样写就可以达成目的了: LED1 = DA * FL LED2 = CA * FL * DA |
tyrl800 发表于 2023-11-24 09:06 怎么看switch(flag_key_byte&0x03)只会出一个结果呢 |
先做出:弹动、长按、短按 的识别方法! 要点:做一个计数器CJ来判定弹动、长按与短按,CJ的规则如下: 1、CJ计数只发生于定时器的中断服务程序中,每次中断+1,计满不再计,即不回0。 2、CJ计数只发生于键按下的时候,未按下不计。 3、做一个键状态判定触发标记:B_OK,如果键未按下,但CJ<>0【弹起】,则置B_OK=1,表示是判断键状态的时候了。【弹起起效】 4、当B_OK=1,判断键状态的界定法则是:CJ<某个值为弹动;CJ<某个值为短按;CJ>某个值为长按,某个值是多少由你决定。建议事先将长短两个界定值放置在某个寄存器中,这样可以随意变更界定值。 5、状态界定完成后将:B_OK清0、CJ清0以备下次再界定。 |
如果LED1,2都亮的情况下再短按会如何? |
uchar bdata flag_key_byte=0xff; sbit keyflag=flag_key_byte^0; sbit keyflag1=flag_key_byte^1; /**********************************************************/ void keyscan(void) { keyflag1=keyflag; keyflag=Key; switch(flag_key_byte&0x03) { case 0:cnt++;break; case 2:cnt++;break; case 1:if(cnt>30)kv=2; else if(cnt>5)kv=1; else kv=0; cnt=0; flag_key_byte=0xff; break; } } /**********************************************************/ |
难倒了小白,我是没有时间写,你加上几个标志就可以把完整的程序流程写出来。 |