楼主的源码:
- /*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黑下载附件…………
复制代码 |