亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標(biāo)題:
單片機(jī)紅外接收程序(Nokia5110液晶屏顯示)
[打印本頁(yè)]
作者:
51黑z
時(shí)間:
2016-9-11 22:23
標(biāo)題:
單片機(jī)紅外接收程序(Nokia5110液晶屏顯示)
0.png
(71.46 KB, 下載次數(shù): 84)
下載附件
2016-9-11 22:21 上傳
本例程,實(shí)現(xiàn)單片機(jī)紅外接收解碼,并用nokia5110液晶屏來顯示內(nèi)容。完整keil工程文件下載:
http://www.denmoz.com/bbs/dpj-55490-1.html
下面是部分程序代碼的預(yù)覽:
主程序:
#include "IR_Receive.h"
#include "Nokia5110.h"
#include "delay.h"
extern uint8_t IRcode_Type;//紅外數(shù)據(jù)類型,RCA或NEC8或NEC16
extern uint16_t IRcode[2]; //紅外數(shù)據(jù)中的系統(tǒng)碼IRcode[0],紅外數(shù)據(jù)中的用戶碼IRcode[1]
extern uint32_t RCAcode_Original;//RCA協(xié)議原碼
extern uint32_t NECcode_Original;//NEC原始數(shù)據(jù)
void main(void)
{
IRreceiver_Init();
Nokia5110_Init();
Nokia5110_WriteString(0,0,"*IR_Receiver*");
Nokia5110_WriteString(2,0,"Rev:**********");
Nokia5110_WriteString(3,0,"CodeType:****");
Nokia5110_WriteString(4,0,"SysCode :****");
Nokia5110_WriteString(5,0,"UserCode:****");
while(1)
{
if(IRdata_Analysis())//解析成功串口打印正確紅外碼值
{
Nokia5110_Clear(1,5);
switch(IRcode_Type)
{
case IRcode_TypeRCA:
{
Nokia5110_Printf(2,0,"Rev:",RCAcode_Original,Hex);//打印出未進(jìn)行解析的原始紅外RCA數(shù)據(jù)
Nokia5110_WriteString(3,0,"CodeType: RCA");
Nokia5110_Printf(4,0,"SysCode : ",IRcode[0],Hex);
Nokia5110_Printf(5,0,"UserCode: ",IRcode[1],Hex);
break;
}
case IRcode_TypeNEC8:
{
Nokia5110_Printf(2,0,"Rev:",NECcode_Original,Hex);//打印出未進(jìn)行解析的原始紅外NEC數(shù)據(jù)
Nokia5110_WriteString(3,0,"CodeType: NEC8");
Nokia5110_Printf(4,0,"SysCode : ",IRcode[0],Hex);
Nokia5110_Printf(5,0,"UserCode: ",IRcode[1],Hex);
break;
}
case IRcode_TypeNEC16:
{
Nokia5110_Printf(2,0,"Rev:",NECcode_Original,Hex);//打印出未進(jìn)行解析的原始紅外NEC數(shù)據(jù)
Nokia5110_WriteString(3,0,"CodeType:NEC16");
Nokia5110_Printf(4,0,"SysCode:",IRcode[0],Hex);
Nokia5110_Printf(5,0,"UserCode:",IRcode[1],Hex);
break;
}
default:{break;}
}
IRcode_Type = IRcode_TypeNone;
Buzzer_Speak();//解碼成功,蜂鳴器響
}
}
}
復(fù)制代碼
#include "Nokia5110.h"
#include "ASII_Font.h"
#include "IR_Receive.h"
uint8_t Dex_Hex_Buffer[Length_Max];//數(shù)據(jù)緩沖區(qū)
extern uint8_t IRcode_Type;//定義收到的紅外數(shù)據(jù)類型
/*************************************************************************************
函數(shù):void Divide_Dex_Hex(uint32_t Num,uint8_t Format)
功能:數(shù)據(jù)分離,儲(chǔ)存在緩沖中數(shù)組中,低位~高位=[0]~[Length_Max-1],返回?cái)?shù)據(jù)位數(shù)
*************************************************************************************/
uint8_t Divide_Dex_Hex(uint32_t Num,uint8_t Format)
{
signed char i=0;
uint8_t Num_Cnt = 0;
for(i=0;i<Length_Max;i++) //緩沖清零
{
Dex_Hex_Buffer[i] = '0';
}
if(Num == 0)//Num = 0處理
{
if(Format == Dex)return 1;
if(Format == Hex)return 2;
}
else if(Format == Dex)//把數(shù)據(jù)分離成十進(jìn)制數(shù)
{
i = 0;
while(Num)
{
Dex_Hex_Buffer[i] = Num%10+'0';//處理成ASIIC碼
Num /= 10;
Num_Cnt++;
i++;
}
}
else if(Format == Hex)//把數(shù)據(jù)分離成十六進(jìn)制數(shù)
{
i = 0;
while(Num)
{
Dex_Hex_Buffer[i] = Num%16;
Num /= 16;
Num_Cnt++;
i++;
}
for(i=Num_Cnt-1;i>=0;i--) //把分離出來的十六進(jìn)制數(shù)據(jù)處理成ASIIC碼
{
if(Dex_Hex_Buffer[i]<10)
{
Dex_Hex_Buffer[i] += 0x30;
}
else
{
Dex_Hex_Buffer[i] = Dex_Hex_Buffer[i]-0x0A+0x41;
}
}
if(Num_Cnt%2)Num_Cnt+=1; //十六進(jìn)制返回的位數(shù)強(qiáng)制為偶數(shù)
}
return Num_Cnt;//返回?cái)?shù)據(jù)十進(jìn)制或十六進(jìn)制位數(shù)
}
/*******************************************************
函數(shù):void Nokia5110_Write(uint8_t dat,bit data_cmd);
功能:向Nokia5110中寫入數(shù)據(jù)或命令;
*******************************************************/
void Nokia5110_Write(uint8_t dat,bit data_cmd)
{
uint8_t i;
LCD_CE = 0; /*使能5110*/
LCD_DC = data_cmd; /*DC=1,寫入數(shù)據(jù);DC=0,寫入命令*/
for(i=0;i<8;i++)
{
if(dat&0x80)
{
LCD_DIN = 1;
}
else
{
LCD_DIN = 0;
}
LCD_CLK = 0;
dat<<=1;
LCD_CLK = 1;
}
LCD_CE = 1; /*關(guān)閉5110*/
}
/************************************************************************************************
函數(shù):void Nokia5110_Clear(uint8_t Y_Start, uint8_t Y_End);
功能:對(duì)Nokia5110選擇性區(qū)域進(jìn)行清屏;
***********************************************************************************************/
void Nokia5110_Clear(uint8_t Y_Start, uint8_t Y_End)
{
uint16_t i;
uint16_t AreaSize = 0;
Nokia5110_Write(0x80|0x00,CMD);
Nokia5110_Write(0x40|Y_Start,CMD);
AreaSize = 84*(Y_End-Y_Start+1);
for(i=0;i<AreaSize;i++)
{
Nokia5110_Write(0x00,DATA);
}
}
/*******************************************************
函數(shù):void Nokia5110_Init();
功能:對(duì)Nokia5110進(jìn)行初始化;
*******************************************************/
void Nokia5110_Init(void)
{
delay_us(10);
LCD_RST = 0;
delay_us(10);
LCD_RST = 1; //RST=1 復(fù)位,開始寫數(shù)據(jù)
Nokia5110_Write(0x21,CMD); //使用擴(kuò)展指令集,水平尋址
Nokia5110_Write(0xC5,CMD); //寫Vop到寄存器
Nokia5110_Write(0x07,CMD); //溫度系數(shù)3
Nokia5110_Write(0x13,CMD); //偏置值1:48
Nokia5110_Write(0x20,CMD); //使用基本指令集,水平尋址
Nokia5110_Write(0x0C,CMD); //選擇普通模式
Nokia5110_Clear(0,5); //清屏
}
/*******************************************************
函數(shù):void Nokia5110_SetRC(uint8_t line,uint8_t lie);
功能:顯示屏坐標(biāo)設(shè)定,R:line=0~5,C:lie=0~13;
*******************************************************/
void Nokia5110_SetRC(uint8_t line,uint8_t lie)
{
lie*=6;
Nokia5110_Write(0x40|line,CMD);
Nokia5110_Write(0x80|lie, CMD);
}
/*******************************************************
函數(shù):void Nokia5110_WriteChar(uint8_t Char);
功能:向5110液晶屏中寫入一個(gè)字節(jié);
*******************************************************/
void Nokia5110_WriteChar(uint8_t Char)
{
uint8_t i,j;
i = Char-0x20;
for(j=0;j<6;j++)
{
Nokia5110_Write(ASII_Font[i][j],DATA);
}
}
/*************************************************************************************
函數(shù):void Nokia5110_WriteString(uint8_t line,uint8_t lie,uint8_t *pString);
功能:向5110液晶屏指定地址開始寫入字符串;
************************************************************************************/
void Nokia5110_WriteString(uint8_t line,uint8_t lie,uint8_t *pString)
{
Nokia5110_SetRC(line,lie);
while(*pString != '\0')
{
Nokia5110_WriteChar(*pString);
pString++;
}
}
/*************************************************************************************
函數(shù):void Nokia5110_ClearData(uint8_t line,uint8_t lie,uint8_t Length);
功能:清除指定坐標(biāo)中的指定長(zhǎng)度數(shù)據(jù)
************************************************************************************/
void Nokia5110_ClearData(uint8_t line,uint8_t lie,uint8_t Length)
{
uint8_t i=0;
Nokia5110_SetRC(line,lie);
for(i=0;i<Length;i++)
{
Nokia5110_WriteChar(' ');
}
}
/***************************************************************************************************
函數(shù):void Nokia5110_Printf(uint8_t hang,uint8_t,lie,uint8_t *String,uint32_t Value,uint8_t Format);
功能:以十進(jìn)制或者十六進(jìn)制往5110液晶屏中寫ASIIC數(shù)據(jù);
**************************************************************************************************/
void Nokia5110_Printf(uint8_t hang,uint8_t lie,uint8_t *pString,uint32_t Value,uint8_t Format)
{
uint8_t i;
static uint8_t SysCode4Bit_Flag = 0;//系統(tǒng)碼為4位標(biāo)志位,用于顯示NEC16系統(tǒng)碼高八位為0
uint8_t Num_Cnt = 0;
Num_Cnt = Divide_Dex_Hex(Value,Format);
if((IRcode_Type==IRcode_TypeRCA)&&(Num_Cnt==4))//處理RCA系統(tǒng)碼為0的情況,原碼需要把00顯示出來
{
Num_Cnt = 6;
}
if((IRcode_Type==IRcode_TypeNEC8)&&(Num_Cnt==6))//處理NEC8系統(tǒng)碼為0的情況,原碼需要把00顯示出來
{
Num_Cnt = 8;
}
if((IRcode_Type==IRcode_TypeNEC16)&&(Num_Cnt==6))//處理NEC16系統(tǒng)碼高八位為0的情況,原碼需要把00顯示出來
{
Num_Cnt = 8;
SysCode4Bit_Flag = 1;
}
if((SysCode4Bit_Flag==1)&&(Num_Cnt==2))//處理NEC16系統(tǒng)碼高八位為0的情況,系統(tǒng)碼需要把00顯示出來
{
SysCode4Bit_Flag = 0;
Num_Cnt = 4;
}
Nokia5110_WriteString(hang,lie,pString);
if(Format==Hex)
{
Nokia5110_WriteChar('0');
Nokia5110_WriteChar('x');
}
for(i=0;i<Num_Cnt;i++)
{
Nokia5110_WriteChar(Dex_Hex_Buffer[(Num_Cnt-1)-i]);
}
}
復(fù)制代碼
#include "STC89Cx_it.h"
#include "IR_Receive.h"
//紅外解碼原理:把紅外中的載波解調(diào)成低電平,把紅外中的低電平解調(diào)成高電平輸出
//識(shí)別原理:識(shí)別一個(gè)完整周期的高低電平總時(shí)間來識(shí)別頭碼和"0"或"1"的值
#define Rev_Header 0x00 //數(shù)據(jù)接收狀態(tài):接收頭碼0xAA或oxAB
#define Rev_Length 0x01 //數(shù)據(jù)接收狀態(tài):接收頭碼數(shù)據(jù)包長(zhǎng)度
#define Rev_DataPackage 0x02 //數(shù)據(jù)接收狀態(tài):接收數(shù)據(jù)包
extern uint8_t IRcode_Type; //聲明收到的紅外數(shù)據(jù)類型
extern uint8_t IRdataReceive_Flag;//聲明接收紅外數(shù)據(jù)狀態(tài),等待or接收中or接收完畢
extern uint32_t IRcode_Buffer; //紅外數(shù)據(jù)緩存
uint8_t CycleTime = 0; //存儲(chǔ)完整周期時(shí)間(高電平+低電平)
/**********************************************
函數(shù):void INT0_Handler(void);
功能:外部中斷0中斷處理函數(shù);
***********************************************/
void INT0_Handler(void) interrupt 0
{
}
/**********************************************
函數(shù):void TIME0_Handler(void);
功能:定時(shí)器0中斷處理函數(shù);
***********************************************/
void TIME0_Handler(void) interrupt 1
{
CycleTime++;
if(CycleTime==255)CycleTime=0;
}
/**********************************************
函數(shù):void INT1_Handler(void);
功能:外部中斷1中斷處理函數(shù);
***********************************************/
void INT1_Handler(void) interrupt 2
{
static uint8_t EnterINT0_CNT = 0;//存儲(chǔ)進(jìn)入外部中斷次數(shù)
static uint8_t Rev_State = Rev_Header;//定義接收狀態(tài)
uint8_t CycleTime_Buffer=0; //周期時(shí)間緩沖變量
EnterINT0_CNT++; //每進(jìn)入中斷一次加1
//第一次進(jìn)入中斷周期清零,打開定時(shí)器0準(zhǔn)備計(jì)時(shí)
if(EnterINT0_CNT==1)
{
CycleTime=0;
IRcode_Buffer=0;
TR0=1;
}
else//之后先讀時(shí)間,再進(jìn)行清零
{
CycleTime_Buffer=CycleTime;
CycleTime = 0;
}
//開始識(shí)別頭碼
if((Rev_State==Rev_Header)&&(EnterINT0_CNT==2))
{
Rev_State = Rev_DataPackage;
if((CycleTime_Buffer>60)&&(CycleTime_Buffer<100)) //頭碼時(shí)間位于6.0ms~10ms則為RCA碼(標(biāo)準(zhǔn)8ms)
{
IRcode_Type = IRcode_TypeRCA;
}
else if((CycleTime_Buffer>110)&&(CycleTime_Buffer<160))//頭碼時(shí)間位于11ms~16ms(必須是大于11ms)則為NEC碼(標(biāo)準(zhǔn)13.5ms)
{
IRcode_Type = IRcode_TypeNEC8;
}
else//如果都不是,則認(rèn)為沒有收到頭碼
{
TR0=0;
IRcode_Buffer = 0;
EnterINT0_CNT = 0;
Rev_State = Rev_Header;
}
}
if((Rev_State==Rev_DataPackage)&&(EnterINT0_CNT>2))//開始解碼
{
IRcode_Buffer <<= 1;
switch(IRcode_Type)
{
case IRcode_TypeRCA:
{
if((CycleTime_Buffer>10)&&(CycleTime_Buffer<20))//碼值時(shí)間位于1.0ms~2.0ms則為RCA'1'(標(biāo)準(zhǔn)1.5ms)
{
IRcode_Buffer |= (uint32_t)0x01;
}
else if((CycleTime_Buffer>20)&&(CycleTime_Buffer<30))//碼值時(shí)間位于1.0ms~2.0ms則為RCA'0'(標(biāo)準(zhǔn)2.5ms)
{
IRcode_Buffer |= (uint32_t)0x00;
}
else
{
TR0=0;
IRcode_Buffer = 0;
EnterINT0_CNT = 0;
Rev_State = Rev_Header;
}
break;
}
case IRcode_TypeNEC8:
{
if((CycleTime_Buffer>6)&&(CycleTime_Buffer<16))//碼值時(shí)間位于0.6ms~1.6ms則為NEC'0'(標(biāo)準(zhǔn)1.124ms)
{
IRcode_Buffer |= (uint32_t)0x00;
}
else if((CycleTime_Buffer>16)&&(CycleTime_Buffer<28))//碼值時(shí)間位于1.6ms~2.8ms則為NEC'1'(標(biāo)準(zhǔn)2.25ms)
{
IRcode_Buffer |= (uint32_t)0x01;
}
else
{
TR0=0;
IRcode_Buffer = 0;
EnterINT0_CNT = 0;
Rev_State = Rev_Header;
}
break;
}
}
if(((EnterINT0_CNT==26)&&((IRcode_Type==IRcode_TypeRCA)))||((EnterINT0_CNT==34)&&((IRcode_Type==IRcode_TypeNEC8))))//RCA碼加頭碼25,NEC碼加頭碼33位,解碼進(jìn)入中斷次數(shù)分別為26和34
{
TR0=0;//解碼完畢關(guān)閉定時(shí)器
EnterINT0_CNT=0;
IRdataReceive_Flag=IRdataReceive_Success;
Rev_State = Rev_Header;//準(zhǔn)備下一次接收
}
}
}
/**********************************************
函數(shù):void TIME1_Handler(void);
功能:定時(shí)器1中斷處理函數(shù);
***********************************************/
void TIME1_Handler(void) interrupt 3
{
}
/**********************************************
函數(shù):void USART_Handler(void);
功能:串口中斷處理函數(shù);
***********************************************/
void USART_Handler(void) interrupt 4
{
}
/**********************************************
函數(shù):void TIME2_Handler(void);
功能:定時(shí)器2中斷處理函數(shù);
***********************************************/
void TIME2_Handler(void) interrupt 5
{
}
復(fù)制代碼
作者:
騰飛的龍
時(shí)間:
2018-3-28 17:08
沒有試驗(yàn)不知道好用不。還得感謝分享!!贊
作者:
單片機(jī)初級(jí)選手
時(shí)間:
2018-3-30 17:11
感謝分享
作者:
012138ww
時(shí)間:
2018-6-13 20:21
感謝分享
作者:
心素如簡(jiǎn)c
時(shí)間:
2020-6-28 16:53
這個(gè)有帶仿真原理圖嗎
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1