📄 cont0822.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;
sbit P1_0 = P1^0;
sbit P1_2 = P1^2;
/*------------------------------------------------
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;
u8 ch_flag;
u8 funt_flag;
u8 ch=1;
u16 Com_times=0;
u16 Buffer;
u8 Com_bits=0;
bit Last_state;
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
// u8 i;
SCI_INI();
while(1)
{
P2=9;
}
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_7=1; //245 not select
P3_6=1;
P1=0x1f;
}
else
{ //funtion
P2_2=1;
P2_3=0;
P3_7=0;
P3_6=0;
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;
if (key_flag) key_flag=0; //a new key
else key_flag=0x55;
sendkey(k);
}
}
else
{
k=key();
if (!k) //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=2400 when 11.052Mhz.
TL0=77;
TH0=77; //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) 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) k_code=0x0b;
else k_code=0x2b;
break;
case 0x48: //7
k_code=0x06;
break;
case 0x44: //8
k_code=0x04;
break;
case 0x42: //9
k_code=0x09;
break;
case 0x41: //10
k_code=0x0;
break;
case 0x90: //11
if (key_flag) k_code=0x32;
else k_code=0x31;
break;
case 0x88: //12
k_code=0x07;
break;
case 0x84: //13
k_code=0x05;
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_2;
// return;
Com_times++;
// if (Com_times==255)
// P1=~P1;
// return;
if (Com_bits) //接收中
{
//P1=0; //test
if (Last_state ^ P3_0) //跳变
{
if((Com_times > 7) && (Com_times < 13)) //接收正确
{
Buffer = (Buffer << 1) | (~P3_0);
Com_bits++;
Com_times =0;
}
else if(Com_times > 13) //接收码超时出错
{
Com_bits=0;
Com_times=0;
P1_2=0;
}
if(Com_bits == 14 ) //接收完毕
{
Com_bits = 0;
Com_times = 0;
Com_sucess(); //模拟键盘输出
P1_0=0;
}
}
}
else if (P3_0 == 0)
{
if(Com_times > 200) //码间隔足够
{
Com_bits =1;
Com_times = 0;
}
else Com_times = 0;
}
if(Com_times >= 400) //间隔时间停留,输出释放
{
Com_times = 250;
Com_bits = 0;
P1=0xFF;
}
Last_state = P3_0;
}
void Com_sucess(void)
{
switch (Buffer & 0x37)
{
case 23:
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 + -