📄 pmkguan.c.bak
字号:
#include <reg52.h>
#define a 0x01
#define b 0x02
#define c 0x04
#define d 0x08
#define e 0x10
#define f 0x20
#define g 0x40
#define dot 0x80
#define H 10
#define L 11
#define P 12
sbit sd=P2^ 7;
sbit sp=P3^ 5;
unsigned char set;
unsigned char KEY_Variable[3];
unsigned int tmep;
unsigned char code disp_code[] = {
a+b+c+d+e+f, // 0
b+c, // 1
a+b+d+e+g, // 2
a+b+c+d+g, // 3
b+c+f+g, // 4
a+c+d+f+g, // 5
a+c+d+e+f+g, // 6
a+b+c, // 7
a+b+c+d+e+f+g, // 8
a+b+c+d+f+g, // 9
b+c+e+f+g, //H
d+e+f, //L
a+b+e+f+g, //P
b+c+g, //+
g, //-
};
void sendbyte(unsigned char yte)
{ P2=0;
sd=1;
P0=disp_code[yte];
//sd=0;
}
void display(unsigned int i)
{ unsigned int k;
unsigned char j,m,q;
unsigned int s[6];
s[0] = i/10000;
k = i%10000;
s[1] = k/1000;
k = k%1000;
s[2] = k/100;
k = k%100;
s[3] = k/10;
k = k%10;
s[4] = k;
j=0x40;
q=2;
for(k = 0; s[k] == 0 && k<3; k++);
if (k==3) k--; // if all bytes are '0', get back one position
if(s[4]==0)
{
q--;
if(s[3]==0)q--;
}
do
{
if(k==2)
{
m=j>>4;
}
P2=(m|j);
P0=(disp_code[s[k++]]);
j>>=1;
}
while (k<3);
while(q&(j>0x0f))
{
P2=(m|j);
P0=(disp_code[s[k++]]);
j>>=1;
q--;
}
}
#define KEY_SET 0x07//设置键
#define KEY_UP 0x0b//向上键
#define KEY_DOEN 0x0d//向下键
#define KEY_RUN 0x0e//运行键
#define KEY_P1 P1
/***************************************************************************************************
函数名称:KEY_JIEXI(unsigned int Variable)
函数入口:
unsigned int Variable :采集到的键盘值,就是P2、P3口的数值。
函数出口:
功能描述:键盘解析,通过采样的数值分析出当前按下的是那个键。(包括复合键)并针对键进行相应的操作
关键点描述:无
****************************************************************************************************/
KEY_JIEXI(unsigned int Variable)
{
sp=0;
switch(Variable)
{
//单键。。。。
case KEY_RUN: //0x01运行键
set=0;
tmep=0;
break;
case KEY_DOEN: //0x02向下键
if(set)
set--;
else
set=14;
break;
case KEY_UP: //0x04向上键
if(set<14)
{ set++;
}
else
set=0;
break;
case KEY_SET: //0x07设置键
tmep=tmep+8;
break;
default:
break;
}
sp=1;
}
/***************************************************************************************************/
/***************************************************************************************************
函数名称:KEY()
函数入口:空
函数出口:空
功能描述:键盘消抖
设计思想:
建立一个键盘值保存缓冲区KEY_Variable[3],能够连续保存最近的三次采样到的键盘值。当最后两次采
样到的值相等并且和倒数第三次的值不相等时,说明有按键按下。进行确认。当三次的采样值都相等时,说
明此按键已经确认过了,不进行确认。
****************************************************************************************************/
KEY()
{
unsigned char key_buf;
KEY_Variable[2]=KEY_Variable[1];
KEY_Variable[1]=KEY_Variable[0];
EA = 0;
key_buf=KEY_P1;
KEY_Variable[0] =key_buf&0xc0;
KEY_Variable[0] >>=4;
KEY_Variable[0]|=(key_buf&0x03);
if(KEY_Variable[0] == KEY_Variable[1])
{
if(KEY_Variable[1] == KEY_Variable[2])
{
return;
}
else
{
KEY_JIEXI(KEY_Variable[0]); //分析按下的是什么键,并做相应的处理。
}
}
return;
}
void main(void){ /* SCON = 0x52; // 8-bit UART mode TMOD = 0x20; // timer 1 mode 2 auto reload TH1= 0xfd; // 9600 8n1 //TR1 = 1; // run timer1*/
P1=0xff;
P0=0x00;
P2=0xff;
while(1)
{
KEY();
sendbyte(set);
display(tmep);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -