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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:653709 發(fā)表于 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         //數(shù)據(jù)口
sbit lcd_psb = P3^2; //串/并口選擇
sbit lcd_rw = P2^5;         //讀寫控制
sbit lcd_rs = P2^6;  //寄存器選擇  0為指令  1為數(shù)據(jù)
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;              //關(guān)掉數(shù)碼管的信號。阻止數(shù)碼管受到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);                 //顯示光標(biāo)開關(guān)
        delay(5);
        lcd_wcmd(0x01);                 //清除lcd的顯示內(nèi)容
        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();                   //按鍵判斷函數(shù)
        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);        
}
}

最佳答案

查看完整內(nèi)容

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

使用道具 舉報

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

main.rar

3.91 KB, 下載次數(shù): 13

評分

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

查看全部評分

回復(fù)

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

*******************************************************************************/
#include<reg52.h>
void delay(unsigned char t);
bit key_certain(void);
/*******************************************************************************
*          實現(xiàn)功能:4×4鍵盤檢測                                                                                            
*        現(xiàn)象描述:按下4×4按鍵數(shù)碼管上顯示相應(yīng)的值
*                          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;//位定義數(shù)碼管用到的片選,高電平有效
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)//主函數(shù)
{       
        unsigned char key, j ,k, s;
        while(1)
          {
                   if(key_certain()== 1)                //確定鍵被按下后,掃描是那個鍵被按下
                   {   
                    P2=0xfe;                                //送第一行為低電平
                        k=0xfe;                                        //保留這次掃描數(shù)值,備移位用
                    for(j=0;j<4;j++)                //四次掃描處理
                    {       
              s=P2&0xf0;                        //屏蔽低四位,取高四位,根據(jù)s數(shù)值確定那一列,根據(jù)掃描的j行確定行數(shù),
                          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;                //循環(huán)掃描,
                          P2=k;                                        //每次僅向一行送0掃描
             }//for
                   }//if       
                      P1=tab[key];                                //數(shù)據(jù)送數(shù)碼管顯示數(shù)據(jù)口
                wei1=0;                                                        //選中片選

                delay(10);
          }//while
}
/*******************************************************************************
* 名稱 : delay()
*******************************************************************************/
void delay(unsigned char t)//延時函數(shù)
{
        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;
}
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品在线视频免费观看 | 成人三级av | 91麻豆精品国产91久久久久久久久 | 水蜜桃久久夜色精品一区 | 国产一区欧美一区 | 亚洲精品视频在线看 | 国产精品美女久久久久久免费 | 亚洲欧美日韩一区二区 | 黑人精品欧美一区二区蜜桃 | 精品人伦一区二区三区蜜桃网站 | 国产传媒毛片精品视频第一次 | 成人国产精品久久久 | 亚洲成人高清 | av一区二区三区四区 | 国产成人在线一区 | 久久综合久久综合久久综合 | 七七婷婷婷婷精品国产 | xxxxxx国产 | 欧美一级在线 | 久久久免费 | 日韩综合在线 | 黄色网址免费在线观看 | 免费看一区二区三区 | 亚洲精品久久久久中文字幕欢迎你 | 久久成人亚洲 | 日本久久久久久久久 | 天天综合网7799精品 | 成人国产午夜在线观看 | 精品日韩一区二区 | 成人福利在线观看 | 亚洲国产成人精品女人久久久 | 综合九九| 欧美aⅴ| 亚洲影音先锋 | 日日天天 | 欧美嘿咻| www.激情.com| 日韩一级精品视频在线观看 | 中文字幕在线观看第一页 | 国产日韩一区二区 | 国产免费观看一级国产 |