一种可以按照64个LED 指示点击按键的仪器
技术领域****
本实用新型涉及一种可以按照64个LED 指示点击按键的仪器,尤其是一种可以按照LED指示点击按键的仪器。
背景技术****
现有点击按键都是依靠操作人员的记忆和判断来进行的,一种可以按照64个LED 指示点击按键的仪器是一种可以通过LED灯点亮或熄灭来提示操作人员点击对应64个按键的仪器。这就方便了操作人员点击按键,为操作人员点击按键提供了方便。当1个发光二极管LED灯点亮时,操作人员点击这个发光二极管LED灯对应的那个按键时,这个发光二极管LED灯就会熄灭,相应的,下一个需要操作人员点击的那个按键所对应的发光二极管LED灯就会点亮,此时操作人员点击这个灯所对应的按键,发光二极管LED灯就会熄灭,相应的下一个发光二极管LED灯就会点亮。这样周而复始,操作人员就会按照LED点亮的顺序点击按键达到控制设备的目的。
实用新型内容****
为了解决点击64的按键需要大量记忆工作的缺点,一种可以按照64个LED 指示点击按键的仪器是一种可以提示操作人员按照发光二极管LED灯点亮顺序点击按键的仪器。它的电路如图1所示。单片机STC89C52RC(1)控制按键驱动芯片HD7279(2)按照64个发光二极管的点亮顺序点击64个按键。用户可以通过芯片PL2303HX(3)个单片机下载程序。该仪器的电路和程序可以在百度网盘pan.baidu.com/s/12xdhZVVS…
#include <reg52.h>
//*** 函数定义 ***
void long_delay(void); // 长延时
void short_delay(void); // 短暂延时
void delay10ms(unsigned char); // 延时10MS
void write7279(unsigned char, unsigned char); // 写入到HD7279
unsigned char read7279(unsigned char); // 从HD7279读出
void send_byte(unsigned char); // 发送一个字节
unsigned char receive_byte(void); // 接收一个字节
//*** 变量及I/O口定义 ***
unsigned char digit[5];
unsigned char key_number, j, k,m,n;
unsigned int tmr;
unsigned long wait_cnter;
unsigned char code dis_code[65]
=
{16,17,1,2};
unsigned char code dis_code1[256]
=
{0,1,2,3,4};
unsigned char code dis_code2[9]
=
{0,1,2,3,4,5,6,7,8};
unsigned char code dis_code3[65]
=
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
unsigned char code dis_code4[256]
=
{0,1,2,3,4,5,6,7,8,9,10,11,12};
unsigned char code dis_code5[128]
=
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};
unsigned char code dis_code6[65]
=
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
unsigned char code dis_code7[256]
=
{0,1,2,3,4,5,6,7,8,9,10};
unsigned char code dis_code8[128]
=
{0,1,2,3,4,5,6,7,8,9,10,11};
unsigned char code dis_code9[128]
=
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
sbit cs=P1^4; // cs at P1.4
sbit clk=P1^5; // clk 连接于 P1.5
sbit dat=P1^2; // dat 连接于 P1.2
sbit key=P1^3; // key 连接于 P1.3
sbit S1=P0^0; // key 连接于 P1.3
sbit S2=P0^1; // key 连接于 P1.3
sbit S3=P0^2; // key 连接于 P1.3
//****** HD7279A 指令 ******
#define CMD_RESET 0xa4
#define CMD_TEST 0xbf
#define DECODE0 0x80
#define DECODE1 0xc8
#define CMD_READ 0x15
#define UNDECODE 0x90
#define RTL_CYCLE 0xa3
#define RTR_CYCLE 0xa2
#define RTL_UNCYL 0xa1
#define RTR_UNCYL 0xa0
#define ACTCTL 0x98
#define SEGON 0xe0
#define SEGOFF 0xc0
#define BLINKCTL 0x88
void write7279(unsigned char cmd, unsigned char dta)
{
send_byte (cmd);
send_byte (dta);
}
unsigned char read7279(unsigned char command)
{
send_byte(command);
return(receive_byte());
}
void send_byte( unsigned char out_byte)
{
unsigned char i;
cs=0;
long_delay();
for (i=0;i<8;i++)
{
if (out_byte&0x80)
{
dat=1;
}
else
{
dat=0;
}
clk=1;
short_delay();
clk=0;
short_delay();
out_byte=out_byte*2;
}
dat=0;
}
unsigned char receive_byte(void)
{
unsigned char i, in_byte;
dat=1; // set to input mode
long_delay();
for (i=0;i<8;i++)
{
clk=1;
short_delay();
in_byte=in_byte*2;
if (dat)
{
in_byte=in_byte|0x01;
}
clk=0;
short_delay();
}
dat=0;
return (in_byte);
}
void long_delay(void)
{
unsigned char i;
for (i=0;i<0x30;i++);
}
void short_delay(void)
{
unsigned char i;
for (i=0;i<8;i++);
}
// ******* 延时n个1MS *******
// ******* 输入:n 延时个数 *******
void delay1ms(unsigned char n)
{
unsigned int i;
while(n --)
{
for(i = 0;i < 125;i ++); // i ++ ,8μS 左右
}
}
// ******* 延时n个10MS *******
// ******* 输入:n 延时个数 *******
void delay10ms(unsigned char n)
{
unsigned int i;
while(n --)
{
for(i = 0;i < 1250;i ++); // i ++ ,8μS 左右
}
}
void delay(void)
{
unsigned int n;
for(n=0;n<10000;n++)
;
}
//*** 主程序 ***
//*** 主程序 ***
void main()
{
TCON=0x05; //打开外部中断1,并设置为下降沿触发
IE=0x85; //开总中断和外部中断1
if(S1==0) //有键按下吗?(k1=0 ?)
{ delay(); //延时一段时间 //延时消抖
if(S1==0) //确实是有键按下,则:
{ for (j=0;j<256;)
{
write7279(SEGON,dis_code[j]); // 将64个显示段逐个点亮
if (!key) // 如果有键按下
{
key_number=read7279(CMD_READ); // 读出键码
if (key_number==dis_code[j]) // 如果有键按下
{
write7279(SEGOFF,dis_code[j]); // 将64个显示段逐个点亮
// delay10ms(50);
j++;
}
} }
while(!S1);} //等待按键放开
}
if(S2==0) //有键按下吗?(k2=0 ?)
{ delay(); //延时一段时间
if(S2==0) //确实是有键按下,则:
{for (k=0;k<256;)
{
write7279(SEGON,dis_code1[k]); // 将64个显示段逐个点亮
if (!key) // 如果有键按下
{
key_number=read7279(CMD_READ); // 读出键码
if (key_number==dis_code1[k]) // 如果有键按下
{
write7279(SEGOFF,dis_code1[k]); // 将64个显示段逐个点亮
// delay10ms(50);
k++;
}
}
while(!S3);} //等待按键放开
}
}
if(S3==0) //有键按下吗?(k1=0 ?)
{ delay(); //延时一段时间 //延时消抖
if(S3==0) //确实是有键按下,则:
{ for (j=0;j<256;j++)
{
write7279(SEGON,dis_code2[j]); // 将64个显示段逐个点亮
write7279(SEGOFF,dis_code2[j-1]); // 同时将前一个显示段关闭
// delay10ms(50);
}
while(!S1);} //等待按键放开
}
}
上述的一种可以按照64个LED 指示点击按键的仪器,所述的是一种可以按照64个LED灯点亮顺序点击64个按键的仪器。
附图说明****
下面结合附图和实施例对本实用新型进一步说明。
图1为本实用新型电路原理图。
图1中,1. 单片STC89C52RC,2. 按键控制芯片HD7279,3.串口转换芯片PL2303。
具体实施方式****
图1中,单片STC89C52RC(2)通过芯片HD7279(2)控制64个LED指示灯和64个按键。用户可以通过芯片PL2303给单片机STC89C52烧写程序。
上盖板(1)安装在侧板1(2),侧板2(3)上部,底板(4)安装在侧板1(2),侧板2(3)下部,上圆弧形连接片(5)安装在侧板1(2),侧板2(3)上部,下圆弧形连接片(6)安装在侧板1(2),侧板2(3)下部。