📄 main.c
字号:
#include<reg51.h>
typedef unsigned char byte;
byte keyCode[4][16]={0,0,0,0,0,0,0,0xB4,0,0,0,0xD1,0,0xE1,0xF0,0,
0,0,0,0,0,0,0,0x2D,0,0,0,0x4B,0,0x78,0x87,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0x0F,0x1E,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //低四位为按键编码,高四位为校验码
int clock=0; //全局计数器,每次时钟中断加一
void init() //初始化
{
/*keyCode[0][14]=0xF0; //0号键按下,P1高四位输出~(1<<0)=(1110),低四位检测到14=(1110)
keyCode[0][13]=0xE1; //1号键按下,P1高四位输出~(1<<0)=(1110),低四位检测到13=(1101)
keyCode[0][11]=0xD2; //2号键按下,P1高四位输出~(1<<0)=(1110),低四位检测到11=(1011)
keyCode[0][7] =0xB4; //3号键按下,P1高四位输出~(1<<0)=(1110),低四位检测到 7=(0111)
keyCode[1][14]=0x87; //4号键按下,P1高四位输出~(1<<1)=(1101),低四位检测到14=(1110)
keyCode[1][13]=0x78; //5号键按下,P1高四位输出~(1<<1)=(1101),低四位检测到13=(1101)
keyCode[1][11]=0x4B; //6号键按下,P1高四位输出~(1<<1)=(1101),低四位检测到11=(1011)
keyCode[1][7] =0x2D; //7号键按下,P1高四位输出~(1<<1)=(1101),低四位检测到 7=(0111)
keyCode[2][14]=0x1E; //8号键按下,P1高四位输出~(1<<2)=(1011),低四位检测到14=(1110)
keyCode[2][13]=0x0F; //9号键按下,P1高四位输出~(1<<2)=(1011),低四位检测到13=(1101) */
TMOD=0x02; //使用计时器0,模式2,8位自动重装载,每当TL0溢出后自动重装载TH0 的值
TH0=0x9C;
TL0=0x9C; //赋8位时钟计数器初值,每 0xFF - 0x9C = 100us = 0.1ms中断一次
EA=1; //开中断
ET0=1; //注意,此时时钟并未启动
}
void sendLeadCode() //发送引导码,8ms高电平,8ms低电平
{
TR0=1; //启动时钟
clock=0;
while(clock<80)
P0|=1; //P0.0=1,循环持续8ms
while(clock<160)
P0&=0xFE; //P0.0=0。循环持续8ms
TR0=0; //关闭时钟
TL0=0x9C;
}
void sendBit(byte bitToSend)//发送一位脉位调制信号,1ms高电平,1ms或3ms低电平
{
TR0=1; //启动时钟
clock=0;
while(clock<10)
P0|=1; //P0.0=1,循环持续1ms
if(bitToSend & 0x01)//如果是bit"1"
while(clock<40)
P0&=0xFE; //P0.0=0,循环持续3ms
else //如果是bit"0"
while(clock<20)
P0&=0xFE; //P0.0=0,循环持续1ms
TR0=0; //关闭时钟
TL0=0x9C;
}
void sendEnd()
{
clock=0;
TR0=1;
while(clock<2)
P0|=1;
P0&=0xFE;
TR0=0;
TL0=0x9C;
}
void sendCode(byte keyCode)//发送编码code及其反码,共8位
{
char i;
sendLeadCode(); //发送引导码
for(i=0;i<8;i++) //依次从低到高发送8位编码
sendBit(keyCode>>i);
sendEnd();
}
void main()
{
byte i,t;
init();
while(1)//轮询检测按键
{
for(i=4;i<8;i++)//P1口高四位依次变低电位,检测低四位
{
P1=~(1<<i);
if((t=keyCode[i-4][P1 & 0x0F])!=0)//如果有按键按下,则查表得到的编码t不为0
sendCode(t);
}
}
}
void timer() interrupt 1 //时钟中断处理函数
{
clock++; //全局时钟加一
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -