打印
[51单片机]

简单的程序基于51汇编按键程序

[复制链接]
2289|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
                ORG 0000H
MAIN:        MOV P1,#00000000B
        MOV A,#00000001B           //传一个数给A,用于循环移位
                KEYBOARD EQU P0                   //KEYBOARD相当于P0
                MOV KEYBOARD,#0FFH           //把数据送P0也就是KEYBOARD(按键)

LOP:        ACALL Delay                           //延时一会儿
                MOV R1,KEYBOARD                   //因为比较不等转移指令只能用一些规定语句,所以把这个操作数送R1               
                CJNE R1,#0FFH,LOP1           //比较R1中的数字是不是等于FFH,不等就转移,证明有键按下,相等就顺序执行
                SJMP LOP                           //顺序执行到这里在返回去执行上一句继续判断,直到不相等转移才能退出这个循环
               
LOP1:   ACALL Delay                           //延时一会儿
            MOV KEYBOARD,#0FFH           //把数据再次送到按键检查端口
                MOV R1,KEYBOARD                   //送到A以便判断

                CJNE R1,#0FFH,LOP2           //再次检查按键是不是被按下,原理同上
                SJMP LOP

LOP2:        ACALL Delay                           //延时一会儿
            MOV KEYBOARD,#0FFH           //把数据再次送到按键检查端口
                MOV R1,KEYBOARD                   //送到A以便判断

                CJNE R1,#0FFH,AOP1           //再次检查按键是不是被按下,原理同上
                SJMP LOP


AOP1:        CJNE R1,#0FEH,AOP2           //不等则判断下一个按键
                ACALL Delay                           //延时一会儿
D0OP1:        CJNE R1,#0FFH,DOP1
                SJMP D0OP1
DOP1:        ACALL key1

AOP2:        CJNE R1,#0FDH,AOP3           //不等则判断下一个按键
D0OP2:        CJNE R1,#0FFH,DOP2
                SJMP D0OP2
DOP2:        ACALL key2


AOP3:        CJNE R1,#0FBH,AOP4           //不等则判断下一个按键
D0OP3:        CJNE R1,#0FFH,DOP3
                SJMP D0OP3
DOP3:        ACALL key3

               
AOP4:        CJNE R1,#0F7H,AOP5           //不等则判断下一个按键
D0OP4:        CJNE R1,#0FFH,DOP4
                SJMP D0OP4
DOP4:        ACALL key4
               

AOP5:        CJNE R1,#0EFH,AOP6           //不等则判断下一个按键
D0OP5:        CJNE R1,#0FFH,DOP5
                SJMP D0OP5
DOP5:        ACALL key5


AOP6:        CJNE R1,#0DFH,AOP7           //不等则判断下一个按键
D0OP6:        CJNE R1,#0FFH,DOP6
                SJMP D0OP6
DOP6:        ACALL key6


AOP7:        CJNE R1,#0BFH,AOP8           //不等则判断下一个按键
D0OP7:        CJNE R1,#0FFH,DOP7
                SJMP D0OP7
DOP7:        ACALL key7


AOP8:        CJNE R1,#07FH,LOP                   //不等再次扫描
D0OP8:        CJNE R1,#0FFH,DOP8
                SJMP D0OP8
DOP8:        ACALL key8

                AJMP LOP                           //如果相等,证明没有松手,重新扫描

/******************************按键子程序*******************************/

key1:       
        RR A
                MOV P1,A
                RET

key2:        RR A
                MOV P1,A
                RET


key3:        RR A
                MOV P1,A
                RET

key4:        RR A
                MOV P1,A
                RET

key5:        RR A
                MOV P1,A
                RET

key6:        RR A
                MOV P1,A
                RET

key7:        RR A
                MOV P1,A
                RET

key8:        RR A
                MOV P1,A
                RET

/******************************延时子程序*******************************/
Delay:         MOV R6,#0D7H
DL0:
            MOV R5,#2DH
            DJNZ R5,$
            DJNZ R6,DL0
            NOP
            NOP
            RET
                END



