又一个暑假 发表于 2014-8-19 21:44:18

51单片机汇编

看到网上很多原创帖我很羡慕,嫉妒是不会,恨更不可能啦。只是很渴望有一天我也能在论坛发帖子来帮助别人。虽然没有没有鸿哥、朱老师等等的水平那么高,也没有文采,但是我还是把自己写的程序贴出来让高手们指教指教,欢迎拍砖,新手可以一起学习一起探讨。

又一个暑假 发表于 2014-8-19 21:48:23

本帖最后由 又一个暑假 于 2014-8-19 21:59 编辑

;/////////////////////////////////////////////////////////////////////////////////////////
;//矩阵键盘0—15按下按键显示对应的数值 ,没按之前显示"_"
;//
;////////////////////////////////////////////////////////////////////////////////////////
Key                            EQU   P3                ;矩阵键盘接的I/O口
key_state                   EQU                20H                ;用来标记消抖和防止多次触发
key_step_buffer         EQU                30H                ;消抖时键值的保存
key_step                  EQU                35H                ;存储键值
key_count                  EQU   36H                ;查表计数
      
      ORG         0000H
      SJMP      STAR
      ORG            1BH
      LJMP      Timer0_intrrupt;装T1中断服务程序
;/////////////////////////////////////////////////////////////////////////////////////////
;//初始化
;//
;////////////////////////////////////////////////////////////////////////////////////////
star:      
    movkey_state,#00H
      movkey_step,#00H
      movkey_step_buffer,#00H
      movP0,#0ffH
      movP1,#0ffH
      movP2,#0aaH
      movIE,#088H;
      mov         TMOD,#010H
      mov         TH1, #0D8H
      mov         TL1, #0EFH
      setb TR1;启动T1
      setb EA
;/////////////////////////////////////////////////////////////////////////////////////////
;//主程序一直循环显示
;//
;////////////////////////////////////////////////////////////////////////////////////////      
loop:
          lcall keystep_disp            
          ljmploop
;/////////////////////////////////////////////////////////////////////////////////////////
;//键值显示程序
;//
;////////////////////////////////////////////////////////////////////////////////////////
keystep_disp:
                mova,key_step
                cjne a,#00H,keystep_disp_1   ;判断是否都没按过
                movP0,#0f7h      
                ret
keystep_disp_1:                        
                mov    key_count,#0ffH                  
                mov    dptr,#kcodtab               
rk_none:                        
                clr    a
                movc   a,@a+dptr
                inc    dptr
                inc    key_count
                cjne   a,key_step,rk_none         ;按键查表               
                mov    a, key_count
                mov    dptr,#segtab2
                movc   a,@a+dptr             ;数码管查表
                mov    p0,a
                lcalldelay      
                ret
;/////////////////////////////////////////////////////////////////////////////////////////
;//功能:按键扫描
;//方法:线反转法
;////////////////////////////////////////////////////////////////////////////////////////
key_check:
                movKey,#0f0H
                mov         a,Key
                cjne a,#0f0H,key_low
key_high:
                movkey_state,#00H         ;没键按下,标志位清零
exit:
                ret
      
key_low:
                jb         key_state.0,key_unchange_1;有键按下判断是否抖动
                setb key_state.0
                movKey,#0f0H
                mov         a,Key
                orla,#0fH
                movKey,a
                movkey_step_buffer,Key
                ret
                        
key_unchange_1:
                jb   key_state.1,exit      
                movKey,#0f0H
                mova,Key
                orla,#0fH
                movKey,a
                mova,Key
                cjne a,Key_step_buffer,key_high
                setb key_state.1            ;确定有键按下,自锁
                movkey_step,Key_step_buffer
                ret
;/////////////////////////////////////////////////////////////////////////////////////////
;//Timer0中断服务程序
;//功能:定时扫描按键
;////////////////////////////////////////////////////////////////////////////////////////      
Timer0_intrrupt:      
                mov          TH1,#0D8H
                mov          TL1,#0EFH
                acall key_check               ;检测按键
               
exit_interrupt:      
                reti
;/////////////////////////////////////////////////////////////////////////////////////////
;//延时子程序
;//
;////////////////////////////////////////////////////////////////////////////////////////      
delay:mov   r3,#20
delay1: mov   r4,#50
      djnzr4,$
      djnzr3,delay1
      ret

;/////////////////////////////////////////////////////////////////////////////////////////
;//kcodtab 按键0——15对应的键值
;//segtab2 共阳数码管对应的0——9
;////////////////////////////////////////////////////////////////////////////////////////
kcodtab:
                db11101110b,11011110b,10111110b,1111110b
                db11101101b,11011101b,10111101b,1111101b
                db11101011b,11011011b,10111011b,1111011b
                db11100111b,11010111b,10110111b,1110111b
segtab2:                  
                db0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h
                db080h,090h,088h,083h,0c6h,0a1h,086h,08eh         
END


xuan--lei 发表于 2014-8-19 21:57:55

汇编看看都难啊

又一个暑假 发表于 2014-8-19 22:01:46

xuan--lei 发表于 2014-8-19 21:57
汇编看看都难啊

我也是新手,一起努力!

jianhong_wu 发表于 2014-8-19 23:39:10

感谢分享。努力加油。感谢你为论坛的付出。

不是盖的 发表于 2014-8-24 13:06:45

给点小建议,51汇编规范点写法,运行主函数之前先清理一下RAM的内存单元和配置一下堆栈指针,在C编程是这是启动代码做的事,帖主可参照51启动代码

