说明:该程序可以实现将甲机按下的键值发送到乙机,并且在两个单片机开发板上同时显示出来。
1.发送函数 - #include "reg52.h"
- #include "intrins.h"
- #include "absacc.h"
- #define uchar unsigned char
- #define uint unsigned int
- uchar code shuma[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
- uchar code keyzhi[4][4]={ 0, 1, 2, 3, //键值二维数组
- 4, 5, 6, 7,
- 8, 9, 10, 11,
- 12, 13, 14, 15 };
- uchar idata dis_buf[6]={ 16, 16, 16, 16, 16, 16 }; //数据缓冲区
- uchar keyval;
- uchar sum;
- sbit duan=P2^6;
- sbit wei=P2^7;
- void Delay1ms(void) //延时1ms函数
- {
- unsigned char a;
- for(a=0;a<125;a++);
- }
- void display()
- {
- uchark,bitcode,segcode;
- bitcode=0xfe; //起始位码
- for(k=0;k<6;k++)
- {
- segcode=dis_buf[k]; //取数据
- P0=shuma[segcode]; //查表送段码
- duan=1;
- duan=0;
- P0=bitcode; //送位码
- wei=1;
- Delay1ms();
- P0=0xff; //消影
- wei=0;
- bitcode=bitcode<<1; //更新位码
- bitcode=bitcode|0x01;
- }
- }
- void weiyi()
- {
- dis_buf[0]=dis_buf[1];
- dis_buf[1]=dis_buf[2];
- dis_buf[2]=dis_buf[3];
- dis_buf[3]=dis_buf[4];
- dis_buf[4]=dis_buf[5];
- dis_buf[5]=keyval ;
- }
- void keyscan() //键扫描函数
- {
- uchar hang,lie;
- uint l=0;
- P3=0x0f;
- if(P3!=0x0f)
- {
- display();
- display();
- display();
- display();
- P3=0x0f;
- if(P3!=0x0f)
- {
- switch(P3)
- {
- case 0x07:hang=3;break;
- case 0x0b:hang=2;break;
- case 0x0d:hang=1;break;
- case 0x0e:hang=0;break;
- }
- P3=0xf3;
- display();
- switch(P3)
- {
- case 0x73:lie=3;break;
- case 0xb3:lie=2;break;
- case 0xd3:lie=1;break;
- case 0xe3:lie=0;break;
- }
- while((l<300)&&(P3!=0xf3)) //检测按键松手检测
- {
- display();
- l++;
- }
- keyval=keyzhi[hang][lie]; //获取键值
- weiyi(); P1=dis_buf[5];
- }
- }
- }
- void init() //串口初始化
- {
- TMOD=0x20;
- TH1=0xfa;
- TL1=0xfa;
- PCON=0x00;
- SCON=0x50;
- REN=1;
- TR1=1;
- }
- void send() //发送函数
- {
- uchar i;
- do{
- display();
- display();
- display();
- display();
- display();
- SBUF=0xaa; P1=0x00;
- while(TI==0)display(); P1=0x0f;
- TI=0;
- while(RI==0)display(); P1=0xf0;
- RI=0;}while(SBUF!=0xbb);
- do{
- sum=0;
- for(i=0;i<6;i++)
- {
- display();
- display();
- SBUF=dis_buf[ i];
- [ i] sum+=dis_buf[ i];
- while(TI==0)display();
- TI=0;
- }
- display();
- display();
- SBUF=sum;
- while(TI==0)display();TI=0;
- while(RI==0)display();RI=0;
- }while(SBUF!=0x00);
- }
- void main() //主函数
- {
- init();
- while(1)
- {
- display();
- keyscan();
- send();
- }
- }
- 2.接收程序
- #include "reg52.h"
- #include "intrins.h"
- #include "absacc.h"
- #define uchar unsigned char
- #define uint unsigned int
- uchar code shuma[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40 };
- uchar code keyzhi[4][4]={ 0, 1, 2, 3, //键值二维数组
- 4, 5, 6, 7,
- 8, 9, 10, 11,
- 12, 13, 14, 15 };
- uchar idata dis_buf[6]={ 16, 16, 16, 16, 16, 16 }; //数据缓冲区
- uchar sum;
- sbit duan=P2^6;
- sbit wei=P2^7;
- void Delay1ms(void) //延时1ms函数
- {
- unsigned char a;
- for(a=0;a<125;a++);
- }
- void display()
- {
- uchar k,bitcode,segcode;
- bitcode=0xfe; //起始位码
- for(k=0;k<6;k++)
- {
- segcode=dis_buf[k]; //取数据
- P0=shuma[segcode]; //查表送段码
- duan=1;
- duan=0;
- P0=bitcode; //送位码
- wei=1;
- Delay1ms();
- P0=0xff; //消影
- wei=0;
- bitcode=bitcode<<1; //更新位码
- bitcode=bitcode|0x01;
- }
- }
- void init() //串口初始化
- {
- TMOD=0x20;
- TH1=0xfa;
- TL1=0xfa;
- PCON=0x00;
- SCON=0x50;
- REN=1;
- TR1=1;
- }
- void receive() //接收函数
- {
- uchar i;
- RI=0;P1=0xf0;
- while(RI==0)display(); RI=0;P1=0x00;
- while(SBUF!=0xaa)
- {
- SBUF=0xff;
- while(TI==0)display();
- TI=0;
- display();
- display();
- }
- SBUF=0xbb;
- while(TI==0)display();
- TI=0;
- sum=0;
- for(i=0;i<6;i++)
- {
- display();
- while(RI==0)display();RI=0;
- dis_buf[ i]=SBUF;
- sum+=dis_buf[ i];
- P1=dis_buf[5];
- }
- while(RI==0)display();RI=0;
- if(SBUF==sum)
- {
- SBUF=0x00;
- }
- else
- {
- SBUF=0xff;
- }
- while(TI==0)display();
- TI=0;
- }
- void main() //主函数
- {
- init();
- while(1)
- {
- display();
- receive();
- }
- }
复制代码
|