新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)長(zhǎng)按鍵測(cè)試程序

        51單片機(jī)長(zhǎng)按鍵測(cè)試程序

        作者: 時(shí)間:2016-11-18 來(lái)源:網(wǎng)絡(luò) 收藏
        #include
        #include
        /*
        程序功能: 本程序用于測(cè)試4X4矩陣鍵盤; 且具有長(zhǎng)按測(cè)能力.
        當(dāng)按下按鍵后,在LCD1602上顯示出按下的鍵號(hào)如:K1 K2.... K16;
        當(dāng)按下一個(gè)按鍵 超過(guò)1S時(shí)間時(shí),每250MS就返回一個(gè)鍵值;實(shí)現(xiàn)長(zhǎng)按鍵的功能;
        同時(shí)把鍵值通過(guò)串口發(fā)送到口上顯示;
        程序說(shuō)明:這是一種傳通的采用延時(shí)來(lái)進(jìn)行按鍵掃描按鍵驅(qū)動(dòng)與測(cè)試程序;這種方法在
        實(shí)際項(xiàng)目編程中是不使用的。 用在教學(xué)中 ,學(xué)生剛開始學(xué)習(xí)單片機(jī)時(shí)。
        注意:在此程序中只顯示了K4長(zhǎng)按凳時(shí)情況。若要想對(duì)其它銨鍵長(zhǎng)按處理,只需要增加
        相關(guān)的處理即可。
        */
        /*
        矩陣鍵盤引腳定義
        */
        sbit keyin4 = P2^7;
        sbit keyin3 = P2^6;
        sbit keyin2 = P2^5;
        sbit keyin1 = P2^4;
        sbit keyout1 = P2^3;
        sbit keyout2 = P2^2;
        sbit keyout3 = P2^1;
        sbit keyout4 = P2^0;
        //宏定義
        #define TH0_NUM 1000 //便于程序的移植;
        #define TL0_NUM 1000
        bit Flag1s,Flag250Ms,Flag2Ms; //時(shí)間到位標(biāo)志
        //lcd1602顯示數(shù)組
        unsigned char keynum[]="keynum:k ";
        unsigned char keycount[3]="000";
        //鍵值查詢數(shù)組
        //k1,k2,k3,k4,k5,k6,k7,k8,
        unsigned char code keytabel[]={0xe7,0xd7,0xb7,0x77,0xeb,0xdb,0xbb,0x7b,
        //k9,k10,k11,k12,k13,k14,k15,k16,
        0xed,0xdd,0xbd,0x7d,0xee,0xde,0xbe,0x7e};
        /*
        外部函數(shù)聲明
        */
        extern void InitLcd1602();
        extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
        void ConfigUART(unsigned int baud);
        void DelayMs(unsigned int ms);
        unsigned char keyscan();
        void InitTimer0();
        /*
        主程序
        */
        void main()
        {
        unsigned char i,j,keytemp=0;
        InitTimer0();
        ConfigUART(9600);
        InitLcd1602();
        LcdShowStr(0,0,keynum);
        while(1)
        {
        keytemp=keyscan();
        if(keytemp!=0) //判斷是否有按鍵按下;
        {
        for(i=0;i<16;i++) //當(dāng)有按鍵按下時(shí),查表獲取鍵值;
        {
        if(keytemp==keytabel[i])
        break;
        }
        keynum[8]=(i+1)/10+0x30;
        keynum[9]=(i+1)%10+0x30;
        TI=1;
        SBUF=keytemp;
        while(TI!=1);
        TI=0;
        LcdShowStr(0,0,keynum);
        if(keytemp==0x77) //用于檢測(cè)長(zhǎng)按向上鍵K4時(shí),在LCD1602第二行顯示
        { //每250MS加1;
        j++;
        if(j>254)
        j=0;
        keycount[0] = j/100%10+0x30;
        keycount[1] = j/10%10+0x30;
        keycount[2] = j%10+0x30;
        TI=1; //用于串口也每隔250MS打印加1;
        printf("key is long pushing %s n",keycount);
        while(TI!=1);
        TI=0;
        }
        LcdShowStr(0,1,keycount);
        }
        }
        }
        /*
        函數(shù)功能:N毫秒延時(shí)
        */
        void DelayMs(unsigned int ms)
        {
        unsigned int i,j;
        for(i=0;i
        for(j=0;j<113;j++);
        }
        /*
        函數(shù)功能:矩陣鍵盤掃描(帶長(zhǎng)按鍵檢測(cè)功能)
        */
        unsigned char keyscan()
        {
        static unsigned char num1,temp;
        P2 = 0xf0;
        num1=P2;
        if(num1!=0xf0)
        {
        DelayMs(50);
        num1=P2;
        if(num1!=0xf0)
        {
        TR0=1; //打開定時(shí)器
        temp=num1;//
        P2 = 0x0f;
        DelayMs(1);
        num1=P2;
        temp =temp|num1;
        do
        {
        P2 = 0xf0;
        num1=P2;
        if(Flag1s == 1) //判斷按下的鍵是否1S沒松手;
        {
        if(Flag250Ms==1) //若1S沒松手,說(shuō)明長(zhǎng)按了某鍵 ;則每250MS返回
        { //一次鍵值;這樣就實(shí)現(xiàn)了長(zhǎng)按某鍵的功能
        Flag250Ms=0;
        return temp;
        }
        }
        }
        while(num1!=0xf0);
        }
        else
        {
        TR0=0; //若沒有按下,則關(guān)閉定時(shí)器
        Flag1s=0;
        Flag250Ms=0;
        temp=0;
        }
        }
        else
        {
        TR0=0;
        Flag1s=0;
        Flag250Ms=0;
        temp = 0;
        }
        TR0=0; //松手時(shí),也要關(guān)閉定時(shí)器,并且清0幾個(gè)標(biāo)志位 ;
        Flag1s=0;
        Flag250Ms=0;
        return temp;
        }
        /*
        函數(shù)功能:定時(shí)器0初始化,設(shè)定每1MS中斷一次
        */
        void InitTimer0()
        {
        TMOD &=0xf0; //這種操作模式,不會(huì)破壞寄存器的其它設(shè)置;
        TMOD |=0x01; //方式1,16位定時(shí)器
        TH0/=(65536-TH0_NUM)/256;
        TL0=(65536-TL0_NUM)%256;
        EA=1;
        ET0=1;
        TR0=0;
        }
        /*
        函數(shù)功能:定時(shí)器0中斷服務(wù)程序
        */
        void Timer0_Interrupt() interrupt 1
        {
        static unsigned char i,j,k;
        TH0=(65536-TH0_NUM)/256;
        TL0=(65536-TL0_NUM)%256;
        i++;j++;
        if(i>2)
        {
        i=0;
        Flag2Ms=1;
        }
        if(j==250)
        {
        j=0;
        Flag250Ms=1;
        k++;
        if(k==4)
        {
        k=0;
        Flag1s=1;
        }
        }
        }


        關(guān)鍵詞: 51單片機(jī)長(zhǎng)按

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 台山市| 哈尔滨市| 巴林左旗| 湖口县| 米泉市| 赫章县| 武威市| 奎屯市| 太湖县| 诸城市| 酒泉市| 体育| 嘉善县| 岳西县| 钟山县| 兴业县| 东台市| 汾西县| 广平县| 高尔夫| 宁远县| 抚州市| 焉耆| 平江县| 内黄县| 巴青县| 伊金霍洛旗| 共和县| 饶平县| 龙江县| 东莞市| 绥芬河市| 社会| 松滋市| 防城港市| 通河县| 长乐市| 自贡市| 麻栗坡县| 行唐县| 凤城市|