#include<reg51.h>
#include<stdio.h>
#define uchar unsigned char;
#define uint unsigned int;
sbit I0=P1^4;
sbit I1=P1^5;
sbit I2=P1^6;
sbit I3=P1^7;
sbit P3_0=P1^0; //LED164_DATA
sbit P3_1=P1^1; //LED164_CLK
//***********************************************************初始化程序***************************************//
void read_flag(void)
{
TMOD=0x20;//T1工作方式2,自动重装
TH1=0xFD; //Baud:9600 fosc=11.0592MHz
TL1=0xFD; //Baud:9600 fosc=11.0592MHz
SCON=0x50;//工作方式1(01) 此时TI和RI初始值已经为0
PCON=0x00; //SOMD=0
TR1=1;//允许计数脉冲进入计数器
EA=1;//中断总允许开关
ES=1;//串行中断允许开关
}
//***********************************************************初始化程序***************************************//
//**************************************************************发送子程序**********************************//
void send(unsigned char key)
{
SBUF=key;
while(!TI); //TI=1发送完毕
TI=0; //软件复位清零
}
//**************************************************************发送子程序**********************************//
//**************************************************************接收子程序**********************************//
uchar receive()
{
unsigned char buf;
while(RI) //RI=1表示有数据进来 可以认为允许接收
{
buf=SBUF;
RI=0; //软件复位清零
}
return(buf);
}
//**************************************************************接收子程序**********************************//
//*********************************************************显示所需数组**********************************//
unsigned char disp_buffer[4];
unsigned char dis[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e}; //LED段码0TOf
unsigned char point[]={0x00,0x00,0x00,0x00}; //不显示小数点
unsigned char d[4];
//*********************************************************显示所需数组*************************************//
//***********************************************************动态扫描显示*************************************//
void display()
{
disp_buffer[0]=dis[d[0]];
disp_buffer[1]=dis[d[1]];
disp_buffer[2]=dis[d[2]];
disp_buffer[3]=dis[d[3]];
}
//***********************************************************动态扫描显示*************************************//
//*********************************************************延时子程序,每加1增加0.5ms*************************//
void delay(int i)
{
for (;i>0;i--)
{char j=244;
while(--j);}
}
//*********************************************************延时子程序,每加1增加0.5ms*************************//
//**************************************************************LED数码显示驱动子程序***********************//
void disp_led(void)
{unsigned char gsb,led,led1,jj;
for(gsb=0;gsb<4;gsb++) //四位LED显示
{
led=disp_buffer[gsb]; //led显示的位数
for(jj=0;jj<8;jj++) //8段显示
{
led1=led&0x1;
if (led1==0x1) //逻辑判断
P3_0=1;//DATA=1
else
P3_0=0;//DATA=0
P3_1=0;P3_1=1;//clk=0~1 上跳沿有效
led=led>>1; //led左移一位
}
}
}
//**************************************************************LED数码显示驱动子程序***********************//
void scankey()
{
unsigned char ch[18]={0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x00};
//*********************0****0****1*****2***3*****4****5****6****7****8****9****a****b***c*****d****e****f***0****//
//*********************0****1****2*****3***4*****5****6****7****8****9***10***11***12***13***14***15***16***17***//
static unsigned char app=0x01;
static unsigned char bpp=0x01;
static unsigned char bit1,bit2,bit3;
if(I2==0&&I1==1)
{
delay(100);
if(I2==0&&I1==1) //个位 加一键被按下
{
app=app+1; //个位加一
}
}
if(I3==0&&I1==1)
{
delay(100);
if(I3==0&&I1==1)
{
app=app-1; //个位减一
}
}
if(I2==0&&I1==0)
{
delay(100);
if(I2==0&&I1==0) //十位加一键
{
bpp=bpp+1; //十位加一
}
}
if(I3==0&&I1==0)
{
delay(100);
if(I3==0&&I1==0)
{
bpp=bpp-1; //十位减一
}
}
if(app==17)
{
app=1;
}
if(bpp==17)
{
bpp=1;
}
if(app==0)
{
app=16;
}
if(bpp==0)
{
bpp=16;
}
bit1=ch[app];
bit2=ch[bpp];
bit3=bit2*16+bit1;
delay(100);
d[0]=0;
d[1]=0;
d[2]=bit2;
d[3]=bit1;
display();
disp_led();
if(I0==0)//有按键按下,执行读键盘发送程序
{
delay(6);
if(I0==0)
{
d[0]=0;
d[1]=0;
d[2]=bit2;
d[3]=bit1;
display(); //调用led动态扫描程序
disp_led(); //调用led显示程序
delay(6);
send(bit3); //把数据发送到PC机上
delay(2000);
}
}
}
//**************************************************************主函数**************************************//
void main()
{
static unsigned char datas;
static unsigned char lowbit=0x00;
static unsigned char highbit=0x00;
read_flag(); //调用初始化程序
while(1)
{
while (RI) //RI=1表示有数据进来 可以认为允许接收
{
datas=receive();
send(datas);
lowbit=datas&0x0F;
highbit=datas/16; //数据左移四位
d[0]=0;
d[1]=0;
d[2]=highbit;
d[3]=lowbit;
display(); //调用led动态扫描程序
delay(6);
disp_led(); //调用led显示程序
delay(2000);//延时为发送速度的二倍(延时为每次0.5ms)
scankey()=0;
}
scankey();
}
}
jxj198711
- 粉丝: 11
- 资源: 1