15W408AS程序移植到STC8H1K08出现的问题
7 天前 来自 阿飞7812 发布 @ 综合讨论
我在网上找了一个315解决码程序试了没问题 程序如下 //-----------------兼容2262 1527的解码实验程序----------------//
//测试单片机:STC15W408AS
//晶振:内部 11.0592mHZ
//复位方式:内部复位
//串口通讯:波特率9600/数据位8/停止位1/无校验
//调试环境:KEIL3
//程序功能:实现2262解码,学习、自适应多阻值,片内EEPROM,存储60个遥控器数据
// 不依赖硬件,不占用硬件资源。移植更加方便
// 学习遥控器:按一下学习键,学习灯点亮,松开学习键,按动要学习的遥控器按键,学习灯熄灭,学习成功。重复上述操作可学习多个遥控器.
//
// 清除:按住学习键不放,直到学习灯自动熄灭,擦除成功.
/**********************************************************/
#include <STC15W408AS.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RF = P1^1; //信号输入
sbit LED = P3^3; //学习指示灯
sbit set = P1^2; //学习键
sbit D0 = P3^4; //1号继电器解码输出
sbit D1 = P3^5; //2号继电器
sbit D2 = P3^6; //3号继电器
sbit D3 = P3^7; //4号继电器
sbit deng1 = P1^7; //K1指示灯
sbit deng2 = P5^4; //K2指示灯
sbit deng3 = P5^5; //K3指示灯
sbit deng4 = P3^2; //K4指示灯
sbit VT = P1^0; //接收指示灯
sbit aj1 = P1^3; //K1
sbit aj2 = P1^4; //K2
sbit aj3 = P1^5; //K3
sbit aj4 = P1^6; //K4
bit decode_ok; //解码成功
bit rf_ok; //收到有效数据
bit study; //学习标志
bit jmnx; //编码类型 0是2262,1是1527
bit m=0,ba=0,ca=0,da=0,ea=0,za=0,aa=0,hv=0,ff=0,ra=0,rb=0,rc=0,rd=0,g=0,hm=0,biao=0,kt=0;
bit biao_1=0,g_1=0,kt_1=0,hm_1=0;
bit biao_2=0,g_2=0,kt_2=0,hm_2=0;
bit biao_3=0,g_3=0,kt_3=0,hm_3=0;
uchar da1527; //解码过程中临时数组
uchar key_d; //遥控器按键码
uchar short_k; //窄脉冲宽度
uchar ss=0,sn=0,h=0,yz=0,hh=0,yy=0,yk=0,yu=0;hk=0,sj=0,so=0,jk=0,hu=0,t1=0,t2=0,t3=0,t4=0;
uint dt=0,dr=0,dq=0,rv=0,rv_1=0,rv_2=0,rv_3=0;
uchar trg=0,trg_1=0,trg_2=0,trg_3=0,cont=0,cont_1=0,cont_2=0,cont_3=0;
uchar ReadData=0,ReadData_1=0,ReadData_2=0,ReadData_3=0;
static uint sk=0;
uchar xdata key_number; //遥控器编码数组,存放60个遥控器
void delay_1ms(uint x) //1毫秒延时
{
uchar b,c;
for(x;x>0;x--)
{
for(b=3;b>0;b--)
{
for(c=150;c>0;c--);
}
}
}
void delay(uint ms)//
{
while(ms--)
{
ms++;
ms--;
}
}
//====================================================
/////////片内EEPROM读写驱动程序///////////////////////////
//====================================================
void IAP_Disable() //关闭IAP
{
//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
IAP_CONTR = 0; //关闭IAP 功能
IAP_CMD = 0; //清命令寄存器,使命令寄存器无命令,此句可不用
IAP_TRIG = 0; //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
IAP_ADDRH = 0;
IAP_ADDRL = 0;
}//
//读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
uchar read_add(uint addr) //读EEPROM
{
IAP_DATA = 0x00;
IAP_CONTR = 0x84; //打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD = 0x01; //IAP/ISP/EEPROM 字节读命令
IAP_ADDRH = addr>>8; //设置目标单元地址的高8 位地址
IAP_ADDRL = addr&0xff; //设置目标单元地址的低8 位地址
EA = 0;
IAP_TRIG = 0x5a; //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xa5; //送完 B9h 后,ISP/IAP 命令立即被触发起动
_nop_();
EA = 1;
IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
return (IAP_DATA);
}//------------------------------------------------------------------------------
//字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
void write_add(uint addr,uchar ch) //直接写EEPROM
{
IAP_CONTR = 0x84; //打开 IAP 功能, 设置Flash 操作等待时间
IAP_CMD = 0x02; //IAP/ISP/EEPROM 字节编程命令
IAP_ADDRH = addr>>8; //设置目标单元地址的高8 位地址
IAP_ADDRL = addr&0xff; //设置目标单元地址的低8 位地址
IAP_DATA = ch; //要编程的数据先送进IAP_DATA 寄存器
EA = 0;
IAP_TRIG = 0x5a; //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xa5; //送完 B9h 后,ISP/IAP 命令立即被触发起动
_nop_();
EA = 1;
IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}//------------------------------------------------------------------------------
//擦除扇区, 入口:DPTR = 扇区地址
void Sector_Erase(uint addr) //扇区擦除
{
IAP_CONTR = 0x84; //打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇区擦除命令
IAP_ADDRH =addr>>8; //设置目标单元地址的高8 位地址
IAP_ADDRL =addr&0xff; //设置目标单元地址的低8 位地址
EA = 0;
IAP_TRIG = 0x5a; //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xa5; //送完 B9h 后,ISP/IAP 命令立即被触发起动
_nop_();
EA = 1;
}//------------------------------------------------------------------------------
//============================接收解码部分========================================//
void RF_decode()
{
uchar ii=0,j=0,k=0,rep=0;
uint head_k=0; //短脉冲宽度
uchar s;
//-------------------------------数据接收-----------------------------------------
short_k=0;
while(RF && j<250) //检测头信号前一个高脉冲的宽度
{
delay(1);
short_k++;
}
while(!RF)
{
delay(1);
head_k++;
} //检测头脉冲的宽度
if(((short_k*24)<head_k) && (head_k<(short_k*38))) //引导码宽度是窄脉冲的32倍 24/38
{
for(rep=0;rep<2;rep++)
{
for(ii=0;ii<3;ii++)//3字节
{
for(k=0;k<8;k++)//每个字节8位
{
j=0;
while(RF && j<245)
{
delay(1);
j++;
}//
if(j>(short_k-short_k/2-short_k/3)&&j<(short_k*1.96))
{
da1527&=~(1<<((7-k)));
}
else if(j>(short_k*1.96)&&j<(short_k*5))da1527|=(1<<(7-k));
else {return;} //乱码退出
j=0;
while(!RF && j<150){delay(2);j++;} //跳过低电平
}
}//for(ii=0;ii<12;ii++)
j=0;while(RF && (j<200)){delay(1);j++;} //跳个最后一个高脉冲
head_k=0;while(!RF) {delay(1);head_k++;} //检测下一个前导信号的寬度
if((head_k<(short_k*26)) || (head_k>(short_k*38))) {return;} //引导码宽度是窄脉冲的32倍 //乱码退出
}
//+++++++++++++++++++++++++2262与1527数据分离处理++++++++++++++++++++++++++++++++++++++++
if((da1527==da1527) && (da1527==da1527) && (da1527==da1527)) //两次接收到的数据相同
{
uchar u,i,x;
rf_ok=1;
for(i=0;i<3;i++) //判定2262与1527
{
for(u=0;u<4;u++) {if(((da1527>>(u*2)) & 3)==2) {i=80;break;}} //有10则为1527
if(i==80) break;
}
if(i==80) //1527
{
key_d=da1527 & 0x0f; //分出1527的按键值
da1527=da1527>>4; //分出1527的后4位地址
jmnx=1; //为0是2262,1是1527
}
else //2262
{
key_d=0;
for(i=0;i<4;i++){if(((da1527>>(i*2))&3)==3) key_d|=1<<i;} //计算出2262的按键数据
da1527=0x00; //2262无后4位地址,全为0
jmnx=0; //为0是2262,1是1527
jk++;//自锁用,作用:按下按键不松手继电器状态不变,松开再按下改变,一次只改变一次状态,因为按下按键后遥控会一直发码,所以让jk一直自加,但是只取jk=1的值的状态
}
if (!study) //非学习状态
{
rf_ok=0;
for(x=0;x<60;x++)
{
if((da1527==key_number)&&(da1527==key_number)
&&(da1527==key_number))//判断是否已学习过的编码
{
// D0=!(key_d&0x08); //取得按键码
// D1=!(key_d&0x04);
// D2=!(key_d&0x02);
// D3=!(key_d&0x01);
if(m==1) //互锁
{
if(key_d == 0x01){D0=0;D1=1;D2=1;D3=1;}//D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;}//else{D0=1;}
if(key_d == 0x02){D0=1;D1=0;D2=1;D3=1;}//D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;}
// if(key_d == 0x03){D0=1;D1=1;D2=0;D3=1;D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;}
if(key_d == 0x04){D0=1;D1=1;D2=0;D3=1;}//D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;}
// if(key_d == 0x05){D0=1;D1=1;D2=1;D3=1;D4=0;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;}
// if(key_d == 0x06){D0=1;D1=1;D2=1;D3=1;D4=1;D5=0;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;}
// if(key_d == 0x07){D0=1;D1=1;D2=1;D3=1;D4=1;D5=1;D6=0;D7=1;D8=1;D9=1;D10=1;D11=1;}
if(key_d == 0x08){D0=1;D1=1;D2=1;D3=0;}//D4=1;D5=1;D6=1;D7=0;D8=1;D9=1;D10=1;D11=1;}
// if(key_d == 0x09){D0=1;D1=1;D2=1;D3=1;D4=1;D5=1;D6=1;D7=1;D8=0;D9=1;D10=1;D11=1;}
// if(key_d == 0x0a){D0=1;D1=1;D2=1;D3=1;D4=1;D5=1;D6=1;D7=1;D8=1;D9=0;D10=1;D11=1;}
// if(key_d == 0x0b){D0=1;D1=1;D2=1;D3=1;D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=0;D11=1;}
// if(key_d == 0x0c){D0=1;D1=1;D2=1;D3=1;D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=0;}
}
else
{
if(ba==0) //B按键自锁
{
if(key_d == 0x04)
{
if(jk==1)
{
D2=~D2;
}
}
} //B自锁
if(da==0) //A按键自锁
{
if(key_d == 0x08)
{
if(jk==1)
{
D3=~D3;
}
}
} //A自锁
if(ca==0) //C按键自锁
{
if(key_d == 0x02)
{
if(jk==1)
{
D1=~D1;
}
}
} //C自锁
if(ea==0) //D按键自锁
{
if(key_d == 0x01)
{
if(jk==1)
{
D0=~D0;
}
}
} //D自锁
if(ba==1)//B按键点动,ba为自锁转点动标志位
{
if(key_d == 0x04){D2=0;}
}
if(da==1)//A按键点动,da为自锁转点动标志位
{
if(key_d == 0x08){D3=0;}
}
if(ca==1)//C按键点动,da为自锁转点动标志位
{
if(key_d == 0x02){D1=0;}
}
if(ea==1)//D按键点动,da为自锁转点动标志位
{
if(key_d == 0x01){D0=0;}
}
}
decode_ok=1;
ss=1;
sn=1;
sj=1;
so=1;
VT=0;
s=30;
break;
//测试单片机:STC15W408AS
//晶振:内部 11.0592mHZ
//复位方式:内部复位
//串口通讯:波特率9600/数据位8/停止位1/无校验
//调试环境:KEIL3
//程序功能:实现2262解码,学习、自适应多阻值,片内EEPROM,存储60个遥控器数据
// 不依赖硬件,不占用硬件资源。移植更加方便
// 学习遥控器:按一下学习键,学习灯点亮,松开学习键,按动要学习的遥控器按键,学习灯熄灭,学习成功。重复上述操作可学习多个遥控器.
//
// 清除:按住学习键不放,直到学习灯自动熄灭,擦除成功.
/**********************************************************/
#include <STC15W408AS.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RF = P1^1; //信号输入
sbit LED = P3^3; //学习指示灯
sbit set = P1^2; //学习键
sbit D0 = P3^4; //1号继电器解码输出
sbit D1 = P3^5; //2号继电器
sbit D2 = P3^6; //3号继电器
sbit D3 = P3^7; //4号继电器
sbit deng1 = P1^7; //K1指示灯
sbit deng2 = P5^4; //K2指示灯
sbit deng3 = P5^5; //K3指示灯
sbit deng4 = P3^2; //K4指示灯
sbit VT = P1^0; //接收指示灯
sbit aj1 = P1^3; //K1
sbit aj2 = P1^4; //K2
sbit aj3 = P1^5; //K3
sbit aj4 = P1^6; //K4
bit decode_ok; //解码成功
bit rf_ok; //收到有效数据
bit study; //学习标志
bit jmnx; //编码类型 0是2262,1是1527
bit m=0,ba=0,ca=0,da=0,ea=0,za=0,aa=0,hv=0,ff=0,ra=0,rb=0,rc=0,rd=0,g=0,hm=0,biao=0,kt=0;
bit biao_1=0,g_1=0,kt_1=0,hm_1=0;
bit biao_2=0,g_2=0,kt_2=0,hm_2=0;
bit biao_3=0,g_3=0,kt_3=0,hm_3=0;
uchar da1527; //解码过程中临时数组
uchar key_d; //遥控器按键码
uchar short_k; //窄脉冲宽度
uchar ss=0,sn=0,h=0,yz=0,hh=0,yy=0,yk=0,yu=0;hk=0,sj=0,so=0,jk=0,hu=0,t1=0,t2=0,t3=0,t4=0;
uint dt=0,dr=0,dq=0,rv=0,rv_1=0,rv_2=0,rv_3=0;
uchar trg=0,trg_1=0,trg_2=0,trg_3=0,cont=0,cont_1=0,cont_2=0,cont_3=0;
uchar ReadData=0,ReadData_1=0,ReadData_2=0,ReadData_3=0;
static uint sk=0;
uchar xdata key_number; //遥控器编码数组,存放60个遥控器
void delay_1ms(uint x) //1毫秒延时
{
uchar b,c;
for(x;x>0;x--)
{
for(b=3;b>0;b--)
{
for(c=150;c>0;c--);
}
}
}
void delay(uint ms)//
{
while(ms--)
{
ms++;
ms--;
}
}
//====================================================
/////////片内EEPROM读写驱动程序///////////////////////////
//====================================================
void IAP_Disable() //关闭IAP
{
//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
IAP_CONTR = 0; //关闭IAP 功能
IAP_CMD = 0; //清命令寄存器,使命令寄存器无命令,此句可不用
IAP_TRIG = 0; //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
IAP_ADDRH = 0;
IAP_ADDRL = 0;
}//
//读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
uchar read_add(uint addr) //读EEPROM
{
IAP_DATA = 0x00;
IAP_CONTR = 0x84; //打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD = 0x01; //IAP/ISP/EEPROM 字节读命令
IAP_ADDRH = addr>>8; //设置目标单元地址的高8 位地址
IAP_ADDRL = addr&0xff; //设置目标单元地址的低8 位地址
EA = 0;
IAP_TRIG = 0x5a; //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xa5; //送完 B9h 后,ISP/IAP 命令立即被触发起动
_nop_();
EA = 1;
IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
return (IAP_DATA);
}//------------------------------------------------------------------------------
//字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
void write_add(uint addr,uchar ch) //直接写EEPROM
{
IAP_CONTR = 0x84; //打开 IAP 功能, 设置Flash 操作等待时间
IAP_CMD = 0x02; //IAP/ISP/EEPROM 字节编程命令
IAP_ADDRH = addr>>8; //设置目标单元地址的高8 位地址
IAP_ADDRL = addr&0xff; //设置目标单元地址的低8 位地址
IAP_DATA = ch; //要编程的数据先送进IAP_DATA 寄存器
EA = 0;
IAP_TRIG = 0x5a; //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xa5; //送完 B9h 后,ISP/IAP 命令立即被触发起动
_nop_();
EA = 1;
IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}//------------------------------------------------------------------------------
//擦除扇区, 入口:DPTR = 扇区地址
void Sector_Erase(uint addr) //扇区擦除
{
IAP_CONTR = 0x84; //打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇区擦除命令
IAP_ADDRH =addr>>8; //设置目标单元地址的高8 位地址
IAP_ADDRL =addr&0xff; //设置目标单元地址的低8 位地址
EA = 0;
IAP_TRIG = 0x5a; //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xa5; //送完 B9h 后,ISP/IAP 命令立即被触发起动
_nop_();
EA = 1;
}//------------------------------------------------------------------------------
//============================接收解码部分========================================//
void RF_decode()
{
uchar ii=0,j=0,k=0,rep=0;
uint head_k=0; //短脉冲宽度
uchar s;
//-------------------------------数据接收-----------------------------------------
short_k=0;
while(RF && j<250) //检测头信号前一个高脉冲的宽度
{
delay(1);
short_k++;
}
while(!RF)
{
delay(1);
head_k++;
} //检测头脉冲的宽度
if(((short_k*24)<head_k) && (head_k<(short_k*38))) //引导码宽度是窄脉冲的32倍 24/38
{
for(rep=0;rep<2;rep++)
{
for(ii=0;ii<3;ii++)//3字节
{
for(k=0;k<8;k++)//每个字节8位
{
j=0;
while(RF && j<245)
{
delay(1);
j++;
}//
if(j>(short_k-short_k/2-short_k/3)&&j<(short_k*1.96))
{
da1527&=~(1<<((7-k)));
}
else if(j>(short_k*1.96)&&j<(short_k*5))da1527|=(1<<(7-k));
else {return;} //乱码退出
j=0;
while(!RF && j<150){delay(2);j++;} //跳过低电平
}
}//for(ii=0;ii<12;ii++)
j=0;while(RF && (j<200)){delay(1);j++;} //跳个最后一个高脉冲
head_k=0;while(!RF) {delay(1);head_k++;} //检测下一个前导信号的寬度
if((head_k<(short_k*26)) || (head_k>(short_k*38))) {return;} //引导码宽度是窄脉冲的32倍 //乱码退出
}
//+++++++++++++++++++++++++2262与1527数据分离处理++++++++++++++++++++++++++++++++++++++++
if((da1527==da1527) && (da1527==da1527) && (da1527==da1527)) //两次接收到的数据相同
{
uchar u,i,x;
rf_ok=1;
for(i=0;i<3;i++) //判定2262与1527
{
for(u=0;u<4;u++) {if(((da1527>>(u*2)) & 3)==2) {i=80;break;}} //有10则为1527
if(i==80) break;
}
if(i==80) //1527
{
key_d=da1527 & 0x0f; //分出1527的按键值
da1527=da1527>>4; //分出1527的后4位地址
jmnx=1; //为0是2262,1是1527
}
else //2262
{
key_d=0;
for(i=0;i<4;i++){if(((da1527>>(i*2))&3)==3) key_d|=1<<i;} //计算出2262的按键数据
da1527=0x00; //2262无后4位地址,全为0
jmnx=0; //为0是2262,1是1527
jk++;//自锁用,作用:按下按键不松手继电器状态不变,松开再按下改变,一次只改变一次状态,因为按下按键后遥控会一直发码,所以让jk一直自加,但是只取jk=1的值的状态
}
if (!study) //非学习状态
{
rf_ok=0;
for(x=0;x<60;x++)
{
if((da1527==key_number)&&(da1527==key_number)
&&(da1527==key_number))//判断是否已学习过的编码
{
// D0=!(key_d&0x08); //取得按键码
// D1=!(key_d&0x04);
// D2=!(key_d&0x02);
// D3=!(key_d&0x01);
if(m==1) //互锁
{
if(key_d == 0x01){D0=0;D1=1;D2=1;D3=1;}//D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;}//else{D0=1;}
if(key_d == 0x02){D0=1;D1=0;D2=1;D3=1;}//D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;}
// if(key_d == 0x03){D0=1;D1=1;D2=0;D3=1;D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;}
if(key_d == 0x04){D0=1;D1=1;D2=0;D3=1;}//D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;}
// if(key_d == 0x05){D0=1;D1=1;D2=1;D3=1;D4=0;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;}
// if(key_d == 0x06){D0=1;D1=1;D2=1;D3=1;D4=1;D5=0;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;}
// if(key_d == 0x07){D0=1;D1=1;D2=1;D3=1;D4=1;D5=1;D6=0;D7=1;D8=1;D9=1;D10=1;D11=1;}
if(key_d == 0x08){D0=1;D1=1;D2=1;D3=0;}//D4=1;D5=1;D6=1;D7=0;D8=1;D9=1;D10=1;D11=1;}
// if(key_d == 0x09){D0=1;D1=1;D2=1;D3=1;D4=1;D5=1;D6=1;D7=1;D8=0;D9=1;D10=1;D11=1;}
// if(key_d == 0x0a){D0=1;D1=1;D2=1;D3=1;D4=1;D5=1;D6=1;D7=1;D8=1;D9=0;D10=1;D11=1;}
// if(key_d == 0x0b){D0=1;D1=1;D2=1;D3=1;D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=0;D11=1;}
// if(key_d == 0x0c){D0=1;D1=1;D2=1;D3=1;D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=0;}
}
else
{
if(ba==0) //B按键自锁
{
if(key_d == 0x04)
{
if(jk==1)
{
D2=~D2;
}
}
} //B自锁
if(da==0) //A按键自锁
{
if(key_d == 0x08)
{
if(jk==1)
{
D3=~D3;
}
}
} //A自锁
if(ca==0) //C按键自锁
{
if(key_d == 0x02)
{
if(jk==1)
{
D1=~D1;
}
}
} //C自锁
if(ea==0) //D按键自锁
{
if(key_d == 0x01)
{
if(jk==1)
{
D0=~D0;
}
}
} //D自锁
if(ba==1)//B按键点动,ba为自锁转点动标志位
{
if(key_d == 0x04){D2=0;}
}
if(da==1)//A按键点动,da为自锁转点动标志位
{
if(key_d == 0x08){D3=0;}
}
if(ca==1)//C按键点动,da为自锁转点动标志位
{
if(key_d == 0x02){D1=0;}
}
if(ea==1)//D按键点动,da为自锁转点动标志位
{
if(key_d == 0x01){D0=0;}
}
}
decode_ok=1;
ss=1;
sn=1;
sj=1;
so=1;
VT=0;
s=30;
break;
- 最近查阅:
免责声明:
本平台旨在开源共享精神,请勿发布敏感信息,任何违法信息我们将移交公安机关;
上一篇: 将来是否也来个AI15W单片机?
下一篇: ISP软件延时计算器问题