📄 yjred.c
字号:
#include <reg51.h>
#include <intrins.h>
//引脚定义
sbit CS = P0^2;//片选
sbit SID = P0^1; //数据
sbit SCLK = P0^0; //时钟
sbit BACKLIGHT = P1^0; //背光
sbit POWER = P1^1; //电源开关控制口
volatile unsigned long IRcode=0x00000000; //32位的键代码
volatile unsigned int customcode=0x0000; //16位用户码
volatile unsigned int time_us=0x0000; //两个下降沿之间的时间
volatile unsigned char timeH,timeL; //保存TH1 TL的值
unsigned char Lcustomcode=0x00; //低8用户码
unsigned char Hcustomcode=0x00; //高8
unsigned char datacode=0x00; //8位键数据码
unsigned char Rdatacode=0x00; //8位键数据反码
bit NewIRcode=0; //指示当处理完了32位码后,就有了新的遥控码
bit DataRight=0; //为1时读取数据正确
void init(void);
void lcdinit(void);
void SendCMD(unsigned char dat);
void SendDat(unsigned char dat);
void SendByte(unsigned char dat);
void sendbyte(unsigned char bbyte);
void delay(unsigned int n) ;
void display(unsigned char x_add,unsigned char dat1,unsigned char dat2);
void lcdinit(void) //初始化LCD
{ CS=0;
delay(100); //启动等待,等LCM讲入工作状态
CS=1;
BACKLIGHT=0;
SendCMD(0x30);//功能设置,一次送8位数据,基本指令集
SendCMD(0x0C);//0000,1100 整体显示,游标off,游标位置off
SendCMD(0x01);//0000,0001 清DDRAM
SendCMD(0x02);//0000,0010 DDRAM地址归位
SendCMD(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC
}
void SendCMD(unsigned char dat) //发送指令
{
CS=1;
SendByte(0xF8);//11111,00,0 RW=0,RS=0 同步标志
SendByte(dat&0xF0);//高四位
SendByte((dat&0x0F)<<4);//低四位
CS=0;
}
void SendDat(unsigned char dat) //发送数据
{
CS=1;
SendByte(0xFA);//11111,01,0 RW=0,RS=1
SendByte(dat&0xF0);//高四位
SendByte((dat&0x0F)<<4);//低四位
CS=0;
}
void SendByte(unsigned char dat) //发送字节
{
unsigned char i;
for(i=0;i<8;i++)
{
SCLK=1;
if(dat&0x80) SID=1;else SID=0;
SCLK=0;
dat=dat<<1;
}
}
void delay(unsigned int n)
{
unsigned int i;
for(i=0; i<n; i++) {;}
}
void display(unsigned char x_add,unsigned char dat1,unsigned char dat2){
SendCMD(x_add);
SendDat(dat1);
SendDat(dat2);
}
void main(void)
{
unsigned char i;
ONOFF=1;
lcdinit();
init(); //定时器,中断初始化
for(i=0;i<10;i++)
{
delay(100);
display(0x82,0xbd,0xf5);//锦
display(0x83,0xcd,0xbc);//图
display(0x84,0xca,0xfd);//数
display(0x85,0xc2,0xeb);//码
SendCMD(0x00);
}
while(1)
{
if(NewIRcode==1) //如果有新的遥控码就读
{
customcode=IRcode; //取红外码中的用户码
Lcustomcode=IRcode; //取低8位用户码
IRcode=IRcode>>8;
Hcustomcode=IRcode; //取高8位用户码
IRcode=IRcode>>8;
datacode=IRcode; //取数据码
IRcode=IRcode>>8;
Rdatacode=IRcode; //取数据码的反码
if((customcode!=0xFF80)||(~Rdatacode!=datacode)) {DataRight=0;IRcode=0;} //校验用户码,反码
else DataRight=1;
NewIRcode=0; //读完之后清零,表示新码已读
}
if(datacode==0x58)// 播放/暂停/确定
{
display(0x92,0xbd,0xf5);//锦
display(0x93,0xcd,0xbc);//图
}
if(datacode==0x1e) //开机/关机
{
if(POWER==0)
POWER=1;
else POWER=0;
}
if(datacode==0x12) //返回
{
}
if(datacode==0x40) //上一曲/上
{
}
if(datacode==0x0c) // 根据客户定义该键功能
{
}
if(datacode==0x42) // 左/快退
{
}
if(datacode==0x43) // 右/快进
{
}
if(datacode==0x19) // 点播
{
}
if(datacode==0x41)// 下一曲/下
{
}
if(datacode==0x0d)//停止
{
}
if(datacode==0x1c)//选台
{
}
if(datacode==0x0b)//音量减
{
}
if(datacode==0x0a)//音量加
{
}
}
}
void init(void)
{
TMOD=0x11; //定时器0,工作方式1 ; 定时器1,工作方式1
TCON=0x01; //外中断0下降沿触发,(包括TR1=0,TR0=0)
TH1=0x00; //初始化定时器1
TL1=0x00;
EA=1; //开全中断
ET0=1; //开放T0中断
ET1=1; //开放T1中断
EX0=1; //开放INT0
}
//-------------------------------------interrupt0-------------------------------------
void IR_ISR() interrupt 0 using 1 //遥控器中断处理函数
{
static unsigned char cn=0;
TR1=0;
timeH=TH1;
timeL=TL1;
TH1=0;
TL1=0;
TR1=1;
time_us=(unsigned int)timeH;
time_us=time_us<<8;
time_us=time_us|timeL;
if(time_us>24600&&time_us<25370) {cn=1;IRcode=0;} //遇到引导码,就把cn清0,IRcode清0 13300 13700 12m
if(cn<34)
{
if(time_us>1851&&time_us<2407) //0 12m:1000 1300
{IRcode=IRcode|0x00000000; if(cn<33) IRcode=IRcode>>1;}
else if(time_us>3703&&time_us<4537) //1 12:2000 2450
{IRcode=IRcode|0x80000000;if(cn<33) IRcode=IRcode>>1;}
}
else if(time_us>20370&&time_us<21296) {IRcode=IRcode;}; //遇到重复码 12m: 11000 11500
cn++;
if(cn==34) {NewIRcode=1;TR1=0;} //读完32位码,则有新码产生
}
//--------------------------------------timer_ISR------------------------------
void Timer0_ISR() interrupt 1 using 2 //定时器0中断函数
{
//TR1=0;
//TR1=1;
}
void Timer1_ISR() interrupt 3 using 3 //定时器1中断函数
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -