給段紅外解碼,1602顯示參考程序:
#include
#include
#include
#define TURE 1
#define FALSE 0
sbit IR=P3^2;? //紅外接口標志
sbit RS = P2^4;//Pin4
sbit RW = P2^5;//Pin5
sbit E? = P2^6;//Pin6
#define Data P0//數據端口
unsigned int hour,minute,second,count;
char code Tab[16]="0123456789ABCDEF";
char data TimeNum[]="??????????????? ";
char data Test1[]="????????????????? ";
/******************************************************************/
/*??????????????????? 變量聲明??????????????????????????????????? */
/******************************************************************/
unsigned char? irtime;//紅外用全局變量
bit irpro_ok,irok;
unsigned char?? IRcord[4];? //處理后的紅外碼,分別是 客戶碼,客戶碼,數據碼,數據碼反碼
unsigned char?? irdata[33]; //33個高低電平的時間數據
/******************************************************************/
/*??????????????????? 函數聲明??????????????????????????????????? */
/******************************************************************/
void Ir_work(void);
void Ircordpro(void);
void ShowString (unsigned char line,char *ptr);
/******************************************************************/
/*??????????????????? 定時器0中斷服務函數???????????????????????? */
/******************************************************************/
void tim0_isr (void) interrupt 1 using 1//定時器0中斷服務函數
{
? irtime++;???????????????????????????? //用于計數2個下降沿之間的時間
}
/******************************************************************/
/*??????????????????? 外部中斷0函數?????????????????????????????? */
/******************************************************************/
void ex0_isr (void) interrupt 0 using 0//外部中斷0服務函數
{
? static unsigned char? i;???????????? //接收紅外信號處理
? static bit startflag;??????????????? //是否開始處理標志位
if(startflag)?????????????????????????
{
???
??? if(irtime<63&&irtime>=33)//引導碼 TC9012的頭碼,9ms+4.5ms
??????????? i=0;
?????
???? irdata=irtime;//存儲每個電平的持續時間,用于以后判斷是0還是1
???? irtime=0;
???? i++;
???? if(i==33)
?????? {
??? irok=1;
i=0;
?? }
????????? }
?
??? else
{irtime=0;startflag=1;}
}
/******************************************************************/
/*?????????????????? 定時器0初始化??????????????????????????????? */
/******************************************************************/
void TIM0init(void)//定時器0初始化
{
? TMOD=0x02;//定時器0工作方式2,TH0是重裝值,TL0是初值
? TH0=0x00; //重載值
? TL0=0x00; //初始化值
? ET0=1;??? //開中斷
? TR0=1;????
}
/******************************************************************/
/*?????????????????? 外部中斷初始化?????????????????????????????? */
/******************************************************************/
void EX0init(void)
{
IT0 = 1;?? //指定外部中斷0下降沿觸發,INT0 (P3.2)
EX0 = 1;?? //使能外部中斷
EA = 1;??? //開總中斷
}
/******************************************************************/
/*??????????????????? 紅外鍵值處理??????????????????????????????? */
/******************************************************************/
? void Ir_work(void)??????? //紅外鍵值散轉程序
? {
???????
?????? TimeNum[5] = Tab[IRcord[0]/16];?? //處理客戶碼并顯示
?? TimeNum[6] = Tab[IRcord[0]%16];
?? TimeNum[8] = Tab[IRcord[1]/16];?? //處理客戶碼并顯示
?? TimeNum[9] = Tab[IRcord[1]%16];
?? TimeNum[11] = Tab[IRcord[2]/16];? //處理數據碼并顯示
?? TimeNum[12] = Tab[IRcord[2]%16];
?? TimeNum[14] = Tab[IRcord[3]/16];? //處理數據反碼并顯示
?? TimeNum[15] = Tab[IRcord[3]%16];
?
?????? ShowString(1,TimeNum);//顯示處理過后的碼值
?? irpro_ok=0;?????????? //處理完成后清楚標志位
? }
/******************************************************************/
/*??????????????????? 紅外解碼函數處理??????????????????????????? */
/******************************************************************/
void Ircordpro(void)//紅外碼值處理函數
{?
? unsigned char i, j, k;
? unsigned char cord,value;
? k=1;
? for(i=0;i<4;i++)????? //處理4個字節
???? {
????? for(j=1;j<=8;j++) //處理1個字節8位
???????? {
????????? cord=irdata[k];
????????? if(cord>7)//大于某值為1,這個和晶振有絕對關系,這里使用12M計算,此值可以有一定誤差
??? {
???????????? value=value|0x80;
}
????????? else?
??? {
???????????? value=value;
}
????????? if(j<8)
??? {
value=value>>1;
}
?????????? k++;
???????? }
???? IRcord=value;
???? value=0;?????
???? } irpro_ok=1;//處理完畢標志位置1
????
}
/******************************************************************/
/*??????????????????? 微秒延時函數??????????????????????????????? */
/******************************************************************/
void DelayUs(unsigned char us)//delay us
{
unsigned char uscnt;
uscnt=us>>1;/* Crystal frequency in 12MHz*/
while(--uscnt);
}
/******************************************************************/
/*??????????????????? 毫秒函數聲明??????????????????????????????? */
/******************************************************************/
void DelayMs(unsigned char ms)//delay Ms
{
while(--ms)
?? {
???? DelayUs(250);
???? DelayUs(250);
DelayUs(250);
DelayUs(250);
?? }
}
/******************************************************************/
/*?????????????????? 寫入命令函數???????????????????????????????? */
/******************************************************************/
void WriteCommand(unsigned char c)
{
DelayMs(5);//操作前短暫延時,保證信號穩定
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
/******************************************************************/
/*?????????????????? 寫入數據函數???????????????????????????????? */
/******************************************************************/
void WriteData(unsigned char c)
{
DelayMs(5);? //操作前短暫延時,保證信號穩定
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
/******************************************************************/
/*?????????????????? 寫入字節函數???????????????????????????????? */
/******************************************************************/
void ShowChar(unsigned char pos,unsigned char c)
{
unsigned char p;
if (pos>=0x10)
??? p=pos+0xb0; //是第二行則命令代碼高4位為0xc
else?
??? p=pos+0x80; //是第二行則命令代碼高4位為0x8
WriteCommand (p);//寫命令
WriteData (c);?? //寫數據
}
/******************************************************************/
/*?????????????????? 寫入字符串函數?????????????????????????????? */
/******************************************************************/
void ShowString (unsigned char line,char *ptr)
{
unsigned char l,i;
l=line<<4;
for (i=0;i<16;i++)
? ShowChar (l++,*(ptr+i));//循環顯示16個字符
}
/******************************************************************/
/*?????????????????? 初始化函數?????????????????????????????????? */
/******************************************************************/
void InitLcd()
{
DelayMs(15);
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x06); //顯示光標移動位置
WriteCommand(0x0c); //顯示開及光標設置
WriteCommand(0x01); //顯示清屏
}
/******************************************************************/
/*?????????????????? 主函數?????????????????????????????????????? */
/******************************************************************/
void main(void)
{
EX0init(); //初始化外部中斷
TIM0init();//初始化定時器
InitLcd(); //初始化液晶
DelayMs(15);
sprintf(Test1," www.nxhydt.com ");? //顯示第一行固定信息
ShowString(0,Test1);
sprintf(TimeNum,"Code??????????? ");//顯示第二行固定信息
ShowString(1,TimeNum);
while(1)//主循環
?? {
??? if(irok)??????????????????????? //如果接收好了進行紅外處理
? {???
?? Ircordpro();
???? irok=0;
? }
??? if(irpro_ok)?????????????????? //如果處理好后進行工作處理,如按對應的按鍵后顯示對應的數字等
? {
?? Ir_work();
???? }
?? }
}?
評論
查看更多