我们先来看一小段代码,
今天在上课的时候,受老师启发,觉得理论与实践其实都是很重要的。于是便打算写一篇文章,结合自身的实际,来阐述自己的观点。
想要一条条仔细分析下,但好像也没什么可说的了,基本上每一条代码都有注释了,还是看程序吧!还有,书上其实错误很多,不能尽信书。
**************************************************************************/ ORG0000H AJMPKEY2 ORG0100H KEY2:LCALLKS ;键盘检测 JNZK1 ;累加器不为0表可能有键按下,跳至K1再次检测 LCALLD10MS ;书上写了要去陡,但好像这里去不去陡没太大关系,不去也能行 AJMPKEY2 ;无键按下返回重新检测 K1:LCALLD10MS ;去陡,再次检测 LCALLKS JNZK2 AJMPKEY2 ;无键按下返回重新检测 K2:MOVR2, #0EFH ;每次只有一列电平置低,即每次只扫描一列 MOVR4, #00H ;列号,下同 K3:MOVP2, R2 ;开始扫描 L0:JBP2.0, L1 ;端口值为高则说明此列无键按下,跳到下一端口检测程序 MOVA, #00H ;行首键号送累加器 AJMPLK L1:JBP2.1, L2 MOVA, #04H AJMPLK L2:JBP2.2, L3 MOVA, #08H AJMPLK L3:JBP2.3, NEXT ;端口值为高则说明此列无键按下,准备扫描下一列 MOVA, #0CH LK:ADDA, R4 ;行的首键号+列号算出键值 PUSHACC ;因后面还要用到ACC,所以读出键值后需要把ACC入栈保存 NEXT:INCR4 MOVA, R2 JNBACC.7, K4 ;判是否扫描完,完则跳转到枪手检测 RLA ;左环移,扫描下一列应送的值 MOVR2, A AJMPK3 ;未扫描完跳至K3再次扫描 K4:LCALLKS ;键盘检测,判松手 JNZK4 ;未松开则原地等待 POPACC ;累加器出栈 ;RET LJMPSTART ;出栈后跳至显示程序 KS:MOVP2, #0FH ;键盘检测,有键按下非0 MOVA, P2 XRLA, #0FH ;异或指令,判有无键按下,聪明呀! RET START:MOVDPTR, #TABLE ;把管码表首地址给数据指针 CLRP1.3 ;数码管段位选初始化 CLRP1.4 CLRP1.5 DISPLAY:;LCALLKEY2 MOVCA, @A+DPTR SETBP1.5 ;开位选 MOVP0, #00H CLRP1.5 MOVP0, #00H ;消影 SETBP1.4 ;开段选 MOVP0, A CLRP1.4 ;锁存 LCALLD10MS LJMPKEY2 ;显示完后跳至检测程序继续检测 TABLE:DB3FH, 06H, 5BH, 4FH, 66H ;共阴数码管码表 DB6DH, 7DH, 07H, 7FH, 6FH DB77H, 7CH, 39H, 5EH, 79H DB71H D10MS:MOVR7, #25 ;延时10MS D1:MOVR6, #200 DJNZR6, $ ;美元符号表示原地跳转 DJNZR7, D1 RET END
调了两个多小时的程序,终于可以成功运行了,非常开心,很有成就感,深有体会的是,调程序绝对绝对绝对不能急躁,这里用了三个绝对,就意味着这一点有多重要了。第一,一定要会使用Debug功能,即使只是看看简单的寄存器的值,有时也能让你省很多功夫,能很快发现问题出在哪里,这一点很重要。第二,一定要冷静,要有条理性,从上到下,一条条代码的来分析,看是哪里出了问题,看是哪里的逻辑出现了混乱,就这样,只要静下心,不急躁,把程序从头到尾的分析一遍,就一定能够找出问题的所在,这是必须的。
貌似有几天没写了,最近忙呀,没有写的都不打算写了,谁叫自己当天没写,今天学的独立键盘,不打算过多的阐述,具体的代码解释可参见程序中的注释,其实注释不就是我的思维的体现了嘛。只说一点,就是汇编的按键检测,用的是对累加器A赋端口值,然后对累加器取反,哪个位为1即哪个键按下,全部为0即无键按下,重新返回程序进行按键检测(按键按下即端口为电平为0,取反即为1),这一点很有味道,是我之前没见过的。
汇编相对于C来说,的确是很麻烦,需要不停的查表,尤其是对初学者来说,不过,也还是蛮有味道的。
主要说明一点,那就是汇编的延时,我以自己的汇编延时子程序为例:
众所周知,C语言虽然是高级语言,但现在大部分的与硬件有关的开发中C语言都是不二之选,它的代码可读性好、能够模块化开发与资源共享、可移植性好、生成的代码效率高等,广泛应用于单片机、嵌入式、工业控制等方面,尽管如此,我们还是不能忘记汇编,汇编是一种直接控制底层硬件的语言,
在某些对功耗与空间有较高要求的场合,我们就必须使用汇编语言,而且它还有一些C很难做到的方面,比如说精确延时。下面我们就来谈下汇编。
首先来谈一下如何在KEIL中嵌入汇编代码: