樓主的源碼:
- /*STC12C5A60S2 PCA模塊捕獲模式接收紅外遙控和解碼在顯示在LCD1602上,
- P1^3為捕獲輸入引腳,接紅外接收傳感器。普中(HC6800 V3.2)開發箱測試成功*/
- #include<stc12c5a60s2.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit Lcd_RS=P2^6; //LCD數據/命令選擇端(H/L)
- sbit Lcd_RW=P2^5; //LCD讀/寫選擇端(H/L)//
- sbit Lcd_EN=P2^7; //lcd使能端(lcd讀命令時=H,lcd寫命令時=高脈沖)
- sbit Lcd_PSB=P3^2; //并口串口選擇
- sbit Lcd_BF=P0^7; //LCD忙碌端
- code uchar TABLE[]="0123456789ABCDEF"; //LCD顯示用的數字
- uchar IR[33]; //紅外接收捕獲的數據
- uchar IR_i=0; //紅外捕獲次數記錄
- bit F_IR=0; //紅外捕獲起始標記位
- void delay(uint xms) //延時函數約(x)ms
- {
- uint i;
- for(;xms>0;xms--)
- for(i=920;i>0;i--);
- }
- void lcd_read_bf() //讀忙碌標志
- {
- P0=0xff;
- Lcd_RS=0;
- Lcd_RW=1;
- Lcd_EN=1;
- while(Lcd_BF);
- Lcd_EN=0;
- }
- void lcd_write_cmd(uchar cmd) //寫命令
- {
- lcd_read_bf();
- Lcd_RS=0; //選擇寫命令方式
- Lcd_RW=0;
- P0=cmd; //將要寫入的命令數據送到數據總線上
- Lcd_EN=1; //給使能端1高脈沖,先置1
- Lcd_EN=0; //再置0,以完成高脈沖
- }
- void lcd_write_dat(uchar dat) //寫數據
- {
- lcd_read_bf();
- Lcd_RS=1; //選擇寫數據方式
- Lcd_RW=0;
- P0=dat; //將要寫入的命令數據送到數據總線上
- Lcd_EN=1; //給使能端1高脈沖,先置1
- Lcd_EN=0; //再置0,以完成高脈沖
- }
- void lcd_init() //LCD初始化
- {
- Lcd_PSB=1; //串口
- P2&=0xff-0x80-0x20; //并口端口初始化
- lcd_write_cmd(0x38);
- lcd_write_cmd(0x06);
- lcd_write_cmd(0x0c);
- lcd_write_cmd(0x01);
- }
- void pca_init() //PCA模塊初始化 設置成捕獲模式
- {
- CMOD=0x00; //PCA計數器模式寄存器
- CCAPM0=0x11; //PCA比較/捕獲工作模式寄存器
- CL=0x00; //PCA計數寄存器的低8位
- CH=0x00;
- // CCAP0L=0x00; //捕獲寄存器低8位,當PCA模塊用于PWM模式時,用來控制輸出的占空比
- // CCAP0H=0x00; //當CH&L=CCAPnH&L時輸出高電平,故CCAPnH&L越大,輸出高電平時間越短
- CCON=0x01; //PCA控制寄存器 CR=1
- EA=1;
- }
- void init() //系統初始化
- {
- lcd_init();
- pca_init();
- }
- void out_lcd() //LCD顯示
- {
- uchar i,num1,num2,num3,num4,nums;
- for(i=0;i<8;i++)
- {
- num1>>=1;
- if(IR[i]>0x06) num1|=0x80;
- }
- for(i=8;i<16;i++)
- {
- num2>>=1;
- if(IR[i]>0x06) num2|=0x80;
- }
- for(i=16;i<24;i++)
- {
- num3>>=1;
- if(IR[i]>0x06) num3|=0x80;
- }
- for(i=24;i<32;i++)
- {
- num4>>=1;
- if(IR[i]>0x06) num4|=0x80;
- }
- nums=IR[32];
- lcd_write_cmd(0x80);
- lcd_write_dat(TABLE[num1>>4]);
- lcd_write_dat(TABLE[num1&0x0f]);
- lcd_write_dat(' ');
- lcd_write_dat(TABLE[num2>>4]);
- lcd_write_dat(TABLE[num2&0x0f]);
- lcd_write_dat(' ');
- lcd_write_dat(TABLE[num3>>4]);
- lcd_write_dat(TABLE[num3&0x0f]);
- lcd_write_dat(' ');
- lcd_write_dat(TABLE[num4>>4]);
- lcd_write_dat(TABLE[num4&0x0f]);
- lcd_write_dat(' ');
- lcd_write_dat(TABLE[nums>>4]);
- lcd_write_dat(TABLE[nums&0x0f]);
- lcd_write_cmd(0xc0);
- if(num1==0x00&&num2==0xff&&(num3|num4)==0xff)
- {
- lcd_write_dat('y');
- lcd_write_dat('e');
- lcd_write_dat('s');
- lcd_write_dat(' ');
- lcd_write_dat('0');
- lcd_write_dat('x');
- lcd_write_dat(TABLE[num3>>4]);
- lcd_write_dat(TABLE[num3&0x0f]);
- }
- else
- {
- lcd_write_dat('n');
- lcd_write_dat('o');
- lcd_write_dat(' ');
- lcd_write_dat(' ');
- lcd_write_dat(' ');
- lcd_write_dat(' ');
- lcd_write_dat(' ');
- lcd_write_dat(' ');
- lcd_write_dat(' ');
- lcd_write_dat(' ');
- }
- if(nums>2)
- {
- lcd_write_dat(' ');
- lcd_write_dat('s');
- lcd_write_dat('s');
- }
- else
- {
- lcd_write_dat(' ');
- lcd_write_dat(' ');
- lcd_write_dat(' ');
- }
- }
- void main() //主程序
- {
- delay(100);
- init();
- delay(100);
- while(1)
- {
- out_lcd();
- delay(100); //刷新顯示的間隔時間
- }
- }
- void pca_()interrupt 7 //PCA中斷入口
- {
- if(CF) //PCA計數器中斷復位
- {
- CF=0;
- IR_i=0;
- }
- if(CCF0) //捕獲中斷處理捕獲的時間
- {
- CR=1;
- CCF0=0;
- if(F_IR)
- {
- IR[IR_i++]=CCAP0H; //保存捕獲的時間(這里只要高8位即可)
- if(IR_i>=32) //捕獲到32個時間數據后復位等下一個起始信號
- {
- F_IR=0;
- IR_i=0;
- }
- }
- else
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼 |