|
(八)//以上的文字写于2005年5月,由于时间关系,一直未能将此完成,最近闲着无聊又接着写了些文字,以下写于2006年6月5日!
在这里我想对上面一点,作个简单的说明,如果你是刚学单片机,那么你写的代码是VERY GOOD的,但是如果把上面的代码应用于产品的话,那么我可以告诉你,上面所写的按键识别代码全部是垃圾代码,^_^,这下傻了吧,呵呵。为什么?我的按键不是可以正常工作吗?
请看这里:
if(P1_0 == 0)
{
Delay(10);//问题就在这里,你让CPU在这里空转?
if(P1_0 == 0)
{
//...add your code here.
}
}
进入第1个if判断语句后,就进入了Delay(10);再看Delay函数,完全让CPU执行(;空语句),所以在做大的产品或者代码时,这个是非常耗费单片机内部资源的。有什么办法吗?呵呵,那是肯定的。
解决方法大致有如下2种:
1.将延时函数放在中断中,在中断里查询延时的标志位。/*不仅仅用于键盘识别,亦可以用于其他的延时代码,见EX1*/
2.直接在中断中查询按键的标志位.//见EX2。
EX1:
unsigned char Delaytime;
void Delay(unsigned char Delaytime)//
{
while(Delaytime !=0 );//等在这里,直到Delaytime为0。
}
void Timer0_interrupt(void) interrupt 1 using 2
{
if(Delaytime != )
Delaytime--;
//...add your other code here
}
Delay函数具体延时多长时间,就要看你设定的T0定时器中断和Delaytime的乘积,比如你的定时器中断为50MS,Delaytime为20的话,那么50MS*20=1S。
EX2:
#define Press_key = P2 ^ 7;//定义按键的I/O
void P_key(void)
{
char new_value,old_value;
new_value = Press_key;
if(new_value && !old_value)//识别按键。
{
Turn_On_LEd( );
//...add your other code here.
}
old_value = new_value;
}
void Timer0_interrupt(void) interrupt 1 using 2
{
P_key();
// ...add your other code
}
当然在实际过程当中,并不是如此简单简洁的,还希望大家能够举一反三哦... ^_^。
(九)
写了这么多了,大家也看了这么多了,感觉怎么样?大家也觉得不难吧。其实51也就那么简单,真的很希望大家看完这篇文字以后,很自信的说,51单片机也已经入门。这是对我写怎么多文字最好的回答。时隔13个月之久再来继续写这些东西,没有以前的激_情和热情,所以就草草了事结尾,希望大家不要在背地里骂我哦,^_^。当然以上讲的只是最简单的一些东西,单片机的功能非常之强大,只要你能想得到,就一定可以用单片机来实现的。
当然单片机和外部其他的芯片还有很多,比如数字温度传感器DS18B20,实时时钟芯片DS1302,还有比如访问AT24CXX的EEPROM存储器等,更多的电路,还要靠大家在平时的学习过程当中,慢慢掌握。
|
|