微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 4X4的矩阵键盘和1602代码哪里有问题

4X4的矩阵键盘和1602代码哪里有问题

时间:10-02 整理:3721RD 点击:
#include <reg51.h>
#include <intrins.h>                        
#define uchar unsigned char
#define uint  unsigned int
uchar  dis_buf;            //显示缓存
uchar  temp;
uchar  key;               //键顺序吗
void delay0(uchar x);      //x*0.14MS
sbit LCD_RW = P0^6;
sbit LCD_RS = P0^5;            
sbit LCD_EN = P0^7;
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
void  delay(uchar x)
{ uchar j;
    while((x--)!=0)
    { for(j=0;j<125;j++)
         {;}
    }
}
bit lcd_busy()
{                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P2&0x80);
    LCD_EN = 0;
    return(result);
}
void lcd_wcmd(uchar cmd)
{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_();
    P2 = cmd;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;  
}
void lcd_wdat(uchar dat)
{                          
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P2 = dat;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;
}
void lcd_init()
{
    LCD_EN=0;            
    lcd_wcmd(0x38);     
    lcd_wcmd(0x0c);      //显示开,关光标
    lcd_wcmd(0x06);      //移动光标
    lcd_wcmd(0x01);      //清除LCD的显示内容
}
void lcd_pos(uchar pos)
{                          
  lcd_wcmd(pos | 0x80+0x40);  //数据指针=80+地址变量
}
void  keyscan(void)
{         temp = 0;
    P1=0xF0;                 //高四位输入   行为高电平  列为低电平
    delay(1);
        temp=P1;                 //读P1口
    temp=temp&0xF0;                         //屏蔽低四位
    temp=~((temp>>4)|0xF0);          
    if(temp==1)          // p1.4 被拉低
        key=0;
    else if(temp==2)   // p1.5 被拉低
        key=1;
    else if(temp==4)   // p1.6 被拉低
        key=2;
    else if(temp==8)   // p1.7 被拉低
         key=3;
    else
        key=16;
    P1=0x0F;                //低四位输入  列为高电平 行为低电平
    delay(1);
        temp=P1;                //读P1口      
    temp=temp&0x0F;
    temp=~(temp|0xF0);
    if(temp==1)                   // p1.1  被拉低
        key=key+0;
    else if(temp==2)   // p1.2  被拉低
        key=key+4;
    else if(temp==4)        // p1.3  被拉低
        key=key+8;
        else if(temp==8)
            key=key+12;
      else
       key=16;         
           
     dis_buf = key;                     //键值入显示缓存
     dis_buf = dis_buf & 0x0f;
         if(dis_buf>9)               //转换为ASCII码
      dis_buf = dis_buf+0x37;
     else
          dis_buf = dis_buf+0x30;
}
void  keydown(void)
{  
          P1=0xF0;
        if(P1!=0xF0)  //判断按键是否按下 如果按钮按下 会拉低P1其中的一个端口
        {
          keyscan();
    }
}
main()
{       
    uchar i,j;
    P0=0xFF;                    //置P0口
    P1=0xFF;                    //置P1口  
    delay(10);                 //延时
    lcd_init();                //初始化LCD
while(1)
    {
        keydown();   
        lcd_pos(0x80+0x40+i);
        lcd_wdat(dis_buf);
        i++;
        if(i==17)
        {
        i=0;
        lcd_pos(0x80+0x40);
        for(j=0;j<16;j++)
           {
           lcd_wdat(dis_buf);
           }
           i=1;
        }  
    }
    }   
怎样1602随按键逐个显示数字并且右移呢?现在的情况是如图!


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top