本人是单片机新手,最近做一个红外光通信的小项目,在网上查阅了相关资料,但其中有几段看不太懂,向各位大牛们求教。
程序中的注释不是我加到,是资料中已经加号的
程序片段一
void khz(uchar aa) //是发射38KHZ的程序
{
for(a=aa;a>0;a--) //这个for语句可以得到准确的26.3波特率
{
out=1;
i=7; //低了17us
while(i>0)i--; // 38kHZ
out=0;
//高了9us 17+9=26us 比26.3快一点点
}
}
这个程序完全看不懂啊,怎么就能产生38Khz的信号呢?
程序片段二
unsigned char KeyScan(void) //键盘扫描函数,使用行列逐级扫描法
{
unsigned char Val;
KeyPort=0xf0; //P1口高四位置高,低四位置低
if(KeyPort!=0xf0) //表示有按键按下
{
DelayMs(10); //延时去抖
if(KeyPort!=0xf0) //表示真的有按键按下
{
KeyPort=0xfe; //检测第一行
if(KeyPort!=0xfe)
{
Val=KeyPort&0xf0;
Val+=0x0e;
while(KeyPort!=0xfe);
DelayMs(10); //去抖
while(KeyPort!=0xfe);
return Val;
}
KeyPort=0xfd; //检测第二行
if(KeyPort!=0xfd)
{
Val=KeyPort&0xf0;
Val+=0x0d;
while(KeyPort!=0xfd);
DelayMs(10); //去抖
while(KeyPort!=0xfd);
return Val;
}
KeyPort=0xfb; //检测第三行
if(KeyPort!=0xfb)
{
Val=KeyPort&0xf0;
Val+=0x0b;
while(KeyPort!=0xfb);
DelayMs(10); //去抖
while(KeyPort!=0xfb);
return Val;
}
KeyPort=0xf7; //检测第四行
if(KeyPort!=0xf7)
{
Val=KeyPort&0xf0;
Val+=0x07;
while(KeyPort!=0xf7);
DelayMs(10); //去抖
while(KeyPort!=0xf7);
return Val;
}
}
}
return 0xff;
}
我知道这是一个键盘扫描函数,但我自学时看的是郭天祥书上的矩阵按键扫描实例程序,按照郭书上的思路来看,这段键盘扫描函数逻辑好混乱啊,看不懂干啥,请大牛们详细说明其工作逻辑流程吧
程序片段三
void delayms1(uchar aa)//延时程序 { for(a=aa;a>0;a--) { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } } 我知道这是一个延时程序,_nop_()表示延时一个机器周期,这儿有八个_nop_();那就是延时了吧个机器周期,假如晶振用的12M的,这个函数就延时了12*8=96微秒但程序中却给出了如下参考时间,与我设想的不同,那请问这么一个函数真实情况下延时是多少呢? //delayms(45);//0.642ms //delayms(35);//0.502ms //delayms(115);//1.623ms //delayms(72);//1.02ms //delayms(84);//1.188ms
//delayms(31);//0.446ms 程序片段四 void sieasdf() interrupt 0 { EX0=0; for(a=5;a>0;a--) { delayms(35);//延时0.5ms 判断5次 5*0.5=2.5ms if(in) fleg=0; } if(fleg) { delayms(72);//延时1ms 判断是不是高电平了 if(in) { delayms(115);//延时让它超过2ms; 2.5+1+1.623=5.123ms 开始读数据 for(a=8;a>0;a--) { while(!in); delayms(86);//延时1.188ms 判断IO高低,从而得0或1 num=num>>1; if(in) { num=num|0x80; delayms(31);//延时0.6ms 因为上面延时1.2ms+0.6 刚好跳过1.5ms } } } } fleg=1; EX0=1; } 这段应该是通过外部中断,来进行相关解码的功能吧,但为什么连外部中断0的标志位IE0都没有看见,而且这儿函数整体的一个逻辑流程不理解(因为大部分语句单独拎出来看的懂,但组合在一起不知道在干啥)
|