⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 51

📁 51单片机应用系统典型模块开发大全
💻
字号:
//-----------------------函数声明,变量定义---------------------------
#include <reg51.h>           //头文件
#include <absacc.h>          //XBYTE 宏定义
#define uchar unsigned char//类型定义
#define uint unsigned int   //类型定义
#define com XBYTE[0x7f00]   //8155命令状态寄存器地址
#define pa  XBYTE[0x7f01]   //8155的A口地址
#define pb  XBYTE[0x7f02]   //8155的B口地址
#define pc  XBYTE[0x7f03]   //8155的C口地址
#define LED1 P1              //键号十位显示数码管驱动口
#define LED2 P2              //键号个位显示数码管驱动口
sbit  iom=P1^7;              //8155的I/O与RAM选择端口
const uchar tab[]={         //7段共阳极数码管的段选码表
	0xc0,0xf9,0x24,0x30,   //0~3
	0x19,0x12,0x02,0x78,   //4~7
	0x00,0x18,0x08,0x03,   //8~b
	0x46,0x21,0x06,0x0e,   //c~f
	0x7f                      // 数码管灭
};
//-----------------------函数声明------------------------------------
bit press(void);             //判断是否有键按下,有返回1,没有返回0
uchar read(void);            //扫描键盘,返回键值
uchar show(uchar row);      //显示键号
void delay_50us(uint m);    //延时子程序

//****************************//
main()
{
	uchar row3;
    iom=1;                    //8155的IO定义
	com=0x0c;                 //8155 C口设置为输出口,A口设置为输入口
	while(1)
	{
		row3=read();         //读按键号
		show(row3);          //显示键号
         while(press());     //等待键释放
         delay_50us(50);     //延时,防止数码管闪烁
	}
}

bit press(void)
{
	uchar hang;
	pc=0x00;                 //4行输出全‘0’
	hang=pa;                 //读A口数据 列号
	if(hang!=0xff)          //看是否不全为高电平
		return(1);          //有低电平时,表示有键按下,返回1
	else
		return(0);          //全为高电平时,表示无键按下,返回0
}


uchar read(void)
{
	uint t;
	uchar hang,lie,keyscan,j,value;
	value=0x00;
	if(press()==1)
	{
		delay_50us(200);                       //延时去抖
		if(press()==1)
		{
			hang=0xfe;                         //输出监测行号赋初值,监测第1行
//****************逐行扫描开始****************//
			for(t=0;t<4;t++)                  //逐行监测循环
			{ 
				pc=hang;                       //输出行监测码
				lie=pa;                        //读列号段码,有键按下的位为0
				if(lie!=0xff)                 //如果不为全1,表示该行有键按下
//****************计算键号开始****************//
				   for(j=0;j<8;j++)          //看是8列中的哪列有键按下
			       {
				       if((lie&0x01)!=0x01) //是第j列吗
				       {                        //是
					    keyscan=j+value;     //列号+行号×8=键号
					    return(keyscan);     //返回键号
				       }
				       else                     //不是
				       {
					   lie>>=1;               //列段码右移,继续监测最低位
				       }				
			        }
//****************计算键号结束****************//
				else                            //否则,该行无键按下准备监测下一行
				{
					hang=(hang<<1)|0x01;    //行监测码左移
					value+=0x08;             //每监测一行无键按下时,键号加8
				}
			}
//****************逐行扫描结束****************//
		}
		return(0xff);
	}
	return(0xff);                               //无键按下时,返回FFH
}


uchar show(uchar row)
{
    uchar row1,row2;
if(row==0xff)              //无键按下时    
	{
		LED1=tab[16];         //2个数码管灭
		LED2=tab[16];	
	}
	else
	{                            //有键按下
		row1=row/10;          // 16进制键号除以10,得十位
		row2=row%10;          // 16进制键号对10求余数,得个位
		LED1=tab[row1];      //显示十位
		LED2=tab[row2];      //显示个位
	}
}


void delay_50us(uint t)
{
	uchar j; 
	for(;t>0;t--)
		for(j=19;j>0;j--);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -