作者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