作者WolfLord (呆呆小狼)
看板ASM
标题Re: [问题] 8051 按钮控制问题
时间Fri Aug 23 21:59:48 2013
#define CRYSTALFREQ 12000000
#define INSFREQ (CRYSTALFREQ/12)
#define TIMERFREQ (CRYSTALFREQ/12)
#define _BASETICK 1000
#define __FREQBASE__ (65536-((TIMERFREQ/_BASETICK)-10))
#define __VTH (__FREQBASE__/256)
#define __VTL (__FREQBASE__%256)
#define intINT0 0
#define intT0 1
#define intINT1 2
#define intT1 3
#define intUART1 4
#define intUART 4
#define intINT2 6
sbit out=P0^0;
sbit Key1=P1^0;
sbit Key2=P2^1;
unsigned long acttimer;
unsigned char key1cnt;
unsigned char key2cnt;
bit hold;
bit vout;
void _T0ISR(void) interrupt intT0{
TR0=0;TH0=__VTH;TL0=__VTL;TR0=1;TF0=0;
if(acttimer>0){acttimer--;vout=1;} else {
vout=0;
}
out=~(vout|hold);//Inv Logic Fan Out
// out=vout|hold);//Fan Out
if((Key1==0)&&(key1cnt<250)){key1cnt++;}
if((Key2==0)&&(key2cnt<250)){key2cnt++;}
}
void main(void){
PCON|=0x80;TMOD=0x21;TCON=0;TH0=__VTH;TL0=__VTL;IE=0x82;TCON=0x50;
acttimer=0;key1cnt=0;key2cnt0=;hold=0;vout=0;
do{
if(Key1){
if(key1cnt>50){
if((acttimer>0)||hold){acttimer=0;hold=0;}else{
if((Key2==0)&&(key2cnt>20)){hold=1;}else{
acttimer=200;
}
}
}
key1cnt=0;
}
if(Key2){
// if(key2cnt>50){
// }
key2cnt=0;
}
}while(1);
}
※ 引述《victim0130 (Maxwell)》之铭言:
: 各位版大们好,小弟最近在自学8051,
: 有一些地方不太知道该怎麽写,
: 目前小弟想要做到的功能是:
: 有两个按键,按键1按下去後,输出1会ON(停滞200ms),
: 然後这时候侦测按键二是否有按下去,
: 如果按键二也按下去,则输出1会一直ON的状态,
: 假设按键二没按下去,则输出1就会off。
: 上面的功能都算是有写出来,
: 不过,小弟还差一个功能没写出来,
: 如果在输出1一直ON的状态的时候,按键1又按下去,
: 则输出1会变成off的状态,若此时再按按键1,
: 又会回复到上面的状态,侦测按键二是否有按下去,
: 若有则呈现on的状态,若没有则off。
--
~~於是,银河的历史又被海贼抹黑了好几百页。
- A23203 -
BM4GRM Harlock WolfLord
★ <<上站通知>> -- 我来啦!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.253.163.98
1F:推 victim0130:W大程式功力实在令人佩服...小弟还得思考个中逻辑 08/23 23:36
2F:→ victim0130:原本今天有用goto写出来,但goto似乎不要常用比较好!? 08/23 23:37
3F:→ ksmrt0123:真是恐怖的coding style... 面试八成被打枪吧 08/24 01:18
(自删破碎推文)还是不要用推的好了...
我讨厌卷页,相同区段功能的东西写一行也无损可读性。这篇我是故意不写注释的,
这样收码的人真的想懂才会读码。不读码就只能得到功能,老师一问必倒无疑。
To ksmrt:
1.自1995之後一向都是我面试别人....:P
2.我很喜欢大量使用Macro,这样移转硬体平台时比较好改。
3.我的CODEING STYLE是BASE ON 80COL/65LINE,用方格纸写作时代养成的,请多多包
涵(逃)
==
补充一下刚刚忘记贴上来的Base Define
※ 编辑: WolfLord 来自: 111.246.234.74 (08/24 01:51)
4F:→ victim0130:谢谢W大提供code...但的确要自己想过才会变成自己的! 08/24 02:14
5F:→ victim0130:另想请问那写法让我感觉像是PIC的语法!?(疑惑中) 08/24 02:15
6F:→ WolfLord:这不是PIC语法,这是ANSI C的STYTLE 08/24 02:27
7F:→ WolfLord:不过那个bit 跟 sbit是Keil独有的 08/24 02:28
8F:→ victim0130:了解!因为之前看蛮多PIC范例程式有用W大Stytle 08/24 02:32
9F:→ victim0130:原来是ANSI C...受教了!! bit & sbit部分是知道的 08/24 02:33
10F:→ victim0130:谢W大解惑... !! 08/24 02:33