4 4键盘c语言程序,STC89c52单片机c语言编程

以下程序除了你所提出的要求外,多了个把按的数发送到串口的功能。

#include

#include

/*******************************************/

#define uchar unsigned char

#define uint unsigned int

/*******************************************/

#define KEYPORT P1

#define DATAPORT P2

sbit e=P3^5;

sbit rs=P3^6;

sbit rw=P3^7;

/*******************************************/

//4X4键盘

/****************4X4按键******************/

//两个延时

//delay(uint x)

void delay(uint x)

{

uint i, j;

for(i = x; i > 0; i--)

{

for (j = 110; j > 0; j--);

}

}

//delay1(uint x)

void delay1(uint x)

{

uint i, j;

for(i = x; i > 0; i--)

{

for (j = 19; j > 0; j--);

}

}

uchar getkey()

{

uchar PP1=0XFF;

uchar key=0xFF;

KEYPORT=0XF0;

PP1=KEYPORT;

key=(PP1&0XF0);

KEYPORT=0X0F;

PP1 = KEYPORT;

key=(key|(PP1&0X0F));

return key;

}

uchar GETKEY_QUDOU()

{

uchar key=0xff;

while((key=getkey())==0xff);

delay(20);

if(key==getkey())

{

while(getkey()!=0xff);

return key;

}

else

return 0xff;

}

uchar yima(uchar key)

{

uchar ktemp=key;

uchar kval=0xff;

switch (ktemp)

{

case 0xee: kval = 1; break;

case 0xed: kval = 2; break;

case 0xeb: kval = 3; break;

case 0xe7: kval = 4; break;

case 0xde: kval = 5; break;

case 0xdd: kval = 6; break;

case 0xdb: kval = 7; break;

case 0xd7: kval = 8; break;

case 0xbe: kval = 15; break;

case 0xbd: kval = 9; break;

case 0xbb: kval = 0; break;

case 0xb7: kval = 14; break;

case 0x7e: kval = 10; break;

case 0x7d: kval = 11; break;

case 0x7b: kval = 12; break;

case 0x77: kval = 13; break;

default: kval=0xff;break;

}

return kval;

}

uchar keyscan()

{

return yima(GETKEY_QUDOU());

}

uchar wkey()

{

uchar kv=0xff;

while((kv=keyscan())==0xff);

return kv;

}

/*******************************************/

//串口

void s_init()

{

SCON = 0X52;//工作方式1,11。

0592M。

9600 可接收

TMOD=0X20;

TH1=0XFD;

TL1=0XFD;

TR1=1;

}

/*******************************************/

//LCD1602

/**********************************************/

/**********************************************/

//写命令

void Write_Cmd(uchar com)

{

e=0;

rs=0;

rw=0;

DATAPORT=com;

delay1(10);

e=1;

delay1(25);

e=0;

}

/**********************************************/

//写数据

void Write_Data(uchar dat)

{

e=0;

rs=1;

rw=0;

DATAPORT=dat;

delay1(10);

e=1;

delay1(25);

e=0;

}

/**********************************************/

//lcd1602初始化

void lcd_init()

{

delay(15);

Write_Cmd(0x38);

delay(5);

Write_Cmd(0x38);

delay(5);

Write_Cmd(0x38);

Write_Cmd(0x38);

Write_Cmd(0x01);

Write_Cmd(0x0f);

Write_Cmd(0x06);

//Write_Cmd(0x80 0x042);//写入显示缓冲区起始地址为1行2列

}

void lcd_play(uchar kv)

{

static uchar i=3;

i ;

if(i>=10)

{ i=4;

Write_Cmd(0x01);

}

Write_Cmd(0x80 0x40 i);

Write_Data(kv);

}

/*************************主程序****************************************/

void main()

{

uchar kv=0xff;

s_init();

lcd_init();

printf(" WELCOM TO USE:

");

while(1)

{

kv=wkey();

if(kv<10)

kv=0x30 kv;

else

kv=kv-10 'A';

printf("CURRENT KEY : %c

",kv);

lcd_play(kv);

}

}。

全部

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值