📄 red.c
字号:
///////////红外编码解码调试程序/////////////
///////////red.c///////////////////////////
#include "mylcd.h"
#include "stdio.h"
union intchar{
uint tempval;
struct {uchar hi;uchar low;}bytek;
}tcf;
uint k=0;
uint j;
idata uint codelen;
sbit sigin=P0^7;//p0.7
sbit sigout=P0^5;//p0.5
bit isodd;
sbit keydown=P5^7;
bit sig;
bit iserror;
bit detectend;
xdata uint sigdata[400];
xdata uchar flashrd[20];
idata uint head0;
void resett0(void);
uint readt0(void);
void error();
extern bit isline0;
void dispini(){ //lcd显示初始化
delay1ms(100);
SFRPAGE=0xf;
lcdcs=0;
lcdrs=1;
lcdrw=1;
delay1ms(30);
sendc(0x38);//8位,2行,5*7字体
delay1ms(100);
sendc(0x0c);//显示开,光标关;不闪
delay1ms(100);
sendc(0x06);//增量方式,现不移动
delay1ms(100);
sendc(0x01);//清屏
delay1ms(100);
}
uchar scankey(){//扫描键值函数
uchar c;
SFRPAGE=0X0F;
c=P5;
c=c&0xf8;//电路中有按键按下是低电平
if(c==0x0f8)
return(0);
delay1ms(20);
switch(c){
case 0xd8:
return 4;
case 0xe8:
return 2;
case 0xf0:
return 3;
case 0xb8:
return 1;
case 0x78:
return 5;
default: return 0;//此行事实上包含了对串键的处理
}
}
void config(){
//看门狗禁止
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
SFRPAGE = 0x0F;
//交叉开关配置,CEX0-CEX05配置在P0.0-P0.5
XBR0 = 0x10;
XBR1 = 0x00;
XBR2 = 0x40;
XBR3 = 0x00;
//管脚输出配置,P0口为开漏输出,其中P0.0接上拉电阻,驱动超声波控制信号
SFRPAGE = 0x0F;
P0MDOUT = 0x00; //端口配置,P0-P3,P6-P7口为开漏输出
P1MDOUT = 0x00;
P2MDOUT = 0x00;
P3MDOUT = 0x00;
P4MDOUT = 0x00; //P4口为开漏
P5MDOUT = 0x07;
P6MDOUT = 0x00;
P7MDOUT = 0x00;
P1MDIN = 0xFF; //所有端口为数字输入,没有模拟输入端口
P2MDIN = 0xFF;
P3MDIN = 0xFF;
//晶振配置,采用内部晶振8分频
SFRPAGE = 0x0F;
CLKSEL = 0x00;
OSCXCN = 0x00;
OSCICN = 0x84;
}
void decode(){//接收红外线代码
testagain:
j=0;
sigin=1;
codelen=0;
iserror=0;
EA=0;
k=0;
SFRPAGE=0x00;
while(1){
sig=sigin;
if(!sig)
break;
}
resett0();
TF0=0;
detectend=0;
sig=sigin;
while(!sig){
if(TF0){
TF0=0;
error();
break;
}
sig=sigin;
}
if(iserror){
head0=readt0();
head0=0xffff;
iserror=0;
}
else{
head0=readt0();
}
tcf.tempval=head0;
sigdata[j]=tcf.tempval;
j++;
while(1){
sig=sigin;
while(sig){
if(TF0){
TF0=0;
if(j<15){//若接收的代码长度小于15/2=7个,则认为接收到的为干扰信号
//重新开始检测
iserror=1;
goto testagain;
}
else{
error();
}
}
sig=sigin;
}
if(iserror){
tcf.tempval=readt0();
tcf.tempval=0xffff;
iserror=0;
}
else{
tcf.tempval=readt0();
}
sigdata[j]=tcf.tempval;
j++;
sig=sigin;
while(!sig){
if(TF0){
TF0=0;
error();
break;
}
sig=sigin;
}
tcf.tempval=readt0();
if(iserror){
tcf.tempval=0xffff;
iserror=0;
}
sigdata[j]=tcf.tempval;
j++;
if(j>399)
goto testend;
}
testend:;
}
void pca0ini(){//38KHZ频率输出
SFRPAGE = 0x00;
PCA0MD = 0x08;
PCA0CN = 0x40;
PCA0CPM0=0X46;
PCA0CPH0=38;
PCA0CPM1=0X46;
PCA0CPH1=38;
}
void encode(void){//发送红外代码
SFRPAGE=0x0f;
SFRPAGE=0x00;
pca0ini();
TR0=0;
sigout=0;
isodd=0;
for(k=0;k<400;k++){
TR0=0;
tcf.tempval=0xffff-sigdata[k];
TH0=tcf.bytek.hi;
TL0=tcf.bytek.low;
TF0=0;
TR0=1;
if(isodd){
sigout=0;
isodd=0;
while(!TF0);
}
else{
isodd=1;
sigout=1;
while(!TF0);
}
}
sigout=0;
SFRPAGE=0x0f;
}
void error(){
iserror=1;
}
void resett0(void){
SFRPAGE=0x00;
TH0=0;
TL0=0;
TR0=1;
}
uint readt0(void){
uint tmp;
SFRPAGE=0x00;
TR0=0;
tmp=(uint)TH0*256;
tmp+=TL0;
resett0();
return tmp;
}
void t0ini(){
SFRPAGE=0x00;
CKCON=0x00;
TMOD=0x11;
TCON=0x01;
}
void main(){
uint tk=0;
config();
dispini();
sigout=0;
t0ini();
EA=0;
while(1){
isline0=1;
printf("\nKEY1 TO DECODE");
printf("\nKEY3 TO SEND");
while(scankey()==0);
if(scankey()==1){
key1start:
printf("\nready to decode?");
if(scankey()==5){
printf("\nexit now...");
while(scankey()==5);
goto key1end;
}
if(scankey()==2){
printf("\nnow decode...");
decode();
printf("\n\ncompelete");
goto key1end;
}
goto key1start;
key1end:;
}
if(scankey()==3){
key2start:
printf("\nready to send?");
if(scankey()==5){
printf("\nexit now...");
while(scankey()==5);
goto key2end;
}
if(scankey()==2){
printf("\nnow send...");
encode();
EA=EA;//多一条指令,以便编译器能顺利编译发送两次代码
encode();
printf("\n\ncompelete");
goto key2end;
}
goto key2start;
key2end:;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -