📄 key_disp.txt
字号:
#include <REG51.H> //"D:\Keil\C51
#include <ABSACC.H>
#include <ADC_TEMP.H>
extern unsigned char ReadAdc();//读ADC转化的数字量
extern void DispVol(unsigned char v); //将电压值输入Dispbuf中
extern void LcdLightOn();
extern void LcdLightOff();
extern void LcdPuts(unsigned char *s);
extern void LcdClearme(unsigned char ac);/*自定义函数************/
extern int LM75A_GetTemp();//读温度值
extern void DispTemp(int t);//显示温度值
extern uchar v1,v2;//旧电压值和新电压值
extern int t1,t2;//旧温度值和新温度值
Code uchar disp_seg[]=
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0xF3,0x40,0x3D,0x39};
//0 1 2 3 4 5 6 7 8 9 全灭 p - V C 的数码管字型数据hgfedcba
uchar DispBuf[8]; //其中的数字指示是disp_seg[]中第几位码
uchar bdata key_flag=0; //定义键盘状态标志位
sbit key_first_flag=key_flag^0;
sbit key_delay_flag=key_flag^1;
sbit key_valid_flag=key_flag^2;
uchar key_value; //key_value=0:no key,or key_value=1-8 stand for key1-key8
void DispClear(); //清除数码管的所有显示
void DsipP(); //显示p
void DispInit(); //数码管扫描显示初始化
/*
函数:T1INTSVC()
功能:定时器T1的中断服务函数
*/
void T1INTSVC() interrupt 3
{
code unsigned char com[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
static uchar key_value_temp,n=0;
uchar key_in,i;
TR1 = 0;
TH1 = 0xF8;
TL1 = 0xCD;//0xfc66:1ms for 11.0592MHz,0xf8cd:2ms,0xb800:20ms,0x4c00:50ms
P1 = 0xFF; //暂停显示
if((DispBuf[n]&0x80)==0x80) //带小数点显示
{ DispBuf[n]=DispBuf[n]&0x7f;
LED_OUT=~(disp_seg[DispBuf[n]]|0x80);//更新扫描数据
}
else
LED_OUT=~disp_seg[DispBuf[n]];
P1 = ~com[n]; //重新显示
if(key_first_flag==0)
{ key_in=KEY_IN;
if(key_in!=0xff)
{ for(i=0;i<n;i++) //n:当前扫描键
key_in=key_in>>1;
if((key_in&0x01)==0x00) //若键按下则对应KEY_IN的输入口为0
{ key_first_flag=1; //置标志
key_value_flag=i; //暂存
}
}
}
else if(key_delay_flag==0&&n==key_value_temp)
{ key_in=KEY_IN;
for(i=0;i<n;i++)
key_in=key_in>>1;
if((key_in&0x01)==0x00) //一轮扫描之后 8*2ms=16ms,第一次按下的键仍被按下
key_delay_flag=1;
}
else if(key_delay_flag==1&&n==key_value_temp)
{ key_in=KEY_IN;
for(i=0;i<n;i++)
key_in=key_in>>1;
if((key_in&0x01)==0x01) //在一轮扫描之后按键已释放,有效
{ key_valid_flag=1;
key_value=key_value_temp+1;
}
}
n++;
n &= 0x07;
v2=ReadAdc();
if((v2!=v1)&&(key_value_process==1||key_value_process==3||key_value_process==4))
{
DispClear();
DispVol(v2);
if(key_value_process==4)
{ LcdClearme(16); //自定义函数
LcdPuts(DispBuf);
LcdLightOn();
LcdLightOff();
}
v1=v2;
}
t2=LM75A_GetTemp();
if((t2!=t1)&&(key_value_process==2||key_value_process==3||key_value_process==4))
{ DispClear();
DispTemp(t2);
if(key_value_process==4)
{ LcdClearme(48); //自定义函数
LcdPuts(DispBuf);
LcdLightOn();
LcdLightOff();
}
t1=t2;
}
TR1 = 1;
}
/*
函数:DispClear()
功能:清除数码管的所有显示
*/
void DispClear()
{ unsigned char i;
for(i=0;i<8;i++)
{ DispBuf[i]=0x0A;
}
}
/*
函数:DispP()
功能:显示“P ”
*/
void DsipP()
{ DispClear();
DispBuf[7]=0x0B;//disp_seg[]的第11(0x0B)个显示码
}
/*
函数:DispInit()
功能:数码管扫描显示初始化
*/
void DispInit()
{ DispClear();
EA = 0;
TMOD &= 0x0F;
TMOD |= 0x10;
TH1 = 0xF8;
TL1 = 0xCD;
TR1 = 1;
ET1 = 1;
EA = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -