搜索
您的当前位置:首页正文

4X4矩阵键盘+1602——51单片机的Proteus实验

来源:好走旅游网
4X4矩阵键盘+1602——51单片机的Proteus实验

本文转载自小波电子工作室。

C语言源代码

//======================================================

依次可以从键盘输入0-f,在1602LCD上显示出来

(此程序在所买开发板上验证通过)

//======================================================

//******** 小波电子工作室 All rights reserved******

//******** 个人主页:http://hi.baidu.com/niejinbo **

//******** 文 件 名: lcd_key.1.c ************

//******** 功能概要: 4*4矩阵键盘扫描 ***********

//******** MCU: STC89C52 晶振:11.0592Mhz **********

//******** 设 计 者: 聂金波 ************

//******** 完成日期: 2008-07-14 ************

//******** 当前版本: 0714.1 ************

//******** 改进说明: 暂无 ************

//******** 补充说明: 从键盘输入0-F,在LCD上显示出来

//*********头文件区*******************

#include

#include

#include

#define uchar unsigned char

#define uint unsigned int

//*********定义变量区*******************

sbit dula=P2^6; //关闭数码管显示之用

sbit wela=P2^7;

sbit lcden=P3^4; //LCD使能信号

sbit lcdrs=P3^5; //LCD数据/命令选择信号

uchar tab_key[50];

uchar code tab[]=\"0123456789abcdef\";

uchar n=0,temp,key;

//*********函数声明区********************

void lcd_disp(); //LCD显示函数

void lcd_init(); //LCD初始化函数

void write_com(uchar); //写命令函数

void write_data(uchar); //写数据函数

void delay(uint); //延迟函数

void key_scan(); //键盘扫描函数

void key_manage1(); //键盘功能分配函数

void key_manage2();

void key_manage3();

void key_manage4();

void key_manage5();

void key_manage6();

void key_manage7();

void key_manage8();

void key_manage9();

void key_manage10();

void key_manage11();

void key_manage12();

void key_manage13();

void key_manage14();

void key_manage15();

void key_manage16();

//**********主函数开始**********

void main()

{

lcd_init();

write_com(1);

while(1)

{

key_scan();

lcd_disp();

}

}

//**********LCD显示函数开始***********

void lcd_disp()

{

uchar a,i=0;

write_com(0x80);

for(i=0;i{

a=tab_key[i];

write_data(tab[a]);

}

}

//**********LCD初始化函数开始*********

void lcd_init()

{

dula=0;

wela=0; // 关闭数码管显示

lcden=0;

write_com(0x38); //设置显示模式:16X2,5X7,8位数据接口

write_com(0x0c); //开显示,显示光标,光标闪烁

write_com(0x06); //读写一个字符后,地址指针及光标加一,且光标加一整屏显示不移动

write_com(0x80); //设置光标指针

}

//**********写命令函数开始************

void write_com(uchar com)

{

lcdrs=0; //低电平写命令

P0=com; //写入命令

delay(3); //延时约3ms

lcden=1; //LCD使能端置高电平

delay(5); //延时约5ms

lcden=0; //LCD使能端拉低电平

}

//**********写数据函数开始************

void write_data(uchar dat)

{

lcdrs=1; //低电平写数据

P0=dat; //写入命令

delay(3); //延时约3ms

lcden=1; //LCD使能端置高电平

delay(5); //延时约5ms

lcden=0; //LCD使能端拉低电平

}

//**********键盘扫描函数开始****

void key_scan()

{

//**********扫描第一行*********

P3=0xfe;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(100);

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xee:

key_manage1();

break;

case 0xde:

key_manage2();

break;

case 0xbe:

key_manage3();

break;

case 0x7e:

key_manage4();

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

//**********扫描第二行*********

P3=0xfd;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(100);

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xed:

key_manage5();

break;

case 0xdd:

key_manage6();

break;

case 0xbd:

key_manage7();

break;

case 0x7d:

key_manage8();

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

//**********扫描第三行*********

P3=0xfb;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(100);

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xeb:

key_manage9();

break;

case 0xdb:

key_manage10();

break;

case 0xbb:

key_manage11();

break;

case 0x7b:

key_manage12();

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

//**********扫描第四行*********

P3=0xf7;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(100);

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xe7:

key_manage13();

break;

case 0xd7:

key_manage14();

break;

case 0xb7:

key_manage15();

break;

case 0x77:

key_manage16();

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

}

//*********延时函数开始**************

void delay(uint k)

{

uint i,j;

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

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

}

//******键盘功能分配函数群开始********

// 键盘功能示意图

// 设计者:聂金波

//** 1 ** 2 ** 3 ** 4 **

//** 5 ** 6 ** 7 ** 8 **

//** 9 ** 0 ** s ** c **

//** M1** M2** M3** M4**

void key_manage1()

{

tab_key[n]=0;

n++;

}

void key_manage2()

{

tab_key[n]=1;

n++;

}

void key_manage3()

{

tab_key[n]=2;

n++;

}

void key_manage4()

{

tab_key[n]=3;

n++;

}

void key_manage5()

{

tab_key[n]=4;

n++;

}

void key_manage6()

{

tab_key[n]=5;

n++;

}

void key_manage7()

{

tab_key[n]=6;

n++;

}

void key_manage8()

{

tab_key[n]=7;

n++;

}

void key_manage9()

{

tab_key[n]=8;

n++;

}

void key_manage10()

{

tab_key[n]=9;

n++;

}

void key_manage11()

{

tab_key[n]=10;

n++;

}

void key_manage12()

{

tab_key[n]=11;

n++;

}

void key_manage13()

{

tab_key[n]=12;

n++;

}

void key_manage14()

{

tab_key[n]=13;

n++;

}

void key_manage15()

{

tab_key[n]=14;

n++;

}

void key_manage16()

{

tab_key[n]=15;

n++;

}

Proteus仿真图

依次从键盘输入:abcd 277817639 (本人QQ号)

4X4矩阵键盘

-Proteus截图

因篇幅问题不能全部显示,请点此查看更多更全内容

Top