欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機LCD1602紅外遙控程序問題,這高位低位是怎么取的
[打印本頁]
作者:
馬濤
時間:
2021-2-12 19:28
標題:
單片機LCD1602紅外遙控程序問題,這高位低位是怎么取的
我的問題是這高位低位是怎么取的,IrValue[4]=IrValue[2]>>4; //高位
IrValue[5]=IrValue[2]&0x0f; //低位
還有這個條件是i什么意思if(IrValue[4]>9)為什么要大于9
/*******************************************************************************
單片機與紅外接收模塊的接線說明:
P32-->J11
注意事項:
根據自己使用的LCD1602是否帶有轉接板,如果帶有轉接板的即為4位,需在LCD.H頭文件中
將宏#define LCD1602_4PINS打開,我們這里使用的LCD1602是8位,所以默認將該宏注釋。
實驗現象:
按下紅外遙控器鍵,在LCD1602上即可顯示對應的鍵值碼(注意:需要將紅外遙控器的電池絕緣片抽下)
*******************************************************************************/
#include<reg51.h>
#include"lcd.h"
sbit IRIN=P3^2;
unsigned char code CDIS1[13]={" Red Control "};
unsigned char code CDIS2[13]={" IR-CODE:--H "};
unsigned char IrValue[6];
unsigned char Time;
void IrInit();
void DelayMs(unsigned int );
/*******************************************************************************
* 函數名 : main
* 函數功能 : 主函數
* 輸入 : 無
* 輸出 : 無
*******************************************************************************/
void main()
{
unsigned char i;
IrInit();
LcdInit();
LcdWriteCom(0x80);
for(i=0;i<13;i++)
{
LcdWriteData(CDIS1[i]);
}
LcdWriteCom(0x80+0x40);
for(i=0;i<13;i++)
{
LcdWriteData(CDIS2[i]);
}
while(1)
{
IrValue[4]=IrValue[2]>>4; //高位
IrValue[5]=IrValue[2]&0x0f; //低位
if(IrValue[4]>9)
{
LcdWriteCom(0xc0+0x09); //設置顯示位置
LcdWriteData(0x37+IrValue[4]); //將數值轉換為該顯示的ASCII碼
}
else
{
LcdWriteCom(0xc0+0x09);
LcdWriteData(IrValue[4]+0x30); //將數值轉換為該顯示的ASCII碼
}
if(IrValue[5]>9)
{
LcdWriteCom(0xc0+0x0a);
LcdWriteData(IrValue[5]+0x37); //將數值轉換為該顯示的ASCII碼
}
else
{
LcdWriteCom(0xc0+0x0a);
LcdWriteData(IrValue[5]+0x30); //將數值轉換為該顯示的ASCII碼
}
}
}
/*******************************************************************************
* 函數名 : DelayMs()
* 函數功能 : 延時
* 輸入 : x
* 輸出 : 無
*******************************************************************************/
void DelayMs(unsigned int x) //0.14ms誤差 0us
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++)
{}
}
}
/*******************************************************************************
* 函數名 : IrInit()
* 函數功能 : 初始化紅外線接收
* 輸入 : 無
* 輸出 : 無
*******************************************************************************/
void IrInit()
{
IT0=1;//下降沿觸發
EX0=1;//打開中斷0允許
EA=1; //打開總中斷
IRIN=1;//初始化端口
}
/*******************************************************************************
* 函數名 : ReadIr()
* 函數功能 : 讀取紅外數值的中斷函數
* 輸入 : 無
* 輸出 : 無
*******************************************************************************/
void ReadIr() interrupt 0
{
unsigned char j,k;
unsigned int err;
Time=0;
DelayMs(70);
if(IRIN==0) //確認是否真的接收到正確的信號
{
err=1000; //1000*10us=10ms,超過說明接收到錯誤的信號
/*當兩個條件都為真是循環,如果有一個條件為假的時候跳出循環,免得程序出錯的時
侯,程序死在這里*/
while((IRIN==0)&&(err>0)) //等待前面9ms的低電平過去
{
DelayMs(1);
err--;
}
if(IRIN==1) //如果正確等到9ms低電平
{
err=500;
while((IRIN==1)&&(err>0)) //等待4.5ms的起始高電平過去
{
DelayMs(1);
err--;
}
for(k=0;k<4;k++) //共有4組數據
{
for(j=0;j<8;j++) //接收一組數據
{
err=60;
while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去
// while (!IRIN)
{
DelayMs(1);
err--;
}
err=500;
while((IRIN==1)&&(err>0)) //計算高電平的時間長度。
{
DelayMs(1);//0.14ms
Time++;
err--;
if(Time>30)
{
EX0=1;
return;
}
}
IrValue[k]>>=1; //k表示第幾組數據
if(Time>=8) //如果高電平出現大于565us,那么是1
{
IrValue[k]|=0x80;
}
Time=0; //用完時間要重新賦值
}
}
}
if(IrValue[2]!=~IrValue[3])
{
return;
}
}
}
復制代碼
作者:
csmyldl
時間:
2021-2-13 09:48
IrValue[4]=IrValue[2]>>4; //高位,即一個8位二進制分高4位低4位對應BCD碼,右移4位時高4位補0,原來高4位被 稱至低位
IrValue[5]=IrValue[2]&0x0f; //低位 要去掉高4位,直接把高4位與上邏輯0000即變為0
至于IrValue[4]>9這個條件是因為用4位二進制能表示16個字符,除了數字0-9外,還有A-F的字母,但要用1602顯示必須變為字形碼,在1602中對應的是ASCII碼中查找,可這16個ASCII碼不是連續存放,0-9在一起,A-F在一起,分兩處存放,為了準確找到,故要判斷是字母還是數字,然后對應去查找到相應的字符碼
作者:
人人學會單片機
時間:
2021-2-13 20:21
51單片機紅外解碼過程時序圖
m.raoushi.com/bbs/dpj-200464-1.html
人人學會單片機 視頻教程講過的
作者:
sdfghjksdfghj
時間:
2021-7-3 18:26
這0x37是什么意思
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1