基础篇第八讲彩灯基本控制一(单灯闪烁)(一)单灯闪烁控制11.编程思路利用SETBP0.0使P0.0为高电平,发光二极管不发光(灭),延时一段时间;利用CLRP0.0使P0.0为低电平,发光二极管发光(亮),再延时一段时间后,无条件跳转到开始,形成循环,使得P0.0连接的发光二极管能够忽明忽暗,闪烁。2.程序清单单灯闪烁1.ASMORG0000H;开始START:SETBP0.0;P0.0置1LCALLDELAY;调用延时CLRP0.0;P0.0清0LCALLDELAY;调用延时AJMPSTART;循环DELAY:MOVR7,#100;延时子程序DL1:MOVR6,#50DL2:MOVR5,#20DJNZR5,$DJNZR6,DL2DJNZR7,DL1RETEND基础篇3.程序分析上述程序在单片机上电复位后,开始控制P0.0口的发光二极管每隔0.2秒左右闪亮一次,亮0.2秒,灭0.2秒。(1)ORG0000H:表示程序从0000H地址开始执行,是汇编语言程序的开“头”;(2)SETBP0.0:使P0.0口置1(即高电平),不发光。(3)LCALLDELAY:调用延时子程序。(关于延时子程序的编写将在后面介绍)(4)CLRP0.0:使P0.0清0(即低电平),发光二极管发光。(5)AJMPSTART:跳转到START处,实现程序循环执行。(6)RET:子程序返回指令,有子程序的调用,就必须有RET。(7)END:END伪指令成为结束汇编伪指令,常用于汇编语言源程序末尾,用来指示源程序到此全部结束。在机器汇编时,当汇编程序检测到该语句时,它就确认汇编语言源程序已经结束,对END后面的指令不予汇编。(8)标号:标号对应指令地址,用于标记跳转、循环体等的开始位置,程序中最后生成的代码中标号都换成了相应的数值,不占据内存。START:MOVA,#00H中,符号START即为标号,其后用“:”与指令分隔开。基础篇(二)单灯闪烁控制21.编程思路利用CPLP0.0指令,每隔一定的时间产生一次电平翻转,使得P0.0连接的发光二极管能够忽明忽暗,闪烁。2.程序清单START:CPLP0.0;位取反LCALLDELAY;调用延时子程序AJMPSTART;循环3.程序分析本程序完整的形式应包括单灯闪烁控制程序1中的“头”(ORG0000H)、“尾”(END)及延时子程序(DELAY:后到RET段程序),以后例程序都需增加相应的部分。本程序的执行结果:在单片机上电复位后,开始控制P0.0口的发光二极管每隔0.2秒左右闪亮一次,亮0.2秒,灭0.2秒。CPLP0.0:将P0.0位取反,上电复位后,单片机4个I/O口(P0、P1、P2、P3)均为00H,第一次执行本条指令后,P0.0为1,发光二极管灭。第二次执行时,P0.0为0,发光二极管亮。第三次灭,第四次亮,周而复始循环闪亮。LCALLDELAY调用延时子程序,AJMPSTART无条件跳转,形成循环。基础篇第九讲彩灯基本控制一(单灯循环)(三)单灯循环控制11.编程思路把不同的立即数输出到P0口,程序顺序执行,然后在无条件跳转到初始处,进行循环,实现从P0.0口到P0.7口的发光二极管依次循环亮、灭。2.程序清单单灯循环闪烁1.ASMMAIN:MOVP0,#0FFH;全灭LCALLDELAY;调用延时子程序MOVP0,#11111110B;P0.0对应的发光二极管亮LCALLDELAYMOVP0,#11111101B;P0.1对应的发光二极管亮LCALLDELAYMOVP0,#11111011B;P0.2对应的发光二极管亮LCALLDELAYMOVP0,#11110111B;P0.3对应的发光二极管亮LCALLDELAYMOVP0,#11101111B;P0.4对应的发光二极管亮LCALLDELAYMOVP0,#11011111B;P0.5对应的发光二极管亮LCALLDELAYMOVP0,#10111111B;P0.6对应的发光二极管亮LCALLDELAYMOVP0,#01111111B;P0.7对应的发光二极管亮LCALLDELAYAJMPMAIN;无条件跳转到MAIN,使程序实现循环。基础篇3.单灯循环闪烁程序分析程序执行结果是从P0.0口到P0.7口的发光二极管依次循环亮、灭。MOVP0,#11111110B:将二进制数据11111110B送到输出寄存器P0,#号表示其后的是数据,字母B表明前面的数据为二进制。使P0.0为0,P0.0引脚的发光二极管点亮。该指令属于数据传送指令,其通用表示形式为:MOVP0,#DATA:#DATA是立即数,可以为二、十、十六进制数。表示方法为:二进制后加B,如#11110000B;十进制后加D,如#100D(D可以不用,省略);十六进制数加H,如#7EH(若十六进制数的第一个字符为字母需在其前加0,如#F7H应写为#0F7H)。故该指令亦可写成:MOVP1,#0FEH。LCALLDELAY:调用延时子程序。在WAVE集成调试环境中可以不区分LCALL和ACALL,均可写为CALL替代,即本条指令可以写成CALLDELAY的形式,调用的空间大小由环境自动编译生成相应的机器码。类似的情况还有用JMP代替AJMP、LJMP、SJMP使用,如AJMPMAIN可以写成JMPMAIN。这样对初学者来说会省去很多不必要的麻烦。若读者使用其他集成开发环境请按照具体的环境要求编写程序,本书中使用的以WAVE集成调试环境为准。基础篇(四)单灯循环闪烁控制1.编程思路利用带进位标志位的左(右)环移,把环移的结果输出到P1口。2.程序清单单灯循环闪烁2.ASMMAIN:MOVA,#0FFH;(A)=#0FFHCLRC;CY清零,CY=0LOOPL:RLCA;带进位标志左环移一位JNCLOOPR;若CY=0,转到LOOPR,否则顺序执行MOVP0,A;将移位结果输出到P0口,控制发光二极管发不发光CALLDELAY;调用延时子程序JMPLOOPL;无条件跳转LOOPL,形成左移循环LOOPR:RRCA;带进位标志右环移一位JNCLOOPL;若CY=0,转到LOOPL,否则顺序执行MOVP0,ACALLDELAYJMPLOOPR;无条件跳转LOOPL,形成右移循环基础篇3.程序分析程序执行结果是从P0.0口到P0.7口的各发光二极管依次亮、灭一次后,再从P0.7口到P0.0口的各发光二极管依次亮、灭一次,往返循环执行。程序通过JNCLOOPR和JNCLOOPL两条指令实现判断左移完成或右移操作是否完成,实现对程序执行的分支操作。该程序应用了逻辑循环指令及条件转移指令。RLCARLCA(1)RLCA:带进位循环左移指令,累加器内容连同进位标志位循环左移一位;CYA基础篇(3)JNCREL:累加位条件转移指令,根据进位标志位(CY)的状态决定程序是否转移。若为0则转移;否则顺序执行。REL可直接使用标号替代。如JNCLOOPR,若CY=0,转到LOOPR,否则顺序执行。(2)RRCA:带进位循环右移指令,累加器内容连同进位标志位循环右移一位;RRCARRCACYA基础篇第十讲彩灯基本控制(二)1.编程思路利用查表的方式实现彩灯的花样控制,实现多种花样周期性的实现闪烁。并判断查表是否结束,同时将查表取得的数据送到口线上,实现输出,使连接的发光二极管能够忽明忽暗,闪烁,形成彩灯花样。程序流程图如图3-7所示。开始初始化取表首地址查表输出到P0口查表结束了?调用延时准备下次查表NY图3-7查表控制彩灯程序流程图基础篇2.程序清单单灯闪烁1.ASMMAIN:CLRA;初始化MOVDPTR,#SHEET;取表首地址MOVR0,A;初始化LOOP:MOVA,R0;准备查表MOVCA,@A+DPTR;查表CJNEA,#01H,SHOW;判断查表结束没有?AJMPMAIN;若查表结束,重新开始SHOW:MOVP0,A;输出到P0口LCALLDELAY;调用延时子程序INCR0;准备下次查表AJMPLOOP;继续查表DELAY:MOVR7,#100;延时子程序D1:MOVR6,#50D2:MOVR5,#50DJNZR5,$DJNZR6,D2DJNZR7,D1RETSHEET:DB0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH;单灯流水两遍DB0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FHDB0FAH,0F5H,0EBH,0D7H,0AFH,5FH,0BEH,7DH;双灯流水两遍DB0FAH,0F5H,0EBH,0D7H,0AFH,5FH,0BEH,7DHDB01H;表结束标志基础篇3.程序分析上述程序在单片机上电复位后,开始控制P0口的发光二极管从D1开始D8依次连续每隔0.2秒左右闪亮一次,呈现流水状两次,然后D1和D3同时亮,D2和D4亮,依次每隔0.2秒,就有两个灯亮。(1)CLRA:将A清零,(A)=0,初始化为查表做准备;(2)MOVDPTR,#SHEET:将表SHEET的首地址送到DPTR,取表首地址;(3)MOVR0,A:数据缓存,初始化;(4)MOVA,R0:准备查表;(5)MOVCA,@A+DPTR:查表指令,将完成(A)((A)+DPTR),在ROM区的SHEET表中取数据,查表。(6)CJNEA,#01H,SHOW:判断(A)是否等于01H,若相等顺序执行,若不等转移到SHOW处,判断查表结束没有?(7)INCR0:(R0)=(R0)+1,与(4)结合既是为取表中的下一个数据准备,准备下次查表;(8)DB0FEH,0FDHDB为定义字节指令,项或项表指所定义一个字节或用逗号分开的字符串。汇编程序把DB指令中项或项表所指字符的内容(数据或ASCII码)依次存入从标号开始的存储器单元。由上述程序分析,采用查表方式建立的程序,灵活性比前面任务一的程序灵活的多,想改变花样无需再将全部程序推翻,只需将数据表中的数据进行相应的改动即可。基础篇第十一讲键控彩灯(独立键盘设计与测试)1.键控彩灯硬件电路电路原理由2-18图与图3-8共同构成,12个发光二极管中D1~D8分别由P0.0~P0.7控制,D9~D12分别由P1.0~P1.3控制。由图分析可知控制信号为低电平“0”时,相应的发光二极管发光;为高电平“1”时,相应的发光二极管熄灭。按键电路原理图见图3-9,按键分别连接在P3.2~P3.5脚,按键按下时引脚的状态为“0”,释放为“1”。D9D10D11D12R161KR171KR181KR191KVCCP10P11P12P13S7S8S9S10RP210K*4VCCP32P33P34P35图3-8P1口发光二极管电路原理图图3-9按键原理图基础篇2.按键的程序设计按照键盘与单片机的连接方式可分为独立式键盘与矩阵式键盘。独立式键盘相互独立,每个按键占用一根I/O口线,每根I/O口线上的按键工作状态不会影响其他按键的工作状态。本例采用独立式键盘,程序如下:(1)键闭合测试,检查是否有键闭合JP:MOVP3,#0FFH;P3口做输入使用的初始化MOVA,P3;读P3口状态CPLA;键按下的位为1,未按下的位为0ANLA,#3CH;屏蔽ACC.7、ACC.6、ACC.1、ACC.0RET;子程序调用返回若有键闭合,则(A≠0),若无键闭合,则(A=0)。程序分析:MOVP3,#0FFH单片机口线做输入使用时,通常先将该口线置“1”后,再对该口线状态读入,本条指令可以做输入使用的初始化。MOVA,P3读P3口状态。ANLA,#3CH是将累加器A内的数据与3CH按位相“与”结果存入A,这个操作的结果相当于将ACC.2~ACC.5各位的状态保持下来,而将其他各位置“0”了,相当于屏蔽ACC.7、ACC.6、ACC.1、ACC.0的状态。基础篇图3-10键抖动示意图(2)去抖动由于按键闭合时的机械弹性作用,按键闭合时不会马上稳定接通,按键断开时也不会马上断开,由此在按键闭合与断开的瞬间会出现电压抖动,如图3-10所示。键盘抖动的时间一般