首页
基础教程 | 单片机设计实例 | 常用芯片 | 电子基础
当前位置:单片机教程 >> 单片机设计实例 >> 浏览文章 今天是:
单片机设计实例

单片机键盘的扫描查询方式输入

作者:    来源:本站原创    点击数:   更新时间:2008年07月06日   
 

//本程序用于pic单片机外接键盘的识别,通过编程,使按下K1键时第一个数码管显示1,按下K2键时第一
//个数码管上显示2,按下K3键时第一个数码管上显示3,按下K4键时第一个数码管上显示4,
//程序由http://www.51hei.com 提供,有问题请联系单片机网。
//对键盘的扫描采用查询方式。

#include "p18f458.h"

static volatile int table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};
volatile unsigned char data;
unsigned int i;
unsigned char j=0;

/*初始化子程序*/
void initial()
{
TRISA=0x00; /*A口设置为输出*/
TRISB=0XF0; /*RB1输出,RB4输入*/
TRISC=0x00; /*SDO引脚为输出,SCK引脚为输出*/
TRISE=0x00; /*E口设置为输出*/
INTCON=0x00; /*关闭所有中断*/
SSPCON1=0x30; /*SSPEN=1;CKP=1,FOSC/4*/
SSPSTAT=0xC0; /*时钟下降沿发送数据*/
PIR1=0; /*清除SSPIF标志*/
}

/*软件延时子程序*/
void DELAY()
{
for(i = 6553; --i ;)
continue;
}

/*键盘扫描子程序*/
int KEYSCAN()
{
PORTBbits.RB1=0;
PORTAbits.RA3=0;
PORTE=0; /*将K1,K2,K3,K4四条列线置0*/
while(1)
{
if (PORTBbits.RB4==0)
break;
} /*等待有键按下,RB4为0表示有键按下*/
DELAY(); /*软件延时*/
if (PORTBbits.RB4==0)
KEYSERVE(); /*如果仍有键按下,则调用键服务子程序*/
else j=0x00; /*如果为干扰,则令返回值为0*/
return(j);
}

/*键服务子程序*/
int KEYSERVE()
{
PORTBbits.RB1=0; /*K1,K2置低电平,K3,K4置高电平*/
PORTAbits.RA3=0; /*RB4为0,表示按键为K1,K2中的一个*/
PORTE=3; /*RB4为1,表示按键为K3,K4中的一个*/
if(PORTBbits.RB4==0)
{
PORTBbits.RB1=0; /*K1置低电平,K2置高电平*/
PORTAbits.RA3=1; /*RB4为0,表示按键为K1;RB4为1,表示按键为K2*/
if(PORTBbits.RB4==0) j=0X01;
else {j=0X02; PORTAbits.RA3=0;}
}
else
{
PORTEbits.RE0=0; /*K3置低电平,K4置高电平*/
PORTEbits.RE1=1; /*RB4为0,表示按键为K3;RB4为1,表示按键为K4*/
if(PORTBbits.RB4==0) j=0X03;
else {j=0X04; PORTEbits.RE1=0;}
}
while(1)
{
if(PORTBbits.RB4==1) break; /*为了防止一次按键多次识别,等键松开才返回*/
}
return(j);
}

/*显示子程序*/
void SPILED(char data)
{
PORTAbits.RA5=0; /*LACK送低电平,为锁存做准备*/
SSPBUF=data; /*启动发送*/
do
{
;
}while(PIR1bits.SSPIF==0); /*等待发送完毕*/
PIR1bits.SSPIF=0; /*清除SSPIF标志*/
PORTAbits.RA5=1; /*最后给锁存信号,代表显示任务完成*/
}

/*键盘扫描查询方式输入主程序*/
main()
{
initial(); /*系统初始化*/
while(1)
{
KEYSCAN();
if(j!=0) /*如果j=0,证明先前的按键为干扰,则不予显示*/
{
data=table[j];
SPILED(data); /*发送显示段码显示*/
}
}
}




 
发表评论】【告诉好友】【打印此文】【收藏此文】【关闭窗口
网友评论(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
 >> 推荐文章
单片机USB-ISP下载线制作
自制单片机实验板
单片机一键多功能按键识别设
 >> 阅读排行
keil教程
单片机电子时钟设计
单片机DS18B20水温控制系统
单片机交通灯设计
单片机课程设计
单片机时钟设计
单片机数字钟设计
单片机键盘程序(4×4矩阵式
单片机串口通讯
单片机秒表设计
 >> 相关文章
51学习板4*4键盘的c51与汇编程序
51单片机实验板DS18B20测温程序
单片机控制机械手设计论文
51单片机可调数码钟
c8051f系列单片机应用介绍
stc单片机下载协议研究
单片机控制LED按1闪1秒按2闪10秒
基于8051单片机采用VP1410的工业
基于8051单片机采用VP1410的工业
关于单片机复位电路原理的争论

站长:刘兴国 站长信箱:372xcom1@21cn.com
单片机教程 @ www.51hei.com 2007-2008