本文转载自小波电子工作室。
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截图 因篇幅问题不能全部显示,请点此查看更多更全内容