在单片机系统设计中,经常会用到一键多功能技术,例如,MP3或其他电子产品中的菜单键,彩电控制系统中的声音增减和亮度、色度等都是共用两个“+”和“-”键。在实际教学过程中,学生在刚开始接触一键多功能技术时。很难理解其真正原理与内涵,甚至对一键多功能持怀疑态度。因为一个键按下去只有两种状态,不是高电平(1)就是低电平(0),怎么会有多种状态呢?这说明,学生对单片机中程序设计及系统结构的理解还不够,下面就实例来讲述下一键多功能系统及程序设计方法。
设计内容:如图I所示,开关SPI接在P3.7/RD管脚上,在AT89C52单片机的P1端口接有8个发光二极管,上电的肘候,Dl接在P1.O管脚上的发光二极管在闪烁,当每一次按下开关sPl的时候。D2接在P1.1管脚上的发光二极管在闪烁,再按下开关sPl的时候,D3接在P1.2管脚上的发光二极管在闪烁……一直到D8闪烁过后。又轮到D1在闪烁了,如此轮流。
设计思路:图1电路中共有8种不同的状态,而按键只有一个(SP1),很显然只能通过SP1来选择不同的状态。我们试着想象生活中的实例:在班级中。我们用学号来确定具体的同学(不同状态)。如01号代表张三、02号代表李四、XX号代表XX等。我们在宣布单片机考试成绩时。我们是这样子说的:01号90分。02号89分……可见。我们要选择不同的同学只要改变相应的学号就可以了。同样我们也可以给图1中的不同状态编号,用ID来选择不同状态。那如何选择这些ID号?那就靠我们的按键SP1了,假设初始化时,ID号为00,当SP1按下一次后ID加1,ID号就变为01了,这时就可以选择多种不同的状态了。
在8位的单片机中,一个ID最多有256(2的8次方)种不同的状态,两个ID共有65536(2的16次方)种状态。状态选择可以用CJNEA,#XX,JEL或JMP@A+DPTR等语句。
为了使程序结构更加明显,我把本系统的所有程序分为几大块(子程序)来编写,分别为:初始化程序,负责系统的初始化;按键程序。负责检测按键状态及按键按下后的结果处理;状态选择程序。负责根据ID的值来选择执行不同的状态;延时程序,用于延时去抖动和LED闪烁。
主程序、按键程序、状态选择程序流程图分别如图2、图3、图4所示。