打印

帮帮忙!!!!

[复制链接]
2269|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zl040901|  楼主 | 2008-5-26 12:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <stdio.h>
#include <absacc.h>
#include <./Atmel/at89x52.h>
extern void start_t2imer(void);
unsigned char scankey;
bit Timerout=0;
bit keypress;
#define KR0    P1_0
#define KR1    P1_1
#define KR2    P1_2
#define KR3    P1_3
#define KC0    P1_4
#define KC1    P1_5
#define KC2    P1_6
#define KC3    P1_7
#define KBD_PORT  P1
#define FSM_INIT    0X00
#define FSM_WAIT_PRESS  0X01
#define FSM_VERFY1      0X02
#define FSM_VERFY2      0X03
#define FSM_WAIT_RELESE 0X04
#define KBD_VAL_VAILD   0X80
main(){
    unsigned char fsm_key=0;
    unsigned char kbd_col;
    unsigned char kbd_row;
    unsigned char key_val;
    IE=0X40;
    start_t2imer();
    EA=1;       /* Enable interrupts */
    while(1){         /*10ms扫描一次键盘程序*/
        if(Timerout){
            Timerout=0;
            switch(fsm_key){
                case FSM_INIT:      /*初始扫秒状态*/
                    KR0=1;
                    KR1=1;
                    KR2=1;
                    KR3=1;
                    fsm_key=FSM_WAIT_PRESS;
                    break;
                case FSM_WAIT_PRESS:
                    if(keypress){
                        key_val=0;     /清除以前的键值/
                        if(KC0){
                            KC0=1;
                            kbd_col=1;
                        }
                        else if(KC1){
                            KC1=1;
                            kbd_col=2;
                        }   
                        else if(KC2){
                            KC2=1;
                            kbd_col=3;
                        }
                        else if(KC3){
                            KC3=1;
                            kbd_col=4;
                        }
                        else{             /*干挠信号的话就重回初始扫描状态*/
                            fsm_key=FSM_INIT;
                        }

                        kbd_row =KBD_PORT;
                        kbd_row >>=4;
                        if(kbd_row){
                            if(KR0){
                                kbd_row=0;
                                fsm_key=FSM_VERFY1;     /*转去抖动*/
                            }
                            else if(KR1){
                                kbd_row=4;
                                fsm_key=FSM_VERFY1;
                            }
                            else if(KR2){
                                kbd_row=8;
                                fsm_key=FSM_VERFY1;
                            }
                            else if(KR3){
                                kbd_row=12;
                                fsm_key=FSM_VERFY1;
                            }
                            else{
                                fsm_key=FSM_INIT;
                            }
                        }
                        else{
                            fsm_key=FSM_INIT;
                        }
                    }
                    break;
                case FSM_VERFY1:               /*去抖动*/
                    switch(kbd_row){
                        case 0:
                            if(KR0)    fsm_key=FSM_VERFY2;
                            else fsm_key=FSM_INIT;
                            break;
                        case 4:
                            if(KR1)    fsm_key=FSM_VERFY2;
                            else fsm_key=FSM_INIT;
                            break;
                        case 8:
                            if(KR2)    fsm_key=FSM_VERFY2;
                            else fsm_key=FSM_INIT;
                            break;
                        case 12:
                            if(KR3)    fsm_key=FSM_VERFY2;
                            else fsm_key=FSM_INIT;
                            break;
                        default:
                            fsm_key=FSM_INIT;
                            break;
                    }
                    break;
                case FSM_VERFY2:           /*去抖动计算键值*/
                    switch(kbd_row){
                        case 0:
                            if(KR0)    key_val=(kbd_row+kbd_col)|KBD_VAL_VAILD;
                            break;
                        case 4:
                            if(KR1)    key_val=(kbd_row+kbd_col)|KBD_VAL_VAILD;
                            break;
                        case 8:
                            if(KR2)    key_val=(kbd_row+kbd_col)|KBD_VAL_VAILD;
                            break;
                        case 12:
                            if(KR3)    key_val=(kbd_row+kbd_col)|KBD_VAL_VAILD;
                            break;
                        default:                            
                            break;
                    }
                    KR0=1;
                    KR1=1;
                    KR2=1;
                    KR3=1;
                    fsm_key=FSM_WAIT_RELESE;
                    break;
                case FSM_WAIT_RELESE:    /*键盘释放*/
                    if(!keypress){
                        fsm_key=FSM_INIT;
                    }
                    break;
                default:
                    fsm_key=FSM_INIT;
                    break;
            }
        }
    }
}
void time2()interrupt 5 {//base 10 ms
    TF2=0;
    Timerout=1;
    scankey=KBD_PORT;
    if(scankey&0x0f){
        keypress=1;    
    }
    else{
        keypress=0;
    }

}
帮我解释一下程序,尤其始那个键值的计算不懂


相关帖子

沙发
wxj1952| | 2008-5-26 13:18 | 只看该作者

扫描个键盘要那么复杂吗?

“把简单的事情变复杂是很容易的,但是如果能把复杂的事情简单化,甚至到十分简单,那就是创新。”

偶然从书上看来一个4X4键盘扫描程序,一共10几条语句,顿觉服气。可惜,这本书是英国人写的。

从自己人写的书上看到过不下5、6种不同类型(抄袭别人的不算)的4X4键盘扫描程序,大多艰涩难懂,为什么作者就想不到化简方法?缺乏创新思维?

使用特权

评论回复
板凳
aibxyz| | 2008-5-26 13:54 | 只看该作者

多看一下就明白了

我们除了要会写程序
还要会读。。。。

使用特权

评论回复
地板
ayb_ice| | 2008-5-26 14:55 | 只看该作者

4X4用反转法扫描是只要几句话

使用特权

评论回复
5
grady1125| | 2008-5-26 20:55 | 只看该作者

世界上

最大最难看懂的键盘程序

使用特权

评论回复
6
wxj1952| | 2008-5-26 21:35 | 只看该作者

由此联想到的中西方对比。

这边:人人平等,按劳分配。谁都工作8小时,因此分配同酬。没有人才之分。没有谁比谁做的好之分,大家平庸。(都好。)

那边:谁做得好让谁来做。人才竞争。做的不好的人吃劳保,由做得好的人养活。两得其美。

结果,这样的键盘程序设计还很得意,好像还是“状态机”?嵌入到产品中照样卖。
结果,一边是由做得最好的人在工作,做出的都是名牌一流。另一边只是平庸的人在工作,作出的是什么,自己明白。关键是平庸的人怎么会赶超一流?关系弄倒了。

什么时候我们也实行:如果做不到最好,就把位置让给做得好的人。就有资格与人竞争了。

使用特权

评论回复
7
HELLO_LEI| | 2008-5-26 21:49 | 只看该作者

哇塞,,莫非有什么更高深的东西在里面??/怎么搞的这么

使用特权

评论回复
8
xhtxzxw| | 2008-5-26 23:20 | 只看该作者

嘿嘿

如果正规的4X4键盘扫描程序是一条裤衩的话,LZ提供的码子就=缅裆裤+马褂+棉裤+皮袍+狗皮帽,反正裤衩是看不见了(如果有的话)。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

61

帖子

0

粉丝