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

📄 keyboard_1.h

📁 用KeilC写的键盘按键识别及整数输入程序
💻 H
字号:

#include <reg52.h>
//#include <math.h>
#define uchar unsigned char
#define uint unsigned int
//本文件假定键盘接在P1口,P10~P1.3为输入线,P1.4~P1.7为输出线,输出0

sbit P30=P3^0;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P31=P3^1;
uchar Key;//当前按下的键

uchar Val[10];//将输入的数字存放到这个数组,以便计算
uchar Ni;//一个数由几个位组成
uchar CO2str[8];//存放CO2浓度数据,以字符形式存放以例显示
uint Num;//输入的数(整数)或变量
unsigned char GetKey();
uchar a;//标志:计算Num的数据时用到
char NumStr[10];//这个数组存放输入数字的ASCII码,用来显示
uint GetNum(); //从键盘获得输入的整数  
void IntToStr(uint co2,char* s);//将整数CO2转化成字符串放以数组S中。
uint ReadAD(bit b);//读取AD转换值
uint pow(uchar n);//求10的n次方的函数,不用math函提供的函数以减小Hex文件长度
//uint NumToVolt(uchar Num);//将AD转换值转换成电压,单位是毫伏。

uint pow(uchar n)
{   uchar i;uint temp=1;
    for(i=0;i<n;i++)
        temp*=10;
	return temp;
}



void IntToStr(uint co2,char* s)
{
    uchar i,n;
	for(i=0;i<8;i++) s[i]='\0';//将原来的内容清空
	i=0;
	while(co2/pow(i)>=1) {i++;}//获得数据有多少数据位
	for(n=0;n<i;n++)
		s[n]=(uchar)(((int)(co2/pow(i-n-1)))%10+0x30);  
	
}

uint GetNum()//从键盘获得输入的整数
{
 Begin:   Ni=0;
	for(a=0;a<10;a++) NumStr[a]='\0';
	while(GetKey()!='F')
	{
	  Val[Ni]=Key;
	  //NumStr[Ni]=Key+0x30;
	  LCD_write_char(Ni,1,Key+0x30);
	  if(Val[Ni]>9)//如果输入了字母就重新开始输入
	  {
	     CLEARSCREEN;
	     LCD_write_string(0,0,"Enter Again:");
	     goto Begin;
	  }
	  Ni++;
    }
	if ((Ni>5)|| ((Ni==5)&&Val[0]>=3)&&(Val[1]>=2))
	{
	  CLEARSCREEN;
	  LCD_write_string(0,0,"Enter Again:");
	  goto Begin;
	 }
	 
    Num=0;    
	for(a=0;a<Ni;a++)
	   Num+=Val[Ni-1-a]*pow(a);
	return Num;
}

void s()
{
   unsigned char a=0;
   for(a=0;a<3;a++)
    ;
}
bit TestKey()
{ 
   P1=0x0f;
   s();
   if (P1==0x0f)
      return 0;
   else
      return 1;   //有键按下返回1,否则返回0
}
uchar GetKey()
{       
      	 
	  while(!TestKey())//无键按下什么都不做
	  {; }    
      //有键按下时判断哪个键按下
      P1=0xef;
	  s();	  	  
	  if(P1==0xee) {Key=0x01;goto NEXT;}//1
      if(P1==0xed) {Key=0x05;goto NEXT;}//5
	  if(P1==0xeb) {Key=0x09;goto NEXT;}//9
	  if(P1==0xe7) {Key='C';goto NEXT;}//C

	  P1=0xdf;
	  s();	  
	  if(P1==0xde) {Key=0x02;goto NEXT;}//2
	  if(P1==0xdd) {Key=0x06;goto NEXT;}//6
	  if(P1==0xdb) {Key=0x00;goto NEXT;}//0
	  if(P1==0xd7) {Key='D';goto NEXT;}//'D';

	  P1=0xbf;
	  s();	  
	  if(P1==0xbe) {Key=0x03;goto NEXT;}//3;
	  if(P1==0xbd) {Key=0x07;goto NEXT;}//7
	  if(P1==0xbb) {Key='A';goto NEXT;}//A
	  if(P1==0xb7) {Key='E';goto NEXT;}//E

	  P1=0x7f;
	  s();	  
	  if(P1==0x7e) {Key=0x04;goto NEXT;}//4
	  if(P1==0x7d) {Key=0x08;goto NEXT;}//8
	  if(P1==0x7b) {Key='B';goto NEXT;}//B
	  if(P1==0x77) {Key='F';goto NEXT;}//F

NEXT: while(TestKey()) {;}
      
      return Key;
}

/*********************************************************************/
/*********************************************************************/
//下面是ADC0832部分 
sbit AD_CS=P2^0;
sbit AD_DI=P2^1;
sbit AD_DO=P2^2;
sbit CLK=P2^3;


uint ReadAD(bit b)
{
    uchar tem=0x00;//AD转换值
	uchar i=0x00;//
	uint uInt;
	double d;
  //初始化AD转换
   AD_DI=1;
   AD_CS=0;
   CLK=1;
   s();
   CLK=0;
   s();
   AD_DI=1;
   s();
   CLK=1;
   s();
   CLK=0;
   s();s();
   if (b==0)
      AD_DI=0;//通道0
   else
      AD_DI=1;//通道1

   CLK=1;
   s();
   CLK=0;
   s();

//  读AD数据,存入tem中    
	for(i=0;i<8;i++)
	{  CLK=1;s();s();
	   CLK=0;s();s();
	   tem=(tem<<1)|AD_DO;
	}
	AD_CS=1;
// 读AD完毕

//以下代码将数字量转化成对应的电压值,单位是毫伏
 //  return (((uint)tem)*1000/51);	
    
    d=19.61*tem;
	uInt=d;
	return uInt;
}





⌨️ 快捷键说明

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