这是一个8位独立按键程序,每按一次可以实现LED循环移位,P1是LED端口,高电平有效,P0是按键,按键直接接P0口然后接地。我想实现松手检测,我搜索了大量资料,关于汇编的寥寥无几,这里有人帮我理理思路,我好尽快写出汇编的松手检测程序

相关帖子

沙发
dirtwillfly| | 2017-8-3 21:13 | 只看该作者
帮顶,现在用汇编的很少了

使用特权

评论回复
板凳
yirongfu| | 2017-8-4 00:45 | 只看该作者
从0000H开始放程序啊,要是要用中断咋办?

使用特权

评论回复
地板
聪明的诸葛亮|  楼主 | 2017-8-4 09:32 | 只看该作者
yirongfu 发表于 2017-8-4 00:45
从0000H开始放程序啊,要是要用中断咋办?

这个程序不用中断,用的时候自有计较。c还写的出来,这汇编松手监测不好搞了。

使用特权

评论回复
5
聪明的诸葛亮|  楼主 | 2017-8-4 09:33 | 只看该作者
dirtwillfly 发表于 2017-8-3 21:13
帮顶,现在用汇编的很少了

嗯嗯,只是看一下,学一下而已。

使用特权

评论回复
6
mcu5i51| | 2017-8-4 09:45 | 只看该作者
你的程序好多呀,一个读键没有这么啰嗦吧!
读键流程:
读P0(设)数据到R0(设),如果是0电平有效就取反,使按下的键为1;
R0 和 R1 异或计算,结果保存在R2和R3中,也可以只用一个;
R0 到 R1 保存
R0 和 R2 位与计算,结果到R2;
R0 取反后和R3 与操作,存R3;
好了按键读取完成,R2中为放开的按键,R3中为按下的按键,有效为1;
程序中没有保存状态,下面要即时处理,下次就没有键值了;
处理按键对应的 LED;
延时一个读键周期,循环

使用特权

评论回复
7
懒人| | 2017-8-4 10:31 | 只看该作者
什么年代了,还想汇编?

使用特权

评论回复
8
yirongfu| | 2017-8-5 00:11 | 只看该作者
聪明的诸葛亮 发表于 2017-8-4 09:32
这个程序不用中断,用的时候自有计较。c还写的出来,这汇编松手监测不好搞了。 ...

我以前的方法是不松手程序不往下走,死等,好像从以前教科书得到的思路。缺点是这期间处理其它事件就得使用中断,对于汇编来说,当中断事件多的时候,就复杂而且容易出错了。

使用特权

评论回复
9
DQP05| | 2017-8-11 15:41 | 只看该作者
懒人 发表于 2017-8-4 10:31
什么年代了,还想汇编?

只要8位机存在,就有人用汇编。
对于实时性要求高的,用汇编更好控制。
我就喜欢用汇编,一切都在掌握中。

使用特权

评论回复
10
datouyuan| | 2017-8-11 16:08 | 只看该作者
DQP05 发表于 2017-8-11 15:41
只要8位机存在,就有人用汇编。
对于实时性要求高的,用汇编更好控制。
我就喜欢用汇编,一切都在掌握中 ...

你这想法是错误的。

汇编知道一点就够了,不能完全用汇编。
要想更好的掌控代码,更应该使用高级语言。

使用特权

评论回复
11
ningling_21| | 2017-8-11 16:16 | 只看该作者
使用汇编要求更高

使用特权

评论回复
12
datouyuan| | 2017-8-11 16:44 | 只看该作者
楼主为什么要用汇编?我是很难理解这种行为的。

看楼主的汇编代码,写得很差。楼主想学习汇编的话,keil可以直接把C文件转化为汇编文件。

我学mcu最早也是从汇编开始的。我现在写C51的代码时,也常常会嵌入少量汇编代码。

使用特权

评论回复
13
野百合的春天| | 2017-8-11 16:57 | 只看该作者
汇编代码,牛B,感觉应用还是学习C比较好

使用特权

评论回复
14
DQP05| | 2017-8-11 18:39 | 只看该作者
datouyuan 发表于 2017-8-11 16:08
你这想法是错误的。

汇编知道一点就够了,不能完全用汇编。

请看清楚我的前提:
1、强调8位机,意思是程序不大,用汇编也不麻烦;
2、强调实时性,特别是用低性能的单片机,用汇编才能很好执行。

