📄 lcd_887+12864.c
字号:
//遥控器采用中断法扫描
//此程序是用DS12C887作为时钟,显示采用12864;
//带遥控器调节的,【调试中】,采用ME 500B 平台;
//遥控器的用户头码的反码是0xf7,用户码0x16是功能输入选择;0x00是功能加;0x01是功能减;
//采用intel模式 能够正常的读出DS12C887里面各个寄存器的数据 ; 晶振12MHz;
//可以正常的在LCD12864上显示年、月、日、星期、时、分、秒;且个功能均能调节;
//闹钟的时 分 秒可以调整,且到时时蜂鸣器会响,此时可以按k1~k4任意键或者按遥控器上的的任意键清除闹钟,输入选择键除外;
//完成日期:2009-01-11 20:05
//设计人:佘望胜。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#include<delay_delay.h>
#include<define_sws.h>
#include<12864.h>
#include<ds12c887.h>
#include<init_sws.h>
#include<beep_sws.h>
#include<ir_irss.h> //遥控功能处理程序
//#include<ir_remote.h> //遥控解码程序,扫描法
#include<display.h>
#include<key_swit.h> //用switch语句写的按键扫描
//==========================================================================================
void ir_jie() //核心解码程序
{
uchar q,s,count;
EX0=0; //关闭外中断0,防止干扰信号进入
//===================================开始读32个码=====================================
for(s=0;s<4;s++) //循环4次读完客户码,客户反吗;数据码,数据反码。
{
for(q=0;q<8;q++) //8位为一个字节
{
while(!remote); //等待0.56ms的高电平
delay882();
if(remote==0) //判断ir是不是为低电平
{
count=count>>1;
count=count|0x00;
}
else if(remote==1)
{
delay1000();
count=count>>1;
count=count|0x80;
}
} //1位数据接收结束
irtab[s]=count;
count=0;
} //32位二进制码接收结束
EX0=1; //开外部中断0
}
//======================================核心解码程序结束===============================================
//================================================主函数===================================================//
void main()
{
EA=1; //开总中断
EX0=1; //外部中断0允许,定义为遥控器
IT0=1; //外部中断设置为1,下降沿触发;0为低电平触发,定义为遥控器的触发方式
EX1=1; //外部中断1允许,定义为887
IT1=1; //外部中断1设置为下降沿触发,定义为887的触发方式
inital(); //初始化
while(1)
{
//ir_887();
keyscan();//调用按键扫描程序
if(flag0==1)
sound();
display_887();
}
} //=========================================================主函数结束==============================================//
void exter() interrupt 2 //外部中断1
{
uchar c;
flag0=1; //把flag0置为1
c=ds887_read_date(0x0c); //读DS12C887的C寄存器,用以清除irq管脚的电平
}
//====================================外部中断0函数,遥控器解码程序=========================================//
void extern_0() interrupt 0
{
uchar k;
if(remote==0) //判断remote是否为0,如果是就执行下面的语句
{
for(k=10;k>0;k--) //882us重复10次,测得时间 ms
{
delay882();
if(remote==1){return;} //再来判断ir是否为低电平,如果是低电平就执行下面的语句
}
while(!remote); //等待4.5ms的高电平
delay2400(); //延时2.4ms
if(remote==0){return;} //如果等于0就跳出
delay1000(); //延时1ms
delay1000(); //延时1ms
if(remote==0){return;} //再判断ir是不是等于0,是就跳出。如果不是就进入while(ir)处进行等待用户码的到了
while(remote); //等待0
ir_jie(); //调用核心解码程序
if(irtab[0] != ~irtab[1] && irtab[2] != ~irtab[3]){return;} //核对有没有读到用户误码与数据误码
if(irtab[1]==0xf7)
{
ir=irtab[2];
ir_irs();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -