📄 test51.c
字号:
/*
****************************************************************************************************
* 沈阳市万柳塘路56号
* (c)著作权2005,世信汇诚电子版权所有
* 世信汇诚电子的源代码是不公开, 属于世信汇诚电子的企业机密文件, 任何未经允许使用
* 或发表的行为都是违法行,任何个人或组织尝试或者参与修改源代码的行为,都应尽早得到世信
* 汇诚电子设计组的同意.
*
* 版本号:1.0
* 作 者:linan4526
* 日 期:2005-05-08
*---------------------------------------------------------------------------------------------------
* 描 述:SXHC-I型MCU51实验
****************************************************************************************************
*/
#include <test51.h>
/**********************************************************************
函数功能: 定时器中断函数(扫描键盘)(10ms 16位定时)
入口参数: 无
出口参数: 无
***********************************************************************/
void Time0_Func() interrupt 1
{
TH0=(0xffff-9259)/256;
TL0=(0xffff-9259)%256;
Key_Scan();
Disp_Func();
}
/**********************************************************************
函数功能: 显示刷新函数
入口参数: 无
出口参数: 无
***********************************************************************/
void Disp_Func(void)
{
P0=0xff; /*清除显示*/
P0=g_bpDisp[g_bCurrent_Local];/*显示段码*/
if (g_bCurrent_Local)/*刷新DS2*/
{
Setb_Func(DS1_CS);
Clr_Func(DS2_CS);
g_bCurrent_Local=0;
}
else/*刷新DS1*/
{
Setb_Func(DS2_CS);
Clr_Func(DS1_CS);
g_bCurrent_Local=1;
}
P2=g_bP2_Io;/*更新P2口状态*/
}
/**********************************************************************
函数功能: 清相应IO口函数(仅限中断服务函数使用)
入口参数: bPort:相应IO口
出口参数: 无
***********************************************************************/
void Clr_Func(byte bPort)
{
bit btEa_Bak;
btEa_Bak=EA;
EA=0;
bPort =~ bPort;
g_bP2_Io &= bPort;
EA=btEa_Bak;
}
/**********************************************************************
函数功能: 置相应IO口函数(仅限中断服务函数使用)
入口参数: bPort:相应IO口
出口参数: 无
***********************************************************************/
void Setb_Func(byte bPort)
{
bit btEa_Bak;
btEa_Bak=EA;
EA=0;
g_bP2_Io |= bPort;
EA=btEa_Bak;
}
/**********************************************************************
函数功能: 判断行列键是否有键函数
入口参数: 无
出口参数: 0/1 无键/有键
***********************************************************************/
byte Key_Func(void)
{
byte bI;
Clr_Func(KEY_OUT1);
Clr_Func(KEY_OUT2);
P2 = g_bP2_Io;
bI=P2;
if ((bI&KEY_IN1) && (bI&KEY_IN2))
return 0;
else
return 1;
}
/**********************************************************************
函数功能: 行列键盘扫描函数
入口参数: 无
出口参数: 0/1 无键/有键
***********************************************************************/
void Key_Scan(void)
{
byte bK,bKey,bLine,bRow;
if (Key_Func())
{
if (g_btKey_Press || g_btKey_Flag)
{ /*键盘未抬起或键值未处理则不扫描键盘*/
return;
}
Setb_Func(KEY_OUT2);
for (bRow=0; bRow<2; bRow++)
{
if (bRow)
{
Setb_Func(KEY_OUT1);
Clr_Func(KEY_OUT2);
}
P2=g_bP2_Io;
bK=P2;
bK &=(KEY_IN1 | KEY_IN2);
bK>>=2;
switch (bK)
{
case 1:
bLine=0;
break;
case 2:
bLine=1;
break;
default :
bLine=0xff;
break;
}
if (bLine!=0xff)
{
bKey=bLine+bRow*2;/*扫描到键值*/
break;
}
}
if (g_bKey_Bak != bKey)/*为去抖而备份当前按键*/
{
g_bKey_Time=0;
g_bKey_Bak=bKey;
}
else
{
if (g_bKey_Time==2)/*去抖有效*/
{
g_bKey=g_bKey_Bak;
g_bKey_Bak=0xff;
g_btKey_Press=1;
g_btKey_Flag=1;
Clr_Func(BELL_ON);
}
else/*去抖*/
g_bKey_Time++;
}
}
else/*按键抬起*/
{
g_btKey_Press=0;
Setb_Func(BELL_ON);
}
}
/**********************************************************************
函数功能: 扫描键盘函数
入口参数: bFlag:0/1 死等/不死等
出口参数: 0/1 无键值/有键值
***********************************************************************/
byte Wait_Key(byte bFlag)
{
if (bFlag)
{
if (g_btKey_Flag)
{
g_btKey_Flag=0;
return 1;
}
else
return 0;
}
else
{
while (!g_btKey_Flag);
g_btKey_Flag=0;
return 1;
}
}
/**********************************************************************
函数功能: 转换显示数据函数
入口参数: bDisp_Data 显示数据0~99
出口参数: 无
***********************************************************************/
void Hex_To_Disp(byte bDisp_Data)
{
byte bI,bJ,bpDisp[2];
if (bDisp_Data<100)
{
bI=Bin_Bcd_Func((dword)bDisp_Data,bpDisp);/*二进制转十进制*/
for (bJ=0; bJ<bI; bJ++)/*查找显示段码*/
{
bpDisp[bJ]=g_bpDisp_Seg[bpDisp[bJ]];
}
if (bI==1)
{ /*如果转换十进制结果为一位,则将此位移到个位*/
Right_Move(bpDisp,1,1,g_bpDisp_Seg[0]);
}
while (g_bCurrent_Local);/*等待上次数据显示完*/
ET0=0;
Init_Array_Func(2,g_bpDisp,0xff);
for ( bJ=0; bJ<2; bJ++)/*更新显示数据*/
g_bpDisp[bJ]=bpDisp[bJ];
ET0=1;
}
}
/**********************************************************************
函数功能: 上电初始化函数
入口参数: 无
出口参数: 无
***********************************************************************/
void Power_Up(void)
{
TMOD = 0x01;/*Time0为16位*/
TH0=(0xffff-9259)/256;
TL0=(0xffff-9259)%256;
IE=0x82; /*开启定时器中断0*/
TR0=1;
g_bP2_Io=0xff;
g_bKey_Bak=0xff;
}
/**********************************************************************
函数功能: 主函数
入口参数: 无
出口参数: 无
***********************************************************************/
void main()
{
Power_Up();
while (1)
{
if (Wait_Key(0))
{
Hex_To_Disp(g_bKey);/*显示当前键值*/
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -