找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1759|回复: 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);        
}
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表