📄 cont.c
字号:
#include "reg51.h"
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;
typedef char s8;
typedef long s32;
typedef short s16;
//p0 = R2,R1,R0,C4,C3,C2,C1,C0
#define X_RF 0xAF //R1,C4
#define X_STOP 0XB7 //C3
#define X_PAUSE 0XBB //C2
#define X_FF 0XBD //C1
#define X_PLAY 0XBE //C0
#define X_MENU 0X6F //R2,C4
#define X_UP 0X77 //C3
#define X_DOWN 0X7B //C2
#define X_SELECT 0X7D //C1
#define X_REC 0X7E //C0
sbit P1_0 = 0x90;
sbit P1_1 = 0x91;
sbit P1_2 = 0x92;
/*------------------------------------------------
P2 Bit Registers
------------------------------------------------*/
sbit P2_0 = 0xA0;
sbit P2_1 = 0xA1;
sbit P2_2 = 0xA2;
sbit P2_3 = 0xA3;
sbit P2_4 = 0xA4;
sbit P2_5 = 0xA5;
sbit P2_6 = 0xA6;
sbit P2_7 = 0xA7;
/*------------------------------------------------
P3 Bit Registers (Mnemonics & Ports)
------------------------------------------------*/
sbit P3_0 = 0xB0;
sbit P3_1 = 0xB1;
sbit P3_2 = 0xB2;
sbit P3_3 = 0xB3;
sbit P3_4 = 0xB4;
sbit P3_5 = 0xB5;
sbit P3_6 = 0xB6;
sbit P3_7 = 0xB7;
void SCI_INI(void); //sci_a init
u8 key(void); //check key
void delay(int);
void sendkey(u8);
void Time_intt(void); //0.2ms 定时中断
void Com_sucess(void);
u8 key_flag_a;
u8 key_flag_b;
u8 key_flag_c;
u8 last_flag;
u8 ch_flag;
u8 funt_flag;
u8 ch=1;
u16 com_times=0;
u32 Buffer;
u8 com_bits=0;
u8 bit_cnt=0;
u8 send_tmp=0;
u8 out_flag=0;
bit last_state;
bit bit_state;
bit bit_statex;
void main(void)
{
u8 k;
u8 flag=0; //funtion / control flag,1: control, 0:funtion
u8 key_flag2; //pressing key flag,1:pressing ,0:no key
SCI_INI();
while(1) //测试接收的号码
{
if(out_flag)
{
//for test-----------------------
SBUF=0x55;
while(!TI);
TI=0;
SBUF=0xaa;
while(!TI);
TI=0;
out_flag = 0;
SBUF=Buffer >> 24;
while(!TI);
TI=0;
SBUF=Buffer >> 16;
while(!TI);
TI=0;
SBUF=Buffer >> 8;
while(!TI);
TI=0;
SBUF=Buffer;
while(!TI);
TI=0;
//---------------------------------
}
// SBUF=0x55;
// while(!TI);
TI=0;
}
while(1)
{
if (!(P2 & 0x01)) //test funtion key
{ //press the funtion key
delay(6);
if (!(P2 & 0x01) )
{
if (funt_flag==0)
{
if(flag==0x55)
{
flag=0; //control
}
else
{
flag=0x55;
}
funt_flag=0x55;
}
}
}
else
{
delay(6);
if (P2 & 0x01) funt_flag=0; //release funtion key
}
///8********************************
if(flag==0x55) //funtion or control display
{ //control
//*****************************************8
if (!(P2 & 0x02)) //test ch key
{
delay(6);
if (!(P1 & 0x20) )
{
if (ch_flag==0)
{
ch++;
if (ch==5) ch=1;
ch_flag=0x55;
}
}
}
else
{
delay(6);
if (P2 & 0x02) ch_flag=0; //release channel key
}
P2_2=0;
P2_3=1;
P3=0xff; //245 not select
P1=0x1f;
}
else
{ //funtion
P2_2=1;
P2_3=0;
P3=0x0f;
P1=0xff;
P2_4=1; //off channel led
P2_5=1;
P2_6=1;
P2_7=1;
}
if (flag)
{
switch (ch) //display the channel led
{
case 1:
P2=(P2 & 0xf) | 0x70;
break;
case 2:
P2=(P2 & 0xf) | 0xb0;
break;
case 3:
P2=(P2 & 0xf) | 0xd0;
break;
case 4:
P2=(P2 & 0xf) | 0xe0;
break;
default:
break;
}
P2_0=1;
P2_1=1;
k=key();
if(k)
{
if (!key_flag2)
{
key_flag2=0x55;
switch (k)
{
case 30:
if (key_flag_a) key_flag_a=0; //a new key
else key_flag_a=0x55;
break;
case 50:
if (key_flag_b) key_flag_b=0; //a new key
else key_flag_b=0x55;
break;
case 90:
if (key_flag_c) key_flag_c=0; //a new key
else key_flag_c=0x55;
break;
default:
break;
}
sendkey(k);
}
}
else
{
k=key();
if (key_flag2) //stop key
{
key_flag2=0;
sendkey(0xff);
}
}
}
}
}
void SCI_INI(void)
{
P0=0XFF;
P1=0XfF;
P2=0XFF;
P3=0X0f;
TMOD=0x22; //timer1 use as sci bord ,timer0 use as 16bit counter
TL1=0XFd;
TH1=0xfd; //sci bord speed=9600 when 11.052Mhz./12.000
TL0=91;
TH0=91; //0.178ms中断
TR1=1; //timer1 enable
TR0=1;
PCON=0X0;
SCON=0X40;
IE=0X82; //开定时0中断
}
u8 key(void)
{
u8 temp;
temp=P1 & 0x1f;
if (temp != 0x1f)
{
delay(6);
P1=0xdf;
temp=P1 & 0x1f;
if (temp==0x1f)
{
P1=0xbf;
temp=P1 & 0x1f;
if (temp==0x1f)
{
P1=0x7f;
temp=P1 & 0x1f;
if (temp==0x1f) temp=0;
else temp=~P1;
}
else temp=~P1;
}
else temp= ~P1;
}
else temp=0;
P1=0x1f;
return temp;
}
void sendkey(u8 kk)
{
u8 k_code;
switch (kk)
{
case 0x30: //key1
if (key_flag_a) k_code=0x0e;
else k_code=0xf;
break;
case 0x28: //2
k_code=0x03;
break;
case 0x24: //3
k_code=0x02;
break;
case 0x22: //4
k_code=0x01;
break;
case 0x21: //5
k_code=0xee;
break;
case 0x50: //6
if (key_flag_b) k_code=0x0b;
else k_code=0x2b;
break;
case 0x48: //7
k_code=0x06;
break;
case 0x44: //8
k_code=0x05;
break;
case 0x42: //9
k_code=0x09;
break;
case 0x41: //10
k_code=0x0;
break;
case 0x90: //11
if (key_flag_c) k_code=0x32;
else k_code=0x31;
break;
case 0x88: //12
k_code=0x07;
break;
case 0x84: //13
k_code=0x04;
break;
case 0x82: //14
k_code=0x08;
break;
case 0x81: //15
k_code=0x0;
break;
case 0xff: //stop all
k_code=0xff;
break;
default:
k_code=0;
break;
}
if (k_code)
{
if (k_code==0xee) k_code=0;
//P2_3=0;
SBUF=0xeb;
while(!TI);
TI=0;
SBUF=0x20;
while(!TI);
TI=0;
SBUF=ch;
while(!TI);
TI=0;
SBUF=0xaa;
while(!TI);
TI=0;
SBUF=k_code;
while(!TI);
TI=0;
SBUF=0x55;
while(!TI);
TI=0;
// P2_3=1;
}
}
void Time_intt() interrupt 1
{
// P1_0=P3_0;
// return;
// if (com_times==255)
// P1=~P1;
// return;
com_times++;
P1_2 = P3_0;
if(bit_statex == P3_0) //接收滤波
bit_state = P3_0;
if(bit_state != last_state) //跳变
{
if(com_bits == 0 ) //引导码
{
if((com_times > 20) && (last_state == 0))
com_bits =1;
}
else
{
if(com_times > 20) //接收超时,错误
{
if(com_bits > 1)
{
SBUF = com_bits;
com_bits = 0;
P1_0 =0;
}
}
else if(com_times > 6) //收到 1
{
Buffer = (Buffer << 1) | 1;
com_bits ++;
}
else if((com_times > 1) && (last_state == 1)) //收到 0
{
Buffer = (Buffer << 1) ;
com_bits ++;
}
}
com_times = 0; //定时计数清零
}
if(com_bits == 32)
{
Buffer <<= 1;
Com_sucess();
com_bits = 0;
out_flag =1;
}
/*
if (com_times < 50) //接收中
{
Buffer = (Buffer << 1) | (P3_0);
com_bits++;
if(com_bits == 8 ) //接收完毕
{
com_bits = 1;
//Com_sucess(); //模拟键盘输出
//P1_0=0;
SBUF=Buffer;
P1_0=0; //串口发送号码到pc,测试用
}
}
else
{
com_bits = 0;
}*/
if(com_times >= 300) //间隔时间停留,输出释放
{
com_times = 300;
com_bits = 0;
bit_cnt = 0;
Buffer = 0;
P1_0=1;
}
last_state = bit_state;
bit_statex = P3_0;
}
void Com_sucess(void)
{
switch (Buffer & 0x3F)
{
case 1:
P0 = X_RF;
break;
case 2:
P0 = X_STOP;
break;
case 3:
P0 = X_PAUSE;
break;
case 4:
P0 = X_FF;
break;
case 5:
P0 = X_PLAY;
break;
case 6:
P0 = X_MENU;
break;
case 7:
P0 = X_UP;
break;
case 8:
P0 = X_DOWN;
break;
case 9:
P0 = X_SELECT;
break;
case 0X1E:
P0 = X_REC;
break;
default:
break;
}
}
void delay(int ms)
{
int i,j;
for (i=0;i<ms;i++)
for(j=0;j<255;j++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -