单片机矩阵键盘扫描程序
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a,b=0;
if(hang == 1) a = 0x80;
{
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;
uint keyflag ; //键盘正在读取标志位,如果Keyflag为1,表示正在读取键盘,停止其他功能;
char x,y,m,n,c;
//Keyflag为0,读取键盘结束,恢复其他功能
char flag1=0;
//频率范围10~1000Hz
uchar Hrate = 0;//一个周期内高点平占据时间
E = 0;
delay();
P0 = del;
delay();
E = 1;
delay();
E = 0;
}
/********************************************************************
*名称: L1602_init()
*功能: 1602初始化,请参考16பைடு நூலகம்2的资料
bit Busy(void)
{
bit busy_flag = 0;
RS = 0;
RW = 1;
E = 1;
delay();
busy_flag = (bit)(P0 & 0x80);
E = 0;
return busy_flag;
}
/********************************************************************
*名称: getKeyNum()
*功能:读取一个键码值
*输入:无
*输出:无
***********************************************************************/
void getKeyNum()
{
//不停的检查有无键盘按下,若按下,则开始进行下面的操作。
*名称: L1602_char(uchar hang,uchar lie,char sign)
*功能:改变液晶中某位的值,如果要让第一行,第五个字符显示"b",调用该函数如下
L1602_char(1,5,'b')
*输入:行,列,需要输入1602的数据
*输出:无
***********************************************************************/
*名称: L1602_string(uchar hang,uchar lie,uchar *p)
*功能:改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef",调用该函数如下
L1602_string(1,5,"ab cd ef;")
*输入:行,列,需要输入1602的数据
*输出:无
}
/********************************************************************
*名称: bit Busy(void)
*功能:这个是一个读状态函数,读出函数是否处在忙状态
*输入:输入的命令值
*输出:无
***********************************************************************/
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);
}
/********************************************************************
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;
for(x=0;x<=148;x++);
}
/********************************************************************
*名称: Keyscan()
*功能:实现按键的读取。下面这个子程序是按处理矩阵键盘的基本方法处理的。
*输入:无
*输出:按键值
}
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;
}
}
}
}
/*******************************************************************
*输入:无
*输出:无
***********************************************************************/
void L1602_init(void)
{
wcmd(0x38);
wcmd(0x0c);
wcmd(0x06);
wcmd(0x01);
}
/********************************************************************
*功能: 1602写数据函数
*输入:需要写入1602的数据
*输出:无
***********************************************************************/
void wdata(uchar del)
{
while(Busy());
RS = 1;
RW = 0;
RS = 0;
RW = 0;
E = 0;
delay();
P0 = del;
delay();
E = 1;
delay();
E = 0;
}
/********************************************************************
*名称: wdata(uchar del)
***********************************************************************/
uchar Keyscan(void)
{
uchar i,j,x, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};
for(j=0; j<4; j++)
*功能:延时,延时时间大概为5US。
*输入:无
*输出:无
***********************************************************************/
void delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
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) {;}
case 10:return 9;break;
case 11:return 15;break;
case 13:return 0;break;
default:return 18;
}
}
temp <<= 1;
}
}
}
/*****************************************************************/
*名称: wcmd(uchar del)
*功能: 1602命令函数
*输入:输入的命令值
*输出:无
***********************************************************************/