Blog's Home

越努力,越幸运!

论理论与实践何者为第一性

 

今天在上课的时候,受老师启发,觉得理论与实践其实都是很重要的。于是便打算写一篇文章,结合自身的实际,来阐述自己的观点。

汇编语言学习(五)

想要一条条仔细分析下,但好像也没什么可说的了,基本上每一条代码都有注释了,还是看程序吧!还有,书上其实错误很多,不能尽信书。


**************************************************************************/
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中嵌入汇编代码:   

«234567891011»
欢迎来到黄建雄的博客,本站点不定期进行博文更新,敬请期待!
  [查看权限]

站内搜索
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合

Powered By Z-Blog 2.2 Prism Build 140101

Copyright © 2015 by 黄建雄. 本站文章除特别声明系转载外,均保留所有权利.
知识共享许可协议本作品采用知识共享署名 2.5 中国大陆许可协议进行许可,欢迎转载,但请注明来自Blog's home,并保持转载后文章内容的完整。        
湘ICP备15003615号 工业和信息化部

  • 您的鼓励是对我最大的认可