📄 mainkey1.c
字号:
#include <absacc.h>
#include "Disp.h"
#include "I2C.h"
#include <reg51.h>
#include <string.h>
//定义TLC549操作接口
sbit CS = P3^2;
sbit DAT = P3^3;
sbit CLK = P3^4;
char key;
/*
函数:ReadAdc()
功能:读取A/D转换结果
返回:8位ADC代码
*/
unsigned char ReadAdc()
{
unsigned char d;
unsigned char n;
CS = 0;
n = 5;
while ( --n != 0 );
n = 8;
do
{
d <<= 1;
if ( DAT ) d++;
CLK = 1;
CLK = 0;
}while ( --n != 0 );
CS = 1;
return d;
}
/*
函数:AdcInit()
功能:初始化ADC接口
*/
void AdcInit()
{
CS = 1;
CLK = 0;
DAT = 1;
ReadAdc();
}
/*
函数:DispVol()
功能:将ADC值转换成电压值,并显示
参数:
v:8位ADC结果
*/
void DispVol(unsigned char v)
{
unsigned char x100,x10,x;
v=v*250/256;
x100=v/100;
DispChar(0,x100+48);
x10=(v-x100*100)/10;
DispChar(1,x10+48);
x=(v-x100*100)%10;
DispChar(2,x+48);
DispDotOn(0);
}
/*
函数:Delay()
功能:延时1ms~65.536s
参数:
t>0时,延时(t*0.001)s
t=0时,延时65.536s
*/
void Delay(unsigned int t)
{
do
{
TH0 = 0xFC;
TL0 = 0x66;
TR0 = 1;
while ( !TF0 );
TR0 = 0;
TF0 = 0;
} while ( --t != 0 );
}
/*
函数:SysInit()
功能:系统初始化
*/
void SysInit()
{
TMOD &= 0xF0;
TMOD |= 0x01; //设置T0为16位定时器
DispInit(); //数码管扫描显示初始化
I2C_Init(); //初始化I2C总线
AdcInit();
Delay(200);
DispP();
}
/*
函数:LM75A_GetTemp
功能:读出LM75A的温度值
返回:LM75A温度寄存器的数值(乘以0.125可得到摄氏度值)
*/
int LM75A_GetTemp()
{
unsigned char buf[2];
int t;
I2C_Gets(0x90,0x00,2,buf);
t = buf[0];
t <<= 8;
t += buf[1];
t >>= 5; //去掉无关位
return t;
}
/*
函数:ByteToStr()
功能:字节型变量c转换为十进制字符串
*/
void ByteToStr(unsigned char idata *s, unsigned char c)
{
code unsigned char Tab[] = {100,10};
unsigned char i;
unsigned char t;
for ( i=0; i<2; i++ )
{
t = c / Tab[i];
*s++ = '0' + t;
c -= t * Tab[i];
}
*s++ = '0' + c;
*s = '\0';
}
/*
函数:DispTemp()
功能:显示出温度值
参数:
t:补码,除以8以后才是真正温度值
*/
void DispTemp(int t)
{
code unsigned char Tab[8][4] =
{
"000",
"125",
"250",
"375",
"500",
"625",
"750",
"875"
};
unsigned char buf[4];
bit s; //符号位
unsigned char i; //整数部分
unsigned char d; //小数部分
unsigned char x; //临时变量
//分离出符号
s = 0;
if ( t < 0 )
{
s = 1;
t = -t;
}
//分离出整数和小数部分
i = t / 8;
d = t % 8;
//整数部分转换成字符串
ByteToStr(buf,i);
x = 4 - strlen(buf);//调整光标
//清除所有显示
DispClear();
//显示符号
if ( s )
{ DispChar(x,'-');}
x++;
//显示整数部分
DispStr(x,buf);
//显示小数点
DispDotOn(4);
//显示小数部分
DispStr(5,Tab[d]);
}
//按键识别
int keyvalue()
{
switch(XBYTE[0XE000])
{case ~0x01: key=1;break;
case ~0x02: key=2;break;
case ~0x04: key=3;break;
case ~0x80: key=8;break;
default: key=0;
}
return key;
}
void main(void)
{ unsigned char keyv;//键值
unsigned char v; //voltage
int t; //temperature
SysInit();
Delay(100);
Delay(300);
for(;;)
{ if(XBYTE[0XE000]!=0xff)
keyv=keyvalue();
switch(keyv)
{
case 1:
{
v=ReadAdc();
DispClear();
DispVol(v);
Delay(250);
if(XBYTE[0XE000]!=0xff) //检测键盘状态并延时1秒
{keyv=keyvalue();break;}
Delay(250);
if(XBYTE[0XE000]!=0xff)
{keyv=keyvalue();break;}
Delay(250);
if(XBYTE[0XE000]!=0xff)
{keyv=keyvalue();break;}
Delay(250);
if(XBYTE[0XE000]!=0xff)
{keyv=keyvalue();break;}
t = LM75A_GetTemp();
DispClear();
DispTemp(t);
Delay(250);
if(XBYTE[0XE000]!=0xff) //检测键盘状态并延时1秒
{keyv=keyvalue();break;}
Delay(250);
if(XBYTE[0XE000]!=0xff)
{keyv=keyvalue();break;}
Delay(250);
if(XBYTE[0XE000]!=0xff)
{keyv=keyvalue();break;}
Delay(250);
if(XBYTE[0XE000]!=0xff)
{keyv=keyvalue();break;}
break;
}
case 2:
{
v=ReadAdc();
DispClear();
DispVol(v);
Delay(300);
break;
}
case 3:
{
t = LM75A_GetTemp();
DispClear();
DispTemp(t);
Delay(300);
break;
}
case 8:
{DispClear();
DispP();
break;}
default:
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -