找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5183|回復(fù): 4
收起左側(cè)

CT107D矩陣鍵盤,求助大神

[復(fù)制鏈接]
ID:153538 發(fā)表于 2017-1-14 17:34 | 顯示全部樓層 |閱讀模式

本人小白,剛開始學(xué)習(xí)單片機(jī),但就卡在矩陣鍵盤問題中,求助高手
程序:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit A1=P2^5;
sbit B1=P2^6;
sbit C1=P2^7;
sbit buzz=P0^6;

uint g=0;

void delay(uint t)
{
        uchar i;
        for(t;t>0;t--)
                for (i=1200;i>0;i--);
}
void ms_delay(uint t)
{
        uchar i;
        for(t;t>0;t--)
                for (i=120;i>0;i--);
}
unsigned char keyscan(void)//鍵盤掃描函數(shù),使用行列反轉(zhuǎn)掃描法 比如:行為低電位,列為高四位
{
        uint i=0;
        for(i=0;i<4;i++)
        {               
                P3=0XFF;
                P3=P3&0XFE;
                if(P3!=0XFF)
                {
                        ms_delay(1200);
                        if(P3!=0XFF)
                        {
                               switch(P3)
                                 {
                                         case 0xEE:g=1;break;
                                        case 0xDE:g=2;break;
                                        case 0xbE:g=3;break;
                                 }
                         }
         }

                P3=0XFF;
                P3=P3&0XFD;
                if(P3!=0XFF)
                {
                        ms_delay(1200);
                        if(P3!=0XFF)
                        {
                                  switch(P3)
                                 {
                                         case 0xED:g=4;break;
                                        case 0xDD:g=5;break;
                                        case 0xbD:g=6;break;
                                 }
                        }
                }
                P3=0XFF;
                P3=P3&0XFB;
                if(P3!=0XFF)
                {
                        ms_delay(1200);
                        if(P3!=0XFF)
                        {
                               switch(P3)
                                 {
                                         case 0xEB:g=7;break;
                                        case 0xDB:g=8;break;
                                        case 0xbB:g=9;break;
                                 }
                        }
                }
                P3=0XFF;
                P3=P3&0XF7;
                if(P3!=0XFF)
                {
                        ms_delay(1200);
                        if(P3!=0XFF)
                        {
                              switch(P3)
                                 {
                                         case 0xE7:g=10;break;
                                        case 0xD7:g=11;break;
                                        case 0xb7:g=12;break;
                                 }
                        }
                }
        }
        return g;

}
void main()
{
        while(1)
        {
                keyscan();        
                switch(g)
                {
                        case 1:
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0xff;break;
                        case 2:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0xfe;break;
                        case 3:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0x88;break;                                                
                        case 4:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0xf7;break;                        
                        case 5:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0xef;break;        
                        case 6:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0xBB;break;               
                        case 7:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0x7f;break;                                                
                        case 8:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0xf0;break;        
                        case 9:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0xAA;break;                                       
                        case 10:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0x3c;break;        
                        case 11:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0xaa;break;        
                        case 12:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0xCC;break;                                                                                                                                                                                                                                                                        
                }
        }        
}
可是在實(shí)驗(yàn)板上S11,S10,S9,S8不能起作用,其他都可以工作起來,但是我在isis professional上仿真則是可以實(shí)行的,求大神幫助。
寫法見笑了,

實(shí)驗(yàn)板上矩陣鍵盤

實(shí)驗(yàn)板上矩陣鍵盤

CT107D 芯片

CT107D 芯片

isis professional 軟件仿真

isis professional 軟件仿真
回復(fù)

使用道具 舉報(bào)

ID:155481 發(fā)表于 2017-1-14 21:53 | 顯示全部樓層
在實(shí)驗(yàn)板上S11,S10,S9,S8不能起作用,其他都可以工作起來,
回復(fù)

使用道具 舉報(bào)

ID:155507 發(fā)表于 2017-1-15 12:48 | 顯示全部樓層
程序掃描時(shí),給P3口賦值就0Xfe。然后讀取高四位的電平,因?yàn)榇藭r(shí)無按鍵觸發(fā),所以高四位狀態(tài)是1111 (二進(jìn)制數(shù))。
      假設(shè)此時(shí)S1被按下,高四位會(huì)變成什么?1110(二進(jìn)制數(shù)),S1對應(yīng)的編碼就是:0B11101110.
      假設(shè)是S3被按下,高四位會(huì)變成什么?1011(二進(jìn)制數(shù)),S3對應(yīng)的編碼就是:0B10111110
因?yàn)镾1被按下,所以低四位的狀態(tài)會(huì)變成1110(二進(jìn)制數(shù))。
將兩次得到的P3口狀態(tài)進(jìn)行邏輯或運(yùn)算,就能得到按鍵S1對應(yīng)的編碼:0B1110 1110.每個(gè)按鍵都會(huì)有一個(gè)編碼,我們只需要對他們的編碼進(jìn)行比對,就知道按下了哪個(gè)按鍵。
注意:編碼的確認(rèn)是在矩陣電路確定后,就已經(jīng)隨著電路固定了。
回復(fù)

使用道具 舉報(bào)

ID:153538 發(fā)表于 2017-1-17 17:25 | 顯示全部樓層
angmall 發(fā)表于 2017-1-15 12:48
程序掃描時(shí),給P3口賦值就0Xfe。然后讀取高四位的電平,因?yàn)榇藭r(shí)無按鍵觸發(fā),所以高四位狀態(tài)是1111 (二進(jìn) ...

好的,我試著改一下,謝謝啦
回復(fù)

使用道具 舉報(bào)

ID:162289 發(fā)表于 2017-1-18 14:26 | 顯示全部樓層
過來學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表