51单片机 c语言 矩阵键盘1号

//矩阵键盘一号,看不懂

#include
#include

#define uchar unsigned char
#define uint unsigned int

sbit BEEP = P2^2 ; //蜂鸣器驱动线
uchar dis_buf ; //显示缓存
uchar temp ;
uchar key ; //键顺序吗

void beep() ; //蜂鸣器
void delay0(uchar x) ; //x*0.14MS

sbit LCD_RS = P3^5 ;
//sbit LCD_RW = P2^1 ;
sbit LCD_EN = P3^4 ;

uchar code cdis1[ ] = {" KEY NUMBER "} ;
uchar code cdis2[ ] = {" KEY-CODE: H "} ;

#define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;

/*************************************************************/
/*
/* 延时子程序
/*
/*************************************************************/

void delay(uchar x)
{ uchar j ;
while((x--)!=0)
{ for(j=0 ;j< 125 ;j++)
{ ;}
}
}

/*************************************************************/
/*
/*检查LCD忙状态
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据
/*
/*************************************************************/
/*
bit lcd_busy()
{
bit result ;
LCD_RS = 0 ;
LCD_RW = 1 ;
LCD_EN = 1 ;
delayNOP() ;
result = (bit)(P0&0x80) ;
LCD_EN = 0 ;
return(result) ;
}
*/
/*******************************************************************/
/*
/*写指令数据到LCD
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
/*
/*******************************************************************/

void lcd_wcmd(uchar cmd)

{
//while(lcd_busy()) ;
LCD_RS = 0 ;
// LCD_RW = 0 ;
LCD_EN = 0 ;
_nop_() ;
_nop_() ;
P0 = cmd ;
delayNOP() ;
LCD_EN = 1 ;
delayNOP() ;
LCD_EN = 0 ;
}

/*******************************************************************/
/*
/*写显示数据到LCD
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
/*
/*******************************************************************/

void lcd_wdat(uchar dat)
{
//while(lcd_busy()) ;
LCD_RS = 1 ;
//LCD_RW = 0 ;
LCD_EN = 0 ;
P0 = da

t ;
delayNOP() ;
LCD_EN = 1 ;
delayNOP() ;
LCD_EN = 0 ;
}

/*************************************************************/
/*
/* LCD初始化设定
/*
/*************************************************************/

void lcd_init()
{
delay(15) ;
lcd_wcmd(0x38) ; //16*2显示,5*7点阵,8位数据
delay(5) ;
lcd_wcmd(0x38) ;
delay(5) ;
lcd_wcmd(0x38) ;
delay(5) ;

lcd_wcmd(0x0c) ; //显示开,关光标
delay(5) ;
lcd_wcmd(0x06) ; //移动光标
delay(5) ;
lcd_wcmd(0x01) ; //清除LCD的显示内容
delay(5) ;
}

/*************************************************************/
/*
/* 设定显示位置
/*
/*************************************************************/

void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80) ; //数据指针=80+地址变量
}

/*************************************************************/
/*
/* 键扫描子程序
/*
/*************************************************************/

void keyscan(void)
{
P1=0x0F ; //低四位输入
delay(1) ;
temp=P1 ; //读P1口
temp=temp&0x0F ;
temp=~(temp|0xF0) ;
if(temp==1)
key=0 ;
else if(temp==2)
key=1 ;
else if(temp==4)
key=2 ;
else if(temp==8)
key=3 ;
else
key=16 ;

P1=0xF0 ; //高四位输入
delay(1) ;
temp=P1 ; //读P1口
temp=temp&0xF0 ;
temp=~((temp>>4)|0xF0) ;
if(temp==1)
key=key+0 ;
else if(temp==2)
key=key+4 ;
else if(temp==4)
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)
{
keyscan() ;
beep() ;
}
}

/*************************************************************/
/*
/* 蜂鸣器响一声
/*
/*************************************************************/

void beep()
{
unsigned char i ;
for (i=0 ;i< 100 ;i++)
{
delay0(4) ;
BEEP=!BEEP ; //BEEP取反
}
BEEP=1 ; //关闭蜂鸣器
delay(250) ; //延时
}

/*************************************************************/
/*
/* 延时 x*0.14ms
/*
/*************************************************************/
void delay0(uchar x)
{
unsigned char i ;
while(x--)
{
for (i = 0 ; i< 13 ; i++) {}
}
}
/*************************************************************/
/*
/* 主程序
/*
/*************************************************************/
main()
{
uchar m ;
//P0=0xFF ; //置P0口
// P2=0xFF ; //置P2口
delay(10) ; //延时
lcd_init() ; //初始化LCD

lcd_pos(0) ; //设置显示位置为第一行的第1个字符
m = 0 ;
while(cdis1[m] != '\0')
{ //显示字符
lcd_wdat(cdis1[m]) ;
m++ ;
}

lcd_pos(0x40) ; //设置显示位置为第二行第1个字符
m = 0 ;
while(cdis2[m] != '\0')
{
lcd_wdat(cdis2[m]) ; //显示字符
m++ ;
}
dis_buf = 0x2d ; //显示字符"-"

while(1)
{
keydown() ;
lcd_pos(0x4c) ;
lcd_wdat(dis_buf) ; //第一位数显示
}
}



相关文档
最新文档