欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4053|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

鍵盤(pán)矩陣輸出結(jié)果為亂碼,按鍵狀態(tài)是否有掃描到?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:267218 發(fā)表于 2017-12-27 15:40 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
通過(guò)4*4鍵盤(pán)矩陣按鍵在LCD12864中顯示1~16,原理圖如下:


輸出結(jié)果為亂碼,按鍵狀態(tài)是否有掃描到?
請(qǐng)問(wèn)我的程序該怎么改呢?

單片機(jī)源程序如下:
  1. /*-----------------------------------------------


  2. ------------------------------------------------*/
  3. #include <STC12C5A60S2.H>
  4. #include <intrins.h>
  5. #include "delay.h"
  6. #include <lcd12864.h>
  7. #define uchar unsigned char
  8. #define uint unsigned int
  9. #define ufloat unsigned float
  10.         sbit BLA=P2^3;
  11.         //sbit RL=P1^2;
  12. sbit K1=P1^4;
  13. sbit K2=P1^5;
  14. sbit K3=P1^6;
  15. sbit K4=P1^7;
  16. sbit K5=P3^4;
  17. sbit K6=P3^5;
  18. sbit K7=P3^6;
  19. sbit K8=P3^7;
  20. unsigned char KeyPro(void);
  21. //unsigned char dofly_code[]={'1','2','3','15','4','5','6','14','7','8','9','13','10','0','11','12'};
  22. unsigned char code TAB[]={1,2,3,15,4,5,6,14,7,8,9,13,10,0,11,12};
  23. /*------------------------------------------------
  24.                  Ö÷3ìDò
  25. ------------------------------------------------*/
  26. main()
  27. {
  28.   unsigned char i,j,num;
  29.         //unsigned char s[];
  30.         BLA=1;
  31.    CGRAM();     /
  32.      while (1)
  33. {
  34.          Init_ST7920();   //
  35.          LCD_PutString(0,1,"請(qǐng)輸入鍵盤(pán)");
  36.         DisplayCGRAM(7,2);/
  37.          
  38. num=KeyPro();  //
  39. if(num!=0xff)  //
  40.     DelayMs(200);
  41. if(num!=0xff)
  42.     LCD_PutString(0+i,1+j,TAB[num]);//
  43.         i++;
  44.         if(i==128)//
  45.           {
  46.            i=0;j++;
  47.            if(j==64)//
  48.            {
  49.               j=0;      
  50.                        
  51.                   }
  52.                 }
  53.                 //ClrScreen();
  54.                 //DelayMs(20000);
  55. }     
  56.    }

  57. unsigned char SanKeyA(void)
  58. {
  59.         unsigned char PA;
  60. if(K1 ==1)//掃描第一行
  61. {
  62.     PA=0x01;
  63.         return PA;
  64. }
  65. if(K2==1)//掃描第二行
  66. {
  67.    PA=0x01<<1;
  68.         return PA;
  69. }
  70. if(K3 ==1)/
  71. {
  72.     PA=0x01<<2;
  73.         return PA;
  74. }
  75. if(K4==1)/
  76. {
  77.    PA=0x01<<3;
  78.         return PA;
  79. }
  80. }
  81. unsigned char SanKeyB(void)
  82. {
  83.         unsigned char PB;
  84.   if(K5 ==1)
  85. {
  86.     PB=0x01<<4;掃描第一列
  87.                 return PB;
  88. }
  89. if(K6==1)//掃描第二行
  90. {
  91.    PB=0x01<<5;
  92.         return PB;
  93. }
  94. if(K7 ==1)
  95. {
  96.     PB=0x01<<6;
  97.         return PB;
  98. }
  99. if(K8==1)
  100. {
  101.    PB=0x01<<7;
  102.         return PB;
  103. }
  104. }
  105. unsigned char KeyPro(void)
  106. {
  107.   unsigned char sum;
  108.         sum=SanKeyA()+SanKeyB();
  109. switch(sum)
  110. {
  111.   case 0x11:return 1  ;break;//°′ÏÂÏàó|μļüÏÔê¾Ïà¶Ôó|μÄÂëÖμ
  112.   case 0x21:return 2  ;break;//
  113.   case 0x41:return 3  ;break;//
  114.   case 0x81:return 15;break;//

  115.   case 0x12:return 4  ;break;//
  116.   case 0x22:return 5  ;break;//
  117.   case 0x42:return 6  ;break;//
  118.   case 0x82:return 14;break;//

  119.   case 0x14:return 7  ;break;//
  120.   case 0x24:return 8  ;break;//
  121.   case 0x44:return 9  ;break;//
  122.   case 0x84:return 13;break;//

  123.   case 0x18:return 10;break;//
  124.   case 0x28:return 0; break;//
  125.   case 0x48:return 11;break;//
  126.   case 0x88:return 12;break;//
  127.   default:return 0xff;break;
  128. }
  129. }
復(fù)制代碼





分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:267218 發(fā)表于 2017-12-27 15:42 | 只看該作者
求大神幫幫忙,
回復(fù)

使用道具 舉報(bào)

板凳
ID:267813 發(fā)表于 2017-12-27 17:36 | 只看該作者
檢查  修改   顯示的計(jì)算   一定要 讓顯示的參數(shù) 和  函數(shù)能夠?qū)?yīng)    比如0-f   是否是 你想要的  0-15  
unsigned char code TAB[]={1,2,3,15,4,5,6,14,7,8,9,13,10,0,11,12};
LCD_PutString(0+i,1+j,TAB[num]);
這倆個(gè)好好檢查
掃描的  按鍵  先單個(gè)測(cè)試     多個(gè)的話(huà)  你的代碼暫時(shí)不能實(shí)現(xiàn)
回復(fù)

使用道具 舉報(bào)

地板
ID:267218 發(fā)表于 2017-12-27 17:46 | 只看該作者
zzzxxxccc 發(fā)表于 2017-12-27 17:36
檢查  修改   顯示的計(jì)算   一定要 讓顯示的參數(shù) 和  函數(shù)能夠?qū)?yīng)    比如0-f   是否是 你想要的  0-15  
...

這兩句已經(jīng)單獨(dú)測(cè)試過(guò)了,LCD_PutString(0+i,1+j,TAB[num])不能顯示TAB[num]的具體值。這個(gè)問(wèn)題我改怎么改呢?



還有按鍵掃描的函數(shù)不正確嗎?按下按鍵它會(huì)彈出亂碼,而且是一直循環(huán)著,按下復(fù)位鍵也沒(méi)反應(yīng),這是為什么呢?
回復(fù)

使用道具 舉報(bào)

5#
ID:213173 發(fā)表于 2017-12-27 17:47 | 只看該作者
異組端口組成的4*4矩陣鍵盤(pán)讀寫(xiě)方法
#include <STC15F2K60S2.H>
#define uint unsigned int                         //宏定義數(shù)據(jù)類(lèi)型uint
#define uchar unsigned char                 //宏定義數(shù)據(jù)類(lèi)型uchar
sbit code0=P3^0;                                        //定義4*4鍵盤(pán)端口
sbit code1=P3^1;
sbit code2=P3^2;
sbit code3=P3^3;
sbit code4=P3^4;
sbit code5=P3^5;
sbit code6=P4^2;
sbit code7=P4^4;       

uchar key=0xff;                                                //鍵值變量初始值
void PX(uchar i)                                        //寫(xiě)入8位數(shù)據(jù)
{   
    code0=i&0x01;i>>=1;       
    code1=i&0x01;i>>=1;
    code2=i&0x01;i>>=1;
    code3=i&0x01;i>>=1;
    code4=i&0x01;i>>=1;
    code5=i&0x01;i>>=1;
    code6=i&0x01;i>>=1;
    code7=i&0x01;
}
uchar PD()                                                        //讀取8位數(shù)據(jù)
{
        uchar i;
        i=code7;
        i=(i<<1)|code6;
        i=(i<<1)|code5;
        i=(i<<1)|code4;
        i=(i<<1)|code3;
        i=(i<<1)|code2;
        i=(i<<1)|code1;
        i=(i<<1)|code0;
        return i;
}
void key_scan()                                                //矩陣鍵盤(pán)掃描函數(shù)
{
        uchar temp1,temp2,temp3;                //臨時(shí)變量
        static bit sign=0;                                //按鍵自鎖標(biāo)志
        static uint count=0;                        //消抖計(jì)數(shù)變量
        PX(0xf0);                                                //先給矩陣端口賦一個(gè)初值0xf0
        if(PD()!=0xf0)                                         //判斷矩陣端口不等于所賦初值,說(shuō)明有健按下
        {
                if(sign==0)                                        //如果按鍵自鎖標(biāo)志為0
                {
                        count++;                                //消抖計(jì)數(shù)
                        if(count>=1000)                        //消抖計(jì)數(shù)>=1000,估算主循環(huán)周期調(diào)整
                        {                                                //摒棄Delay延時(shí)方式,
                                count=1000;                        //防止溢出
                                sign=1;                                //按鍵自鎖標(biāo)志置1,鍵不抬起,按其他鍵無(wú)效
                                temp1=PD();                        //temp1保存矩陣端口高4位變化
                                PX(0x0f);                        //再給矩陣端口賦值0x0f
                                temp2=PD();                        //temp2保存矩陣端口低4位變化
                                temp3=temp2|temp1;        //temp3=高4位+低4位
                                key=temp3;                        //保存鍵值
                        }
                }
        }
        else                                                         //按鍵抬起
        {
                sign=0;                                                //按鍵自鎖標(biāo)志清0
                count=0;                                        //消抖計(jì)數(shù)清0
        }
}
void main()
{        
        P0M0 = 0x00;                                        //初始化端口準(zhǔn)雙向
        P0M1 = 0x00;
        P1M0 = 0x00;
        P1M1 = 0x00;
        P2M0 = 0x00;
        P2M1 = 0x00;
        P3M0 = 0x00;
        P3M1 = 0x00;
        P4M0 = 0x00;
        P4M1 = 0x00;
        P5M0 = 0x00;
        P5M1 = 0x00;
        P6M0 = 0x00;
        P6M1 = 0x00;
        P7M0 = 0x00;
        P7M1 = 0x00;

        while(1)               
        {
                key_scan();                                        //鍵盤(pán)掃描
                P1=key;                                                //LED低電平亮顯示鍵值
        }                                                                               
}
回復(fù)

使用道具 舉報(bào)

6#
ID:267218 發(fā)表于 2017-12-27 19:06 | 只看該作者
wulin 發(fā)表于 2017-12-27 17:47
異組端口組成的4*4矩陣鍵盤(pán)讀寫(xiě)方法
#include
#define uint unsigned int                         //宏定義數(shù)據(jù)類(lèi)型uint

沒(méi)能理解你的main函數(shù)里面的意思?能解釋一下嗎?
回復(fù)

使用道具 舉報(bào)

7#
ID:213173 發(fā)表于 2017-12-27 20:43 | 只看該作者
xdn 發(fā)表于 2017-12-27 19:06
沒(méi)能理解你的main函數(shù)里面的意思?能解釋一下嗎?

main函數(shù)里面很簡(jiǎn)單,所有端口初始化為準(zhǔn)雙向口是因?yàn)槭褂每梢苑抡娴腎AP15W4K58S4單片機(jī),其很多端口默認(rèn)狀態(tài)是強(qiáng)推挽或高阻,需要改為準(zhǔn)雙向口。主循環(huán)里就是調(diào)用鍵盤(pán)掃描程序和用LED顯示鍵值語(yǔ)句。
回復(fù)

使用道具 舉報(bào)

8#
ID:267218 發(fā)表于 2017-12-28 09:09 | 只看該作者
wulin 發(fā)表于 2017-12-27 20:43
main函數(shù)里面很簡(jiǎn)單,所有端口初始化為準(zhǔn)雙向口是因?yàn)槭褂每梢苑抡娴腎AP15W4K58S4單片機(jī),其很多端口默認(rèn) ...

//新一代 1T 8051系列,單片機(jī)i/o口的特殊功能寄存器
//                                      7     6     5     4     3     2     1     0         Reset Value
sfr P0   = 0x80; //8 bitPort0          P0.7  P0.6  P0.5  P0.4  P0.3  P0.2  P0.1  P0.0       1111,1111
sfr P0M0 = 0x94; //                                                                         0000,0000
sfr P0M1 = 0x93; //                                                                         0000,0000
sfr P1   = 0x90; //8 bitPort1          P1.7  P1.6  P1.5  P1.4  P1.3  P1.2  P1.1  P1.0       1111,1111
sfr P1M0 = 0x92; //                                                                         0000,0000
sfr P1M1 = 0x91; //                                                                         0000,0000
sfr P1ASF = 0x9D; //P1 analog special function
sfr P2   = 0xA0; //8 bitPort2          P2.7  P2.6  P2.5  P2.4  P2.3  P2.2  P2.1  P2.0       1111,1111
sfr P2M0 = 0x96; //                                                                         0000,0000
sfr P2M1 = 0x95; //                                                                         0000,0000
sfr P3   = 0xB0; //8 bitPort3          P3.7  P3.6  P3.5  P3.4  P3.3  P3.2  P3.1  P3.0       1111,1111
sfr P3M0 = 0xB2; //                                                                         0000,0000
sfr P3M1 = 0xB1; //                                                                         0000,0000
sfr P4   = 0xC0; //8 bitPort4          P4.7  P4.6  P4.5  P4.4  P4.3  P4.2  P4.1  P4.0       1111,1111
sfr P4M0 = 0xB4; //                                                                         0000,0000
sfr P4M1 = 0xB3; //                                                                         0000,0000
//                                      7      6         5         4      3     2     1     0     Reset Value
sfr P4SW = 0xBB; //Port-4 switch            -   LVD_P4.6  ALE_P4.5  NA_P4.4   -     -     -     -            x000,xxxx

sfr P5   = 0xC8; //8 bitPort5           -     -       -      -    P5.3  P5.2  P5.1  P5.0    xxxx,1111
sfr P5M0 = 0xCA; //                                                                         0000,0000
sfr P5M1 = 0xC9; //                                                                         0000,0000



這是STC12C5A60S2頭文件里面的定義,你的main函數(shù)所指的初始化為標(biāo)準(zhǔn)的雙向端口是要修改這個(gè)地方嗎?還是直接在主程序中重新定義修改?
回復(fù)

使用道具 舉報(bào)

9#
ID:213173 發(fā)表于 2017-12-28 10:37 | 只看該作者
xdn 發(fā)表于 2017-12-28 09:09
//新一代 1T 8051系列,單片機(jī)i/o口的特殊功能寄存器
//                                      7     6 ...

用STC12系列芯片P0~P4加電復(fù)位后都是高電平準(zhǔn)雙向口,不必設(shè)置,給你這個(gè)例程主要是介紹不同組別端口組成的4*4矩陣鍵盤(pán)讀寫(xiě)方法。
回復(fù)

使用道具 舉報(bào)

10#
無(wú)效樓層,該帖已經(jīng)被刪除
11#
ID:268333 發(fā)表于 2017-12-28 15:15 | 只看該作者
我也在做這個(gè)題的實(shí)訓(xùn),總是出現(xiàn)問(wèn)題,開(kāi)始我又找不到哪里有問(wèn)題
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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