📄 de.c
字号:
/**********************************************************************
/* 文件名称: de.C
/* 文件标识: none
/* 适用器件: C8051F120
/* 摘 要: 本文件是键盘子程序;使用外部22.1184MHz晶振.
/* 当前版本:1.0
/* 作 者:李国涛
/* 完成日期:2007年11月2日
/***********************************************************************/
/**********************************************************************/
//INCLUDE引用外部头文件
#include <c8051f120_VarantReg.h>
#include <ABSACC.H>
#include "da-i.c"
/**********************************************************************/
/************************************************************************
// 常量及全局变量定义
************************************************************************/
/***********************************************************************/
unsigned char Key_Value_Table[48]={ 0x53,0x30,0x31,0x53,0x30,0x32,0x53,0x30,0x33,0x53,0x30,0x34, //S01,S02,S03,S04
0x53,0x30,0x35,0x53,0x30,0x36,0x53,0x30,0x37,0x53,0x30,0x38, //S05,S06,S07,S08
0x53,0x30,0x39,0x53,0x31,0x30,0x53,0x31,0x31,0x53,0x31,0x32, //S09,S10,S11,S12
0x53,0x31,0x33,0x53,0x31,0x34,0x53,0x31,0x35,0x53,0x31,0x36};//S13,S14,S15,S16
uchar rs232_send_size;
uchar key; //key 是执行keyscan读取的值
uchar temp; //temp是执行KeySPI的结果
/* TIMER0 INI */
bit time_1ms_flag;
bit time_10ms_flag;
bit time_50ms_flag;
bit time_100ms_flag;
bit time_500ms_flag;
bit time_1s_flag;
bit time_60s_flag;
sbit P3_5=P3^5;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
uchar time_1ms;
uchar time_10ms;
uchar time_50ms;
uchar time_100ms;
uchar time_500ms;
uchar time_1s;
uchar time_60s;
bit send_flag ;
/************************************************************************/
/************************************************************************
* 函数名称:send_232;
* 函数功能描述:向232发送字符到SBUF0;
************************************************************************/
void send_232(send_232_end,uchar send_232_code[])
{
if(rs232_send_size<send_232_end)
{
SBUF0=send_232_code[rs232_send_size];
rs232_send_size++;
}
}
/******************************************************
* 函数名称:serial_0();
*
* 函数功能描述:UART0采用定时中断的方式通过串0口发送字符,字符个数为3个
*
* 输入参数:none
*
* 返回数据:none;
******************************************************/
void serial_0(void) interrupt 4
{
if ( TI0 )
{
send_232(3,&Key_Value_Table[3*temp-3]);
TI0=0;
}
if ( RI0 )
{
RI0=0;
}
}
/*********************************************************
* 函数名称:delay();
*
* 函数功能描述:是一个延时程序;
*
* 输入参数:x1
*
* 返回数据:none;
********************************************************/
void delay(int x1)
{
unsigned int y1;
for (y1=1;y1<x1;y1++);
}
/**********************************************************
*将按键的原代码转化为1--16
* 函数名称:char KeySPI();
*
* 函数功能描述:执行keyscan函数出来的编码原则是 {11 21 41 81} 如果要显示1--16的数值.那么就用case语句.再返回数值;
{12 22 42 82}
{14 24 44 84}
{18 28 48 88}
* 输入参数:key;
*
* 返回数据:temp;
***********************************************************/
unsigned char KeySPI(unsigned char key)
{
switch(key)
{
case 0x11: return 1;//0x01
break;
case 0x21: return 2;//0x02
break;
case 0x41: return 3;//0x03
break;
case 0x81: return 4;//0x04
break;
case 0x12: return 5;//0x05
break;
case 0x22: return 6;//0x06
break;
case 0x42: return 7;//0x07
break;
case 0x82: return 8;//0x08
break;
case 0x14: return 9;//0x09
break;
case 0x24: return 10;//0x0a
break;
case 0x44: return 11;//0x0b
break;
case 0x84: return 12;//0x0c
break;
case 0x18: return 13;//0x0d
break;
case 0x28: return 14;//0x0e
break;
case 0x48: return 15;//0x0f
break;
case 0x88: return 16;//0x10
break;
default: return 0x00;
break;
}
}
/***********************************************************
* 函数名称:getkey();
* 函数功能描述:按键的扫描判断与取值
* 输入参数:none;
*
* 返回数据:none;
*
* 注 意:none;
**********************************************************/
unsigned char getkey(void)
{
uchar h; //行扫描值
uchar l; //列扫描值
SFRPAGE=CONFIG_PAGE ;
P5=0xF0; //P5.0~P5.3 发全0.准备读列的状态
if((P5&0xF0)!=0xF0) //如果P5.4~P5.7不全为1,可能有键按下
{
delay(100);
delay(100); //延时去抖动
if((P5&0xF0) != 0xF0) //重读高4位,如果还是不全为1,有按键按下
{
h=0xFE; //P5.0置0,开始行扫描
while((h&0x10)!=0xF0) //判断是否为最后一行,若不是继续扫描=F0的时候表示没有到最后一行;
{ //如果为F0,那么还没有到最后一行;如果不为F0那么就已经到最后一行;
P5=h;
delay(100);
if((P5&0xF0) != 0xF0) //如果P5.4~P5.7不全为1,可能有键按下
{
l=((P5&0xF0)|0x0F); //保留P5口高四位.低四位变为1,作为列值
delay(100);
return ((~h)+(~l)); //按键值=行扫描值+列扫描值
}
else //如果该行无键按下,行扫描值左移.扫描下一行
h=(h<<1)|0x01; //这样做保证每一次就只有一位为"0"
}
}
}
return 0; //无键按下,返回0
}
/*************************************************
* 函数名称:keyup();
* 函数功能描述:按键的释放;
* 输入参数:none;
*
* 返回数据:none;
*
* 注 意: none;
**************************************************/
uchar keyup(void)
{
unsigned char val=0xff;
while(1)
{
val=getkey();
if(val != 0)
break;
}
while(1)
{
if(val!=getkey())break;
}
return val;
}
/**************************************************
* TIMER0
*定时器0;
***************************************************/
timer0() interrupt 1
{
TH0=0xfa;
TL0=0x00; //1ms的初始值
time_1ms_flag=1;
time_10ms++;
if(time_10ms == 10)
{
time_50ms++;
time_10ms=0;
time_10ms_flag=1;
}
if(time_50ms == 5) //设置50ms扫描一次键盘
{
time_100ms++;
time_50ms = 0;
time_50ms_flag = 1;
key=keyup(); //按键扫描
if( key!= 0 ) //表示有按键按下
{
send_flag = 1;
}
}
if(time_100ms == 2)
{time_500ms++;time_100ms=0;time_100ms_flag=1;}
if(time_500ms == 5)
{time_1s++;time_500ms=0;time_500ms_flag=1;}
if(time_1s == 2)
{time_60s++;time_1s=0;time_1s_flag=1;}
if(time_60s == 60)
{time_60s=0;time_60s_flag=1;}
}
/************************************************************************
//主循环程序
*LED灯点亮表示等待按键.
************************************************************************/
void main()
{
Init_Device();
SFRPAGE=UART0_PAGE;
P3_5=1;
P2_4=1;
P2_5=1;
P2_6=1;
while(1)
{
if(send_flag== 1) //表示有按键值,下一步的动作就是送串口显示
{
rs232_send_size=0;
temp=KeySPI(key);
SFRPAGE=UART0_PAGE;
TI0=1;
send_flag= 0;
}
}
}
/***********************************************************************************/
// 文件结束
/***********************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -