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

📄 1602.c

📁 s52单片机对PS2键盘的输入解码
💻 C
字号:
/*======缩写说明=========
PB---判别
SF---是否
ZL---指令
SJ---数据
QD---确定
WZ---位置	
========================*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

void Delay5Ms(void);

sbit 	RS = P1^0;            // P10口接4脚,1-数据寄存器,0-指令寄存器
sbit 	RW = P1^1;            // P11口接5脚,1-读操作,0-写操作
sbit 	E  = P1^2;            // P12口接6脚,使能


/*=========================
  读忙子程序 RS=0 RW=1 E=1
  =========================*/
 bit  PB_busy(void)
{  
 uchar temp ;
 bit  busy=1;
 RS=0;
 RW=1;
 E=1;	
 while(busy)
	{
		E = 0 ;
		temp = P2 ;
		E = 1 ;                  	//读忙
		temp = temp & 0x80;
		if(temp)    busy=1;         //当检测到忙,则一直检测,程序进入循环
          	else    busy=0;         //等待不忙
	}
    return busy;                 	//返回忙标志,可能有用
	   
}


 /*==========================
 写指令子程序 RS=0 RW=0 E=1
 ============================*/
void  Write_ZL(uchar ZL)
{   
 if(  !PB_busy()  )             	//判断不忙则写指令
	{ 
		RS=0; RW=0;
		P2 = ZL ;
		E=1;
		E=0;
	}

}


/*==========================
 写单个数据 RS=1 RW=0 E=1
============================*/
void  Write_SJ(uchar SJ)
{   
 if(  !PB_busy()  ) 
	{ 
		RS=1; RW=0;
		P2 = SJ ;
		E = 1 ;
		E = 0 ;
	}
}


/*===============================
确定字符位置字程序 x---列  y---行
================================*/
void QD_WZ(uchar x,uchar y)
{
	uchar address;
	if(y==0)  address = 0x80 + x ;		//x,y都从0计起
	else      address = 0xc0 + x ;
	Write_ZL(address);
}


/*===============================
写字符串子程序(可以大于于17个字符)
=================================*/
void  Write_SJS(uchar X,uchar Y,uchar *SJS)
{
 uchar i,l=0;                      //l为数组长度
 while(SJS[l]>31) l++ ;            //1602内存的字符都大于31(00011111), 求出字符串的长度
 for(i=0;i<l;i++)
	{
		QD_WZ(X,Y);
	 	Write_SJ(SJS[i]);
     	X++;
		if(X>=16)                         //多于16个字符
		  {
			Y^=1 ;                        //换行
			X = 0;                        //从第一个开始
		  }
	}
}
/*=====
初试化:
=======*/
void Reset(void)
{   
 uchar n;
 for(n=0;n<3;n++)               	//3次,不检测忙信号(故未直接用函数)
	{
		RS=0;RW=0;E=1;
		P2=0x38;                  	//八位总线,双行显示,显示5X10的点阵字符
		E=1;E=0;
		Delay5Ms();
	};
 Write_ZL(0x38); 			  		//需要检测忙信号
 Write_ZL(0x0e);
 Write_ZL(0x0d);               		//关显示
 Write_ZL(0x01); 
 Delay5Ms();
//	Write_ZL(0x01);               	//显示清屏
 Write_ZL(0x06);				 	//光标设置,光标右移,文字不移动
 Delay5Ms();
 Write_ZL(0x0c);				  	//开显示,设置光标
    								/*未用到指令5*/	
}


// 短延时
void Delay5Ms(void)
{
	uint c=5552;
	while(c--);
}

⌨️ 快捷键说明

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