📄 main.c
字号:
#include"main.h"
#include"display.h"
uchar code Dis_Data[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xff}; //数码管数字字库
//0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,全灭
//*************函数声明*********************
void init_device(void); //初始化单片机
void init_port(void);
void init_data(void);
void init_timer(void);
void deal_data(void);
void init_extint(void);
//*************全局变量定义*****************
bit flag_5ms;
uchar dis_c; //com
uchar dis_s; //seg
uchar dis_d[2]={0x12,0x34};
uchar data10,data20,data30,data40,count=0;//存红外解码后四个字节数据
bit flag1=0; //0时亮,1时暗
uchar count10=0,count20=0,data00=0;
//************** ********************
void main(void)
{
init_device();
while(1)
{
if(flag_5ms) //5ms轮显
{
flag_5ms = 0;
display(~dis_c,dis_s); //送显示数据
deal_data(); //处理显示数据
}
}
}
//***************处理数据*******************
void deal_data(void)
{
dis_c <<= 1;
if((dis_c&0xf)==0)
dis_c = 0x01;
switch(dis_c)
{
case 1:dis_s = dis_d[0]/16;break;
case 2:dis_s = dis_d[0]%16;break;
case 4:dis_s = dis_d[1]/16;break;
default:dis_s = dis_d[1]%16;break;
}
dis_s = Dis_Data[dis_s];
}
//****************程序初始化****************
void init_device(void)
{
init_port();
init_data();
init_timer();
init_extint();
}
void init_port(void)
{
sclk = 0;
rck = 0;
}
void init_data(void)
{
dis_c = 0x01; //从最左数码管开始显示
}
void init_timer(void)
{
TH0 = TH0_D;
TL0 = TL0_D;
TMOD = 0x91;
ET0 = 1;
TR0 = 1;
TH1 = 0;
TL1 = 0;
EA = 1;
}
void init_extint(void)
{
IT1=1; //下降沿中断
IE1=0; //标志位清1
EX1=1; //允许外部中断1
}
void ext1_interrupt(void)interrupt 2 using 2 //外部中断红外接收程序
{
uchar a;
TR1=0;
a=TH1;
TH1=0;
TL1=0;
TR1=1;
if(a<0x12) //是否小于5ms
{
if(a>0x0d) //是否大于4ms
{
if(flag1==0) //接收到4.5ms的起始码
flag1=1;
else // 在一次未解码完再次接收到起始码或连续接收到起始码,错误,重新初始化
{
flag1=0;
count10=0x00;
count20=0x00;
TR1=0;
TH1=0;
TL1=0;
}
}
else
{
if(flag1==1) //是否接收到起始码
{
data00>>=1; //data0为存着正在接收的解码数据
if(a>0x02)
{
data00|=0x80; //大于0.6ms为1
}
else
{
data00&=0x7f; //小于0.6MS为0
}
count10++; //接收到1位加1
if(count10==8) //是否接收到8位
{
count10=0;
count20++; //接收到一个字节加1
switch(count20)
{
case 1:data10=data00;break; //接收到第一个字节
case 2:data20=data00;break; //接收到第二个字节
case 3:data30=data00;break; //接收到第三个字节
default:data40=data00; //接收完共四个字节
if(data10==~data20 && data30==~data40)
{
dis_d[0] = data10;
dis_d[1] = data30;
}
TR1=0; //重新初始化
TH1=0;
TL1=0;
count20=0;
flag1=0;
}
}
}
}
}
}
void timer1_int(void)interrupt 1 using 1
{
TH0 = TH0_D;
TL0 = TL0_D;
flag_5ms = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -