欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
下面這個(gè)單片機(jī)程序里的二維數(shù)組問題
[打印本頁]
作者:
阿飛7812
時(shí)間:
2020-4-22 21:28
標(biāo)題:
下面這個(gè)單片機(jī)程序里的二維數(shù)組問題
這是
zhangxinchun的貼子 有這段沒看明白 da1527[rep][ii]&=~(1<<((7-k)));數(shù)組里的值是最后多少
特別是這里~(1<<((7-k))) 望高人們指點(diǎn)
單片機(jī)源程序如下:
//測(cè)試單片機(jī):STC15W408AS
//晶振:內(nèi)部 11.0592mHZ
//復(fù)位方式:內(nèi)部復(fù)位
//串口通訊:波特率9600/數(shù)據(jù)位8/停止位1/無校驗(yàn)
//調(diào)試環(huán)境:KEIL3
//程序功能:實(shí)現(xiàn)2262解碼,學(xué)習(xí)、自適應(yīng)多阻值,片內(nèi)EEPROM,存儲(chǔ)60個(gè)遙控器數(shù)據(jù)
// 不依賴硬件,不占用硬件資源。移植更加方便
// 學(xué)習(xí)遙控器:按一下學(xué)習(xí)鍵,學(xué)習(xí)燈點(diǎn)亮,松開學(xué)習(xí)鍵,按動(dòng)要學(xué)習(xí)的遙控器按鍵,學(xué)習(xí)燈熄滅,學(xué)習(xí)成功。重復(fù)上述操作可學(xué)習(xí)多個(gè)遙控器.
//
// 清除:按住學(xué)習(xí)鍵不放,直到學(xué)習(xí)燈自動(dòng)熄滅,擦除成功.
/**********************************************************/
#include <STC15W408AS.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RF = P1^1; //信號(hào)輸入
sbit LED = P3^3; //學(xué)習(xí)指示燈
sbit set = P1^2; //學(xué)習(xí)鍵
sbit D0 = P3^4; //1號(hào)繼電器解碼輸出
sbit D1 = P3^5; //2號(hào)繼電器
sbit D2 = P3^6; //3號(hào)繼電器
sbit D3 = P3^7; //4號(hào)繼電器
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; //收到有效數(shù)據(jù)
bit study; //學(xué)習(xí)標(biāo)志
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[2][3]; //解碼過程中臨時(shí)數(shù)組
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[181]; //遙控器編碼數(shù)組,存放60個(gè)遙控器
void delay_1ms(uint x) //1毫秒延時(shí)
{
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--;
}
}
//====================================================
/////////片內(nèi)EEPROM讀寫驅(qū)動(dòng)程序///////////////////////////
//====================================================
void IAP_Disable() //關(guān)閉IAP
{
//關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
//一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
IAP_CONTR = 0; //關(guān)閉IAP 功能
IAP_CMD = 0; //清命令寄存器,使命令寄存器無命令,此句可不用
IAP_TRIG = 0; //清命令觸發(fā)寄存器,使命令觸發(fā)寄存器無觸發(fā),此句可不用
IAP_ADDRH = 0;
IAP_ADDRL = 0;
}//
//讀一字節(jié),調(diào)用前需打開IAP 功能,入口:DPTR = 字節(jié)地址,返回:A = 讀出字節(jié)
uchar read_add(uint addr) //讀EEPROM
{
IAP_DATA = 0x00;
IAP_CONTR = 0x84; //打開IAP 功能, 設(shè)置Flash 操作等待時(shí)間
IAP_CMD = 0x01; //IAP/ISP/EEPROM 字節(jié)讀命令
IAP_ADDRH = addr>>8; //設(shè)置目標(biāo)單元地址的高8 位地址
IAP_ADDRL = addr&0xff; //設(shè)置目標(biāo)單元地址的低8 位地址
EA = 0;
IAP_TRIG = 0x5a; //先送 46h,再送B9h 到ISP/IAP 觸發(fā)寄存器,每次都需如此
IAP_TRIG = 0xa5; //送完 B9h 后,ISP/IAP 命令立即被觸發(fā)起動(dòng)
_nop_();
EA = 1;
IAP_Disable(); //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
//一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
return (IAP_DATA);
}//------------------------------------------------------------------------------
//字節(jié)編程,調(diào)用前需打開IAP 功能,入口:DPTR = 字節(jié)地址, A= 須編程字節(jié)的數(shù)據(jù)
void write_add(uint addr,uchar ch) //直接寫EEPROM
{
IAP_CONTR = 0x84; //打開 IAP 功能, 設(shè)置Flash 操作等待時(shí)間
IAP_CMD = 0x02; //IAP/ISP/EEPROM 字節(jié)編程命令
IAP_ADDRH = addr>>8; //設(shè)置目標(biāo)單元地址的高8 位地址
IAP_ADDRL = addr&0xff; //設(shè)置目標(biāo)單元地址的低8 位地址
IAP_DATA = ch; //要編程的數(shù)據(jù)先送進(jìn)IAP_DATA 寄存器
EA = 0;
IAP_TRIG = 0x5a; //先送 46h,再送B9h 到ISP/IAP 觸發(fā)寄存器,每次都需如此
IAP_TRIG = 0xa5; //送完 B9h 后,ISP/IAP 命令立即被觸發(fā)起動(dòng)
_nop_();
EA = 1;
IAP_Disable(); //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
//一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
}//------------------------------------------------------------------------------
//擦除扇區(qū), 入口:DPTR = 扇區(qū)地址
void Sector_Erase(uint addr) //扇區(qū)擦除
{
IAP_CONTR = 0x84; //打開IAP 功能, 設(shè)置Flash 操作等待時(shí)間
IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇區(qū)擦除命令
IAP_ADDRH =addr>>8; //設(shè)置目標(biāo)單元地址的高8 位地址
IAP_ADDRL =addr&0xff; //設(shè)置目標(biāo)單元地址的低8 位地址
EA = 0;
IAP_TRIG = 0x5a; //先送 46h,再送B9h 到ISP/IAP 觸發(fā)寄存器,每次都需如此
IAP_TRIG = 0xa5; //送完 B9h 后,ISP/IAP 命令立即被觸發(fā)起動(dòng)
_nop_();
EA = 1;
}//------------------------------------------------------------------------------
//============================接收解碼部分========================================//
void RF_decode()
{
uchar ii=0,j=0,k=0,rep=0;
uint head_k=0; //短脈沖寬度
uchar s;
//-------------------------------數(shù)據(jù)接收-----------------------------------------
short_k=0;
while(RF && j<250) //檢測(cè)頭信號(hào)前一個(gè)高脈沖的寬度
{
delay(1);
short_k++;
}
while(!RF)
{
delay(1);
head_k++;
} //檢測(cè)頭脈沖的寬度
if(((short_k*24)<head_k) && (head_k<(short_k*38))) //引導(dǎo)碼寬度是窄脈沖的32倍 24/38
{
for(rep=0;rep<2;rep++)
{
for(ii=0;ii<3;ii++)//3字節(jié)
{
for(k=0;k<8;k++)//每個(gè)字節(jié)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[rep][ii]&=~(1<<((7-k)));
}
else if(j>(short_k*1.96)&&j<(short_k*5))da1527[rep][ii]|=(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++;} //跳個(gè)最后一個(gè)高脈沖
head_k=0;while(!RF) {delay(1);head_k++;} //檢測(cè)下一個(gè)前導(dǎo)信號(hào)的寬度
if((head_k<(short_k*26)) || (head_k>(short_k*38))) {return;} //引導(dǎo)碼寬度是窄脈沖的32倍 //亂碼退出
}
//+++++++++++++++++++++++++2262與1527數(shù)據(jù)分離處理++++++++++++++++++++++++++++++++++++++++
if((da1527[0][0]==da1527[1][0]) && (da1527[0][1]==da1527[1][1]) && (da1527[0][2]==da1527[1][2])) //兩次接收到的數(shù)據(jù)相同
{
uchar u,i,x;
rf_ok=1;
for(i=0;i<3;i++) //判定2262與1527
{
for(u=0;u<4;u++) {if(((da1527[0][i]>>(u*2)) & 3)==2) {i=80;break;}} //有10則為1527
if(i==80) break;
}
if(i==80) //1527
{
key_d=da1527[1][2] & 0x0f; //分出1527的按鍵值
da1527[0][2]=da1527[1][2]>>4; //分出1527的后4位地址
jmnx=1; //為0是2262,1是1527
}
else //2262
{
key_d=0;
for(i=0;i<4;i++){if(((da1527[0][2]>>(i*2))&3)==3) key_d|=1<<i;} //計(jì)算出2262的按鍵數(shù)據(jù)
da1527[0][2]=0x00; //2262無后4位地址,全為0
jmnx=0; //為0是2262,1是1527
jk++;//自鎖用,作用:按下按鍵不松手繼電器狀態(tài)不變,松開再按下改變,一次只改變一次狀態(tài),因?yàn)榘聪掳存I后遙控會(huì)一直發(fā)碼,所以讓jk一直自加,但是只取jk=1的值的狀態(tài)
}
if (!study) //非學(xué)習(xí)狀態(tài)
{
rf_ok=0;
for(x=0;x<60;x++)
{
if((da1527[0][0]==key_number[x*3+1])&&(da1527[0][1]==key_number[x*3+2])
&&(da1527[0][2]==key_number[x*3+3]))//判斷是否已學(xué)習(xí)過的編碼
{
// 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按鍵點(diǎn)動(dòng),ba為自鎖轉(zhuǎn)點(diǎn)動(dòng)標(biāo)志位
{
if(key_d == 0x04){D2=0;}
}
if(da==1)//A按鍵點(diǎn)動(dòng),da為自鎖轉(zhuǎn)點(diǎn)動(dòng)標(biāo)志位
{
if(key_d == 0x08){D3=0;}
}
if(ca==1)//C按鍵點(diǎn)動(dòng),da為自鎖轉(zhuǎn)點(diǎn)動(dòng)標(biāo)志位
{
if(key_d == 0x02){D1=0;}
}
if(ea==1)//D按鍵點(diǎn)動(dòng),da為自鎖轉(zhuǎn)點(diǎn)動(dòng)標(biāo)志位
{
if(key_d == 0x01){D0=0;}
}
}
decode_ok=1;
ss=1;
sn=1;
sj=1;
so=1;
VT=0;
s=30;
break;
}
}
}
}
}
復(fù)制代碼
作者:
wo4fisher
時(shí)間:
2020-4-23 10:23
~這個(gè)操作符是按位取反。
1<<x的意思是1向左移動(dòng)x位,起始位是0位,1左移位結(jié)果二進(jìn)制的話就是 0000 0100(一個(gè)字節(jié)的話)。
上邊組合起來就是1左移x位之后,按位取反。那么上邊的結(jié)果就會(huì)變成1111 1011。
之所以這么做,這是與矩陣按鍵判斷所在行/列的值相關(guān)的
作者:
阿飛7812
時(shí)間:
2020-4-24 20:55
wo4fisher 發(fā)表于 2020-4-23 10:23
~這個(gè)操作符是按位取反。
1
謝謝指點(diǎn) 這點(diǎn)我懂了 我還想請(qǐng)教數(shù)組是二維, 我想知程序進(jìn)來這二個(gè)括號(hào),等號(hào)右邊值是給左邊這二個(gè)括右邊那個(gè),還是左邊括號(hào),
如接收值是01010100 10011111 11110001那么這個(gè)二維數(shù)組是這樣的嗎[00000000][01010100] [11111111][10011111] [22222222][11110001]請(qǐng)指點(diǎn)
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1