单片机矩阵键盘扫描程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
/********************************************************************
*名称: bit Busy(void)
*功能:这个是一个读状态函数,读出函数是否处在忙状态
*输入:输入的命令值
*输出:无
***********************************************************************/
*名称: getKeyNum()
*功能:读取一个键码值
*输入:无
*输出:无
***********************************************************************/
void getKeyNum()
{
//不停的检查有无键盘按下,若按下,则开始进行下面的操作。
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a,b=0;
if(hang == 1) a = 0x80;
*输入: x (延时一毫秒的个数)
*输出:无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;j<i;j++)
void L1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
wcmd(a);
wdata(sign);
}
/********************************************************************
uint keyflag ; //键盘正在读取标志位,如果Keyflag为1,表示正在读取键盘,停止其他功能;
char x,y,m,n,c;
//Keyflag为0,读取键盘结束,恢复其他功能
char flag1=0;
//频率范围10~1000Hz
uchar Hrate = 0;//一个周期内高点平占据时间
if(hang == 2) a = 0xc0;
a = a + lie - 1;
while(1)
{
wcmd(a++);
b++;
if((*p == '\0')||(b==16)) break;
wdata(*p);
p++;
}
}
/********************************************************************
扫描程序
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit E=P2^7;//1602使能引脚
sbit RW=P2^6;//1602读写引脚
sbit RS=P2^5;//1602数据/命令选择引脚
case 10:return 9;break;
case 11:return 15;break;
case 13:return 0;break;
default:return 18;
}
}
temp <<= 1;
}
}
}
/*****************************************************************/
uchar Lrate = 0;//一个周期内低电平占据时间
uint FREQ0; //定时器T0的计数变量//
uint FREQ1; //定时器T1的计数变量//
sbit P2_1=P2^0; //设置P2.1,作为信号输出口//
uint disbuf[3];
uint figure=0;
int sum2=0;
*名称: L1602_string(uchar hang,uchar lie,uchar *p)
*功能:改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef",调用该函数如下
L1602_string(1,5,"ab cd ef;")
*输入:行,列,需要输入1602的数据
*输出:无
*名称: 1602液晶显示
*功能:显示占空比值和频率值
*输入:无
*输出:无
/***********************************************************************/
void ShowNum( )
{if(max==2) {L1602_char(2,6,sum2/10+0x30) ;
for(x=0;x<=148;x++);
}
/********************************************************************
*名称: Keyscan()
*功能:实现按键的读取。下面这个子程序是按处理矩阵键盘的基本方法处理的。
*输入:无
*输出:按键值
*输入:无
*输出:无
***********************************************************************/
void L1602_init(void)
{wenku.baidu.com
wcmd(0x38);
wcmd(0x0c);
wcmd(0x06);
wcmd(0x01);
}
/********************************************************************
*名称: L1602_char(uchar hang,uchar lie,char sign)
*功能:改变液晶中某位的值,如果要让第一行,第五个字符显示"b",调用该函数如下
L1602_char(1,5,'b')
*输入:行,列,需要输入1602的数据
*输出:无
***********************************************************************/
uchar ReadKey()
{
while(1)
{
P1 = 0xf0;
if(P1 != 0xf0)
{
Delay_1ms(20);//按键消抖
if(P1 != 0xf0)
{
Delay_1ms(20);//按键消抖
if(P1 != 0xf0)
{
x= Keyscan();
P1=0xf0;
while(P1!=0xf0) {;}
uchar i=0,j=0,temp=0;
i=Readkey();
if(i==10)
{ count=0;
flag=1;
max=2;
disbuf[0]=0;
disbuf[1]=0;
disbuf[2]=0;
}
if(i==11)
{count=0;
flag=1;
max=3;
disbuf[0]=0;
{
P1 = Buffer[j];
temp = 0x10;
for(i=0; i<4; i++)
{
if(!(P1 & temp))
{
x= i+j*4;
switch(x)
{ case 0:return 1; break;
case 1:return 2; break;
case 2:return 3;break;
*功能:延时,延时时间大概为5US。
*输入:无
*输出:无
***********************************************************************/
void delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
bit Busy(void)
{
bit busy_flag = 0;
RS = 0;
RW = 1;
E = 1;
delay();
busy_flag = (bit)(P0 & 0x80);
E = 0;
return busy_flag;
}
/********************************************************************
RS = 0;
RW = 0;
E = 0;
delay();
P0 = del;
delay();
E = 1;
delay();
E = 0;
}
/********************************************************************
*名称: wdata(uchar del)
}
L1602_char(1,11,' ') ;
L1602_char(1,12,' ') ;
}
/********************************************************************
*名称: Delay_1ms()
*功能:延时子程序,延时时间为1ms * x
E = 0;
delay();
P0 = del;
delay();
E = 1;
delay();
E = 0;
}
/********************************************************************
*名称: L1602_init()
*功能: 1602初始化,请参考1602的资料
L1602_char(2,7,sum2%10+0x30) ;
L1602_char(2,8,'%') ;
}
if(max==3)
{
L1602_char(1,6,sum1/100+0x30) ;
L1602_char(1,7,sum1%100/10+0x30) ;
L1602_char(1,8,sum1%100%10+0x30) ;
case 3:return 11;break;
case 4:return 4;break;
case 5:return 5;break;
case 6:return 6;break;
case 7:return 10;break;
case 8:return 7;break;
case 9:return 8;break;
*功能: 1602写数据函数
*输入:需要写入1602的数据
*输出:无
***********************************************************************/
void wdata(uchar del)
{
while(Busy());
RS = 1;
RW = 0;
}
if(x<10)
{y=x+0x30;
L1602_char(1,11,' ');
L1602_char(1,12,y);
}
else
{
m=x/10+0x30;
n=x%10+0x30;
L1602_char(1,11,m) ;
L1602_char(1,12,n) ;
}
return x;
}
}
}
}
/*******************************************************************
***********************************************************************/
uchar Keyscan(void)
{
uchar i,j,x, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};
for(j=0; j<4; j++)
int sum1=0;
int flag=0;
uint count=0;
uint max=0;
uint disbuf_temp=0;
/********************************************************************
*名称: 1602显示延时函数delay()
*名称: wcmd(uchar del)
*功能: 1602命令函数
*输入:输入的命令值
*输出:无
***********************************************************************/
void wcmd(uchar del)
{
while(Busy());
相关文档
最新文档