打印

1602显示4X4矩阵键盘程序问题

[复制链接]
1757|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 年纪哈哈 于 2013-9-26 10:29 编辑


#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 | 0xc0);  //数据指针=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()
{  
          P1=0xF0;
        if(P1!=0xF0)  //判断按键是否按下 如果按钮按下 会拉低P1其中的一个端口
        {
          keyscan();
    }
}
main()
{        
    uchar a,b;
    lcd_init();                //初始化LCd

while(1)
{
        keydown();  
        lcd_pos(0x80+0x40+a);
        a++;
        lcd_wdat(dis_buf);
        if(a==17)
        {
        a=0;
        lcd_pos(0x80+0x40);
        for(b=0;b<16;b++)
           {
           lcd_wdat(dis_buf);
           }
           a=1;
        }  
}

    }   
问题!!!
怎样修改程序1602才能逐个随按键显示,并且右移,当满16位清零重来,程序仿真如图所示。。。主要是while(1){}要怎么修改,1602随按键按一次右移一位









相关帖子

沙发
ayb_ice| | 2013-9-26 08:31 | 只看该作者
搞个队列,进一个,出一个,显示

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

34

帖子

0

粉丝