每种语言各有利弊,就像很多年前就有说32位机取代8位机,但现在8位机还是大量使用,即使价格一样,8位机能完成的事情,我还是优先用8位机,因为系统简单。

使用特权

评论回复
15
linqing171| | 2017-8-11 20:29 | 只看该作者
你这个程序用c写,执行速度会变慢,使用的flash会变小。
我感觉汇编8k以上就比较难把控了。以前的几个汇编项目基本都在8k以内,毕业设计除外。

使用特权

评论回复
16
datouyuan| | 2017-8-14 09:50 | 只看该作者
linqing171 发表于 2017-8-11 20:29
你这个程序用c写,执行速度会变慢,使用的flash会变小。
我感觉汇编8k以上就比较难把控了。以前的几个汇编 ...

不一定。100个字节内的代码可能会如你所说。
C编译器产生的汇编码效率是很高的,有兴趣的可以去看看,能学习到不少汇编技巧。
汇编代码和编程者的能力息息相关,大部分人写出的汇编代码都不如C编译器产生的汇编代码。

大部分人汇编超过500字节就很难把控了,还8K。

我还是强调一下,汇编只在极小代码量的情况下才有可能比高级语言有优势。希望大家知道这点。

使用特权

评论回复
17
datouyuan| | 2017-8-14 10:00 | 只看该作者
本帖最后由 datouyuan 于 2017-8-14 10:03 编辑
DQP05 发表于 2017-8-11 18:39
请看清楚我的前提:
1、强调8位机,意思是程序不大,用汇编也不麻烦;
2、强调实时性,特别是用低性能的 ...

1、绝大部分8位机的程序不小。可能只有很早的PIC12F508类似的8位机才是你讲的8位级。
2、你说的实时性,我可以理解为是功能极其简单吗?在极小代码量、功能极其简单的情况下用汇编不错。


我还是强调一下,汇编只在极小代码量的情况下才有可能比高级语言有优势。希望大家知道这点。

使用特权

评论回复
18
DQP05| | 2017-8-16 16:47 | 只看该作者
datouyuan 发表于 2017-8-14 10:00
1、绝大部分8位机的程序不小。可能只有很早的PIC12F508类似的8位机才是你讲的8位级。
2、你说的实时性,我 ...

小家电用的比较多的是几毛钱的8位单片机,OTP ROM常用1K-2K,PIC那么贵,用量大的低端市场,很多年前都不用PIC,以前台系用的多,现在也开始被国产代替了。
在低端市场,为了降低成本,大部分都是用汇编,有些单片机甚至只有0.5K OTP ROM

使用特权

评论回复
19
datouyuan| | 2017-8-17 10:02 | 只看该作者
DQP05 发表于 2017-8-16 16:47
小家电用的比较多的是几毛钱的8位单片机,OTP ROM常用1K-2K,PIC那么贵,用量大的低端市场,很多年前都不 ...

我说的是PIC12F508类似的8位机。
你说的那些MCU都是仿PIC12F508的。结构、汇编指令都一样。
为什么用纯汇编,是因为这类mcu的供应商大都没有提供C编译器。
假如有C编译器,我相信大家都不会使用纯汇编,仅仅在少量地方嵌入一点汇编。

使用特权

评论回复
20
datouyuan| | 2017-8-17 10:15 | 只看该作者
本帖最后由 datouyuan 于 2017-8-17 10:26 编辑
DQP05 发表于 2017-8-16 16:47
小家电用的比较多的是几毛钱的8位单片机,OTP ROM常用1K-2K,PIC那么贵,用量大的低端市场,很多年前都不 ...

我经常使用的一款MCU(十速的TM57FA40),就是你说的这类MCU。
以前十速公司没提供C编译器的时候,没办法,只能用汇编。
现在改用C编译器后,不管是代码质量,程序维护,比以前纯用汇编,强了不是一点点。

刚开始使用这个C编译器时,我还不放心,经常查看它生成的汇编码,对比我自己写的,感觉大部分地方比我写的强多了,而且轻松,快捷。
在有C编译器的情况下,用汇编不是降低成本,而是增加成本。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

23

帖子

0

粉丝