本来按理一开始数码管应显示255,可是却显示乱码,连本不可能出现的小数点,在一些按键中也出现了
sbit RDATA=P3^3; //红外接口 与外部中断一相连
unsigned char RedKey=255; //红外摇控的键值,无键按下时为255
//红外初始化
void Red_Init(void)
{
RDATA=1; //P3^3输出高电平
EX1=1; //开启红外中断 P3^3
EA=1; //开总中断
IT1=1; //外部中断下降沿触发
}
//检测高电平脉冲宽度,逻辑0 560微秒 逻辑1 1680微秒
//高电平最长脉冲不超过5毫秒
//返回值:T 脉宽为T*20微秒
unsigned char Get_PulseWidth(void)
{
unsigned char t=0,a=0;
while(RDATA)//高电平到来,检测其脉宽
{
t++;
for(a=0;a<68;a++); // 延时20微秒
if(t==250)return t; //超时溢出
}
return t;
}
/*-------------------------协议--------------------------
开始拉低9ms,接着是一个4.5ms的高脉冲,通知器件开始传送数据了
接着是16位前导脉冲,用于识别该型号的摇控。
然后是发送8位数据的原码,接着又发送8位数据的反码.
最后是一个长脉冲,和开始位一样,拉低9ms和一个4.5ms脉冲表示结束。
每个按键不同这处只在于那8位数据的原码和反码,因些只须要识别
8位原码就可以识别按键了
---------------------------------------------------------*/
/****** 外部中断1服务程序,按键处理 ******/
void EXTI1_ISR() interrupt 2
{
unsigned char res=0,aa=0; //aa用于取位
char OK=0; //收到前导位的标志
char RODATA=0;
while(1)
{
if(RDATA)//有高脉冲出现
{
res=Get_PulseWidth();//获得此次高脉冲宽度
if(res==250)break;//非有用信号
if(res>=200&&res<250)OK=1; //获得前导位(4.5ms) 介于4毫秒与5毫秒之间
else if(res>=70&&res<100) //如果是宽脉冲,则RODATA=1
{
aa++;
RODATA=1;//1.5ms
}
else if(res>=10&&res<50) //如果是窄脉冲,则RODATA=0
{
aa++;
RODATA=0;//500us
}
//舍去16位前导脉冲,从第17位开始接着的8位是数据的正码,再后8位是反码
//获取正码
if(OK&&(aa>=17)&&(aa<25))
{
RedKey<<=1;
RedKey+=RODATA;
}
}
}
}
void main()
{
char temp=255;
P0=0x00;
Red_Init();
while(1)
{
temp=RedKey;
SMG_display(temp);//显示
}
}
下面是数码馆程序,以前一直用,现在只是把int换为char,问题应该不大,也复制过来吧
int smg[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
sbit HC595_REG=P0^6;
sbit HC595_RCK=P0^5;
sbit HC595_SCK=P0^4;
sbit HC595_SEG=P0^7;
void delay_ms(unsigned char time)
{
unsigned int t;
for(;time>0;time--)
{
t = 1500;
while(t--);
}
}
void HC595_send_byte(char byte)
{
char i,temp;
for(i=0;i<8;i++)
{
temp=byte&(1<<i);
if(temp)
{
HC595_SEG=1;
}
else
{
HC595_SEG=0;
}
HC595_SCK=1;
HC595_SCK=0;
}
HC595_RCK=0;
HC595_RCK=1;
}
void HC595_show_num(char num)
{
HC595_send_byte(smg[num]);
}
void SMG_display(char dat)
{
P0=0x01;
HC595_show_num(dat/1000);
delay_ms(2);
P0=0x02;
HC595_show_num(dat%1000/100);
delay_ms(2);
P0=0x04;
HC595_show_num(dat%100/10);
delay_ms(2);
P0=0x08;
HC595_show_num(dat%10);
delay_ms(2);
}
|