|
昨天那個(gè)問題解決了,今天又有一個(gè)一個(gè)關(guān)于遙控的問題,請問一下,我想實(shí)現(xiàn)紅外遙控控制點(diǎn)陣每按一個(gè)按鈕它就顯示一個(gè)字,但是實(shí)際上開始的時(shí)候要按很多次才能按出字來,這是怎么回事?代碼如下:
#include<reg51.h>
#include<intrins.h>
sbit SIGNAL=P3^2; //控制遙控接收數(shù)據(jù)信號
sbit SRCLK=P3^6; //74HC595模擬SRCLK管腳
sbit RCLK=P3^5; //74HC595模擬RCK管腳
sbit SER=P3^4; //74HC595模擬SER管腳
#define uchar unsigned char
#define uint unsigned int
uchar p=0; //先把p賦值為0
uchar value[6]; //用以紅外接收用戶碼數(shù)據(jù)碼數(shù)組
uchar time; //時(shí)間變量用以紅外接收
void delay10us(void) // 10us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=2;a>0;a--);
}
void delay100us(void) // 100us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=47;a>0;a--);
}
void delay7ms(void) // 7ms
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=26;b>0;b--)
for(a=133;a>0;a--);
}
void delay(uchar i)
{
while(i--);
}
uchar code tablewei[]= //16×16點(diǎn)陣位選
{
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
};
uchar code tableduan1[]={ //16×16點(diǎn)陣段選
/*-- 文字: 祝 --*/
/*-- 宋體12; 此字體下對應(yīng)的點(diǎn)陣為:寬x高=16x16 --*/
0x08,0x08,0x89,0xEE,0x98,0x00,0x7E,0x42,0xC2,0x42,0x42,0xC2,0x42,0x7E,0x00,0x00,
0x02,0x01,0x00,0xFF,0x80,0x43,0x20,0x18,0x07,0x00,0x00,0x3F,0x40,0x40,0x78,0x00,
};
uchar code tableduan2[]={
/*-- 文字: 你 --*/
/*-- 宋體12; 此字體下對應(yīng)的點(diǎn)陣為:寬x高=16x16 --*/
0x00,0x80,0x60,0xF8,0x07,0x40,0x20,0x18,0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00,
0x01,0x00,0x00,0xFF,0x00,0x10,0x0C,0x03,0x40,0x80,0x7F,0x00,0x01,0x06,0x18,0x00,
};
uchar code tableduan3[]={
/*-- 文字: 生 --*/
/*-- 宋體12; 此字體下對應(yīng)的點(diǎn)陣為:寬x高=16x16 --*/
0x80,0x40,0x30,0x1E,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,
0x40,0x40,0x42,0x42,0x42,0x42,0x42,0x7F,0x42,0x42,0x42,0x42,0x42,0x40,0x40,0x00,
};
uchar code tableduan4[]={
/*-- 文字: 日 --*/
/*-- 宋體12; 此字體下對應(yīng)的點(diǎn)陣為:寬x高=16x16 --*/
0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00,
};
uchar code tableduan5[]={
/*-- 文字: 快 --*/
/*-- 宋體12; 此字體下對應(yīng)的點(diǎn)陣為:寬x高=16x16 --*/
0x00,0xE0,0x00,0xFF,0x10,0x20,0x08,0x08,0x08,0xFF,0x08,0x08,0xF8,0x00,0x00,0x00,
0x01,0x00,0x00,0xFF,0x00,0x81,0x41,0x31,0x0D,0x03,0x0D,0x31,0x41,0x81,0x81,0x00,
};
uchar code tableduan6[]={
/*-- 文字: 樂 --*/
/*-- 宋體12; 此字體下對應(yīng)的點(diǎn)陣為:寬x高=16x16 --*/
0x00,0x00,0xE0,0x9C,0x84,0x84,0x84,0xF4,0x82,0x82,0x83,0x82,0x80,0x80,0x00,0x00,
0x00,0x20,0x10,0x08,0x06,0x40,0x80,0x7F,0x00,0x00,0x02,0x04,0x08,0x30,0x00,0x00,
};
void Hc595SendByte(uchar dat1,uchar dat2,uchar dat3,uchar dat4) //74HC595芯片擴(kuò)展顯示漢字函數(shù)
{
uchar a;
SRCLK = 1;
RCLK = 1;
for(a=0;a<8;a++) //發(fā)送8位數(shù)
{
SER = dat1 >> 7; //從最高位開始發(fā)送
dat1 <<= 1;
SRCLK = 0; //發(fā)送時(shí)序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //發(fā)送8位數(shù)
{
SER = dat2 >> 7; //從最高位開始發(fā)送
dat2 <<= 1;
SRCLK = 0; //發(fā)送時(shí)序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //發(fā)送8位數(shù)
{
SER = dat3 >> 7; //從最高位開始發(fā)送
dat3 <<= 1;
SRCLK = 0; //發(fā)送時(shí)序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //發(fā)送8位數(shù)
{
SER = dat4 >> 7; //從最高位開始發(fā)送
dat4 <<= 1;
SRCLK = 0; //發(fā)送時(shí)序
_nop_();
_nop_();
SRCLK = 1;
}
RCLK = 0;
_nop_();
_nop_();
RCLK = 1;
}
void init() //為紅外遙控初始化
{
IT0=1;
EX0=1;
EA=1;
SIGNAL=1;
}
void main()
{
uchar i; //動態(tài)顯示16×16點(diǎn)陣顯示漢字
init();
while(p==5) //按下遙控按鈕觸發(fā)p+=5
{
for(i=0;i<16;i++)
{
Hc595SendByte(~tablewei[i+16],~tablewei,tableduan1[16+i],tableduan1); //顯示'祝'
delay(10);
}
}
while(p==10)
{
for(i=0;i<16;i++)
{
Hc595SendByte(~tablewei[i+16],~tablewei,tableduan2[16+i],tableduan2);
delay(10);
}
}
while(p==15)
{
for(i=0;i<16;i++)
{
Hc595SendByte(~tablewei[i+16],~tablewei,tableduan3[16+i],tableduan3);
delay(10);
}
}
while(p==20)
{
for(i=0;i<16;i++)
{
Hc595SendByte(~tablewei[i+16],~tablewei,tableduan4[16+i],tableduan4);
delay(10);
}
}
while(p==25)
{
for(i=0;i<16;i++)
{
Hc595SendByte(~tablewei[i+16],~tablewei,tableduan5[16+i],tableduan5);
delay(10);
}
}
while(p==30)
{
for(i=0;i<16;i++)
{
Hc595SendByte(~tablewei[i+16],~tablewei,tableduan6[16+i],tableduan6);
delay(10);
}
}
}
void Read_Signal() interrupt 0 //外部中斷函數(shù)用以接收遙控?cái)?shù)據(jù)
{
uchar i,j;
uint count;
time=0;
delay7ms();
if(SIGNAL==0)
{
count =1000;
while((SIGNAL==0)&&(count>0)) //>9ms
{
delay10us();
count--;
}
if(SIGNAL==1)
{
count=500;
while((SIGNAL==1)&&(count>0)) //>4.5ms
{
delay10us();
count--;
}
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
count=60;
while((SIGNAL==0)&&(count>0))
{
delay10us();
count--;
}
count=500;
while((SIGNAL==1)&&(count>0))
{
delay100us();
time++;
count--;
if(time>30)
{
return;
}
}
value[j]>>=1;
if(time>=8)
{
value[j]|=0x80;
}
time=0;
}
}
}
if(value[2]!=~value[3])
{
return;
}
p=p+5; /*按一下遙控觸發(fā)p+5*/
}
}
|
|