久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2765|回復: 4
打印 上一主題 下一主題
收起左側

為何我的單片機矩陣鍵盤不論按那個鍵12864都只是顯示1

[復制鏈接]
跳轉到指定樓層
樓主
ID:653709 發表于 2019-12-9 19:12 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
200黑幣
#include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器
#include"intrins.h"

#define uint unsigned int         
#define uchar unsigned char
#define GPIO_KEY P1
#define lcd_data P0         //數據口
sbit lcd_psb = P3^2; //串/并口選擇
sbit lcd_rw = P2^5;         //讀寫控制
sbit lcd_rs = P2^6;  //寄存器選擇  0為指令  1為數據
sbit lcd_EN = P2^7;  //lcd使能信號(并口)
void lcd_wcmd(uchar cmd);
void delay(int ms);
void DisplayDdram(uchar *hz);
void lcd_wdata(uint dat);
uchar KeyValue;        //用來存放讀取到的鍵值
void delay(int ms)
{
    while(ms--)
        {
uchar i;
          for(i=0;i<250;i++)  
           {
            _nop_();                        
                _nop_();
                _nop_();
                _nop_();
           }
        }
}

bit lcd_busy()
{

    bit result;
    P0=0X00;              //關掉數碼管的信號。阻止數碼管受到P0口信號的影響
lcd_rs = 0;
lcd_rw = 1;
lcd_EN = 1;
delay(1);
    result = (bit)(P0&0x80);
lcd_EN = 0;
    return(result);
}

void lcd_init(void)
{
        lcd_psb = 1;                //并口方式
        lcd_wcmd(0x34);                 //擴展指令
        delay(5);
        lcd_wcmd(0x30);                //基本指令
        delay(5);
        lcd_wcmd(0x0c);                 //顯示光標開關
        delay(5);
        lcd_wcmd(0x01);                 //清除lcd的顯示內容
        delay(5);
}

void lcd_wcmd(uchar cmd)
{
        while(lcd_busy());
        lcd_rs = 0;
        lcd_rw = 0;
        lcd_EN = 0;
        lcd_data=cmd;
        delay(1);
        lcd_EN = 1;
        delay(1);
        lcd_EN = 0;
}

void DisplayDdram(uchar *hz)
{
        while(*hz!= '\0')
        {
                lcd_wdata(*hz);//地址里面的值
                hz++;
        }
}

void lcd_wdata(uint dat)
{
        while(lcd_busy());
        lcd_rs = 1;
        lcd_rw = 0;
        lcd_EN = 0;
        lcd_data = dat;
        delay(1);
        lcd_EN = 1;
        delay(1);
        lcd_EN = 0;
}

void lcd_pos(uchar x,uchar y)
{
        uchar pos;
        if(x==0)
        {
                x = 0x80;
        }else if(x==1)
        {
                x= 0x90;
        }else if(x==2)
        {
                x = 0x88;
        }else if(x==3)
        {
                x = 0x98;
        }
        pos = x + y;
        lcd_wcmd(pos);
}


uchar KeyDown()
{
        GPIO_KEY=0x0f;
        if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
        {
                delay(10);//延時10ms進行消抖
                if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
                {        
                        //測試列
                        GPIO_KEY=0X0f;
                        switch(GPIO_KEY)
                        {
                                case(0X07):KeyValue=0;break;
                                case(0X0b):KeyValue=1;break;
                                case(0X0d):KeyValue=2;break;
                                case(0X0e):KeyValue=3;break;
                        }
                        //測試行
                        GPIO_KEY=0Xf0;
                        switch(GPIO_KEY)
                        {
                                case(0X70):KeyValue=KeyValue;break;
                                case(0Xb0):KeyValue=KeyValue+4;break;
                                case(0Xd0): KeyValue=KeyValue+8;break;
                                case(0Xe0):KeyValue=KeyValue+12;break;
                        }        
                }
        }
                    return KeyValue;
}



void main()
{
    uchar q;        
   lcd_init();
while(1)
{        
     q=KeyDown();                   //按鍵判斷函數
        lcd_pos(2,1);
switch(q)
{
case 0:DisplayDdram("1");break;
case 1:DisplayDdram("2");break;
case 2:DisplayDdram("3");break;
case 3:DisplayDdram("4");break;
case 4:DisplayDdram("5");break;
case 5:DisplayDdram("6");break;
case 6:DisplayDdram("7");break;
case 7:DisplayDdram("8");break;
case 8:DisplayDdram("9");break;
case 9:DisplayDdram("10");break;
case 10:DisplayDdram("11");break;
case 11:DisplayDdram("12");break;
        }
        delay(1000);        
        lcd_wcmd(0x01);        
}
}

最佳答案

查看完整內容

更據你的程序改了一下 親測可用。使用時把后綴名rar改成.c或者txt
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:90663 發表于 2019-12-9 19:12 | 只看該作者
更據你的程序改了一下 親測可用。使用時把后綴名rar改成.c或者txt

main.rar

3.91 KB, 下載次數: 13

評分

參與人數 1黑幣 +60 收起 理由
admin + 60 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:235200 發表于 2019-12-9 23:30 | 只看該作者
因為switch(q)的分類未包含所有可能出現的情況
回復

使用道具 舉報

地板
ID:213173 發表于 2019-12-10 07:47 | 只看該作者
顯示單字符用單引號,字符串用雙引號。
回復

使用道具 舉報

5#
ID:660858 發表于 2019-12-10 18:54 | 只看該作者
     這個是我之前實驗做出來程序

*******************************************************************************/
#include<reg52.h>
void delay(unsigned char t);
bit key_certain(void);
/*******************************************************************************
*          實現功能:4×4鍵盤檢測                                                                                            
*        現象描述:按下4×4按鍵數碼管上顯示相應的值
*                          K1(0)  K2(1)  K3(2)  K4(3)  K9(8)   K10(9)  K11(A)  K12(B)
*                          K5(4)  K6(5)  K7(6)  K8(7)  K13(C)  K14(D)  K15(E)  K16(F)          *
*******************************************************************************/
sbit wei1=P0^7;//位定義數碼管用到的片選,高電平有效
unsigned char code tab[ ]={0x3f, 0x06, 0x5b, 0x4f,
                                                   0x66, 0x6d, 0x7d, 0x07,
                                               0x7f, 0x6f, 0x77, 0x7c,
                                                   0x39, 0x5e, 0x79, 0x71};//0到F的16個鍵植

/*******************************************************************************
*   名稱 : Main()                                                                                                                           *
*******************************************************************************/
void main(void)//主函數
{       
        unsigned char key, j ,k, s;
        while(1)
          {
                   if(key_certain()== 1)                //確定鍵被按下后,掃描是那個鍵被按下
                   {   
                    P2=0xfe;                                //送第一行為低電平
                        k=0xfe;                                        //保留這次掃描數值,備移位用
                    for(j=0;j<4;j++)                //四次掃描處理
                    {       
              s=P2&0xf0;                        //屏蔽低四位,取高四位,根據s數值確定那一列,根據掃描的j行確定行數,
                          switch(s)
                                {
                                        case 0xe0: key=4*j+0; break;        //第1列
                                            case 0xd0: key=4*j+1; break;        //第2列
                                         case 0xb0: key=4*j+2; break;        //第3列
                                         case 0x70: key=4*j+3; break;        //第4列
                                         default:        break;
                                }
                          k=(k<<1)|0x01;                //循環掃描,
                          P2=k;                                        //每次僅向一行送0掃描
             }//for
                   }//if       
                      P1=tab[key];                                //數據送數碼管顯示數據口
                wei1=0;                                                        //選中片選

                delay(10);
          }//while
}
/*******************************************************************************
* 名稱 : delay()
*******************************************************************************/
void delay(unsigned char t)//延時函數
{
        unsigned char a;
        while( --t != 0)
        {
                  for(a=0;a<125;a++);
    }
}
/*******************************************************************************
* 名稱 : 判斷鍵的否被按下,通過返回值確定
*******************************************************************************/
bit key_certain(void)//判斷鍵的否被按下,通過返回值確定
{
        P2=0xf0;
        if(P2!=0xf0)
           {
            delay(20);
             if(P2 != 0xf0)//延時去抖動,再次確認鍵被按下,鍵按下返回值為1,否則為0
                     return 1;
             else
                     return 0;
    }
        else
             return 0;
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品免费一区二区三区四区 | 国产片侵犯亲女视频播放 | 日日日日日日bbbbb视频 | 在线观看av网站 | 国产精品一区二区三区四区 | 国产精品入口麻豆www | 日韩精品一区中文字幕 | 日韩精品一区二区三区中文字幕 | 日韩在线 | 天堂资源 | 在线午夜 | 欧美日韩在线免费观看 | a级毛片免费高清视频 | 99热.com| 久久久激情| 国产一区二区三区视频 | 91精品欧美久久久久久久 | 三级av在线 | 在线国产一区二区三区 | 免费观看日韩av | 国产精品久久久久久久7777 | 蜜桃免费一区二区三区 | 亚洲一区 中文字幕 | 久久在线免费 | 久久久久国产一区二区三区四区 | 欧美一级小视频 | 成人福利 | 日本手机在线 | 亚洲成人综合社区 | 精品久久久久久久久久久 | 中文字幕视频一区 | 亚洲国产一区二区三区 | 午夜影院网站 | 久久合久久| 欧美日批 | 成人在线精品 | 亚洲精品资源 | 精品国产网 | 黄色激情毛片 | 国产精品久久久久久婷婷天堂 | 国产精品成人一区二区三区 |