又一个暑假 发表于 2014-8-24 14:32:19

不是盖的 发表于 2014-8-24 13:06
给点小建议,51汇编规范点写法,运行主函数之前先清理一下RAM的内存单元和配置一下堆栈指针,在C编程是这是 ...

多谢你的指导,以后请多多指教

yao1318 发表于 2014-8-24 22:08:39

我刚学的时候就是看汇编的书很难看得进,后来看到大部份人都是用C语言和它有移植方便等优点就决定学C语言了,所以现在对汇编还是门外汉。

又一个暑假 发表于 2014-8-24 23:48:16

yao1318 发表于 2014-8-24 22:08
我刚学的时候就是看汇编的书很难看得进,后来看到大部份人都是用C语言和它有移植方便等优点就决定学C语言了 ...

我之前都是用C,现在想学汇编就利用51来学方便点,

yao1318 发表于 2014-8-25 07:46:21

看来你可能是被台系的MCU的关系吧,我的一个工友也是这样。

又一个暑假 发表于 2015-3-31 16:24:41

;------------------------------------------------------------
;给大家分享个程序,网上看到的
ORG 0040H
AJMP MAIN
MAIN:
MOV P1,#0FFH
MOV P2,#0FFH   ;初始化端口
LOOP:
CALL SREAD_KEY   ;读单按键--子程序
MOV R0,KEY_NUM

CJNE R0,#00000010B,MAIN1 ;比较键值不等跳
   CPL LED1_6.0   ;取反P2.0
MAIN1:
CJNE R0,#00000011B,MAIN2 ;比较键值不等跳
CPL LED1_6.1   ;取反P2.1
MAIN2:
CJNE R0,#00000100B,MAIN3 ;比较键值不等跳
   CPL LED1_6.2   ;取反P2.2
MAIN3:
CJNE R0,#00000101B,MAIN4 ;比较键值不等跳
CPL LED1_6.3   ;取反P2.3
MAIN4:
CJNE R0,#00000110B,MAIN5 ;比较键值不等跳
CPL LED1_6.4   ;取反P2.4
MAIN5:
CJNE R0,#00000111B,MAIN_EXIT ;比较键值不等跳
CPL LED1_6.5   ;取反P2.5
MAIN_EXIT:
JMP LOOP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;读单按键--子程序
;子程序执行后返回值KEY_NUM即键值
;-----------------------------说明----------------------------
;短击:键按下时间<500MS
;长击:键按下时间>500MS
;两次按键间隔时间<700MS
;键值定义:
;KEY_NUM="00000000":无键按下
;KEY_NUM="00000001":无意义
;KEY_NUM="00000010":单次短击
;KEY_NUM="00000011":单次长击
;KEY_NUM="00000100":短击+短击
;KEY_NUM="00000101":短击+长击
;KEY_NUM="00000110":长击+短击
;KEY_NUM="00000111":长击+长击
;KEY_NUM="00001000":短击+短击+短击
;KEY_NUM="00001001":短击+短击+长击
;KEY_NUM="00001011":短击+长击+长击
;KEY_NUM="00001111":长击+长击+长击
;以编码从左看起第一个1看作为分界线,左边为0、而右边的0和1表示为:
;0短击1长击。
;以上组合已足够用了!
;*************************************************************
; KEY EQU P1.0
; KEY_NUM EQU 20H
;*************************************************************
SREAD_KEY:
MOV KEY_NUM,#00H ;键值清0
JB KEY,SKEY_EXIT ;键未按下跳
CALL DL10MS;延时去抖动
JB KEY,SKEY_EXIT ;键未按下跳
MOV KEY_NUM,#1;置键值为#00000001B
SKEY_A:
MOV R0,#00H;清计数器
CLR C   ;清CY
SKEY_B:
CALL DL10MS
INC R0
MOV A,#50
SUBB A,R0
JC SKEY_C;当键按下>500MS跳
JNB KEY,SKEY_B;键未释放跳
CALL DL10MS;延时去抖动
JNB KEY,SKEY_B;键未释放跳
CLR C   ;CY置0
JMP SKEY_D
SKEY_C:
JNB KEY,$;键未释放停
CALL DL10MS;延时去抖动
JNB KEY,$;键未释放停
SETB C   ;CY置1
SKEY_D:   
MOV A,KEY_NUM
RLC A   ;键值左移一位,C->键值低位
MOV KEY_NUM,A
JB KEY_NUM.2,SKEY_EXIT ;判断按键检测是否完成,完成跳
;说明:KEY_NUM.1时只判断单次按键两种组合,KEY_NUM.2时可判断两次按键4种组合+单次按键的2种组合=6种,以此类推。
MOV R0,#00H;清计数器
CLR C   ;CY置0
SKEY_E:
CALL DL10MS
INC R0
MOV A,#70
SUBB A,R0
JC SKEY_EXIT;当未按下>700MS跳出
JB KEY,SKEY_E;键释放跳
CALL DL10MS;延时去抖动
JB KEY,SKEY_E;键释放跳
JMP SKEY_A;当未按下<700MS再次检测
SKEY_EXIT:
RET
;************************************************************   
;延时10mS   
;************************************************************   
DL10ms:
MOV R5,#14H;20            ;10.262ms=20*511+2*20+1=20.261   
TIME10MS_1:
MOV R6,#0FFH;255    ;511us=255*2+1   
DJNZ R6,$   
DJNZ R5,TIME10MS_1   
RET   
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END

重庆-风雪 发表于 2015-3-31 21:32:12

感谢分享
页: [1]
查看完整版本: 51单片机汇编