独闷闷网

 找回密码
 立即注册
搜索
查看: 5688|回复: 12
收起左侧

[原创] 51单片机汇编

[复制链接]
发表于 2014-8-19 21:44:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
看到网上很多原创帖我很羡慕,嫉妒是不会,恨更不可能啦。只是很渴望有一天我也能在论坛发帖子来帮助别人。虽然没有没有鸿哥、朱老师等等的水平那么高,也没有文采,但是我还是把自己写的程序贴出来让高手们指教指教,欢迎拍砖,新手可以一起学习一起探讨。
乐于分享,勇于质疑!
 楼主| 发表于 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:        
    mov  key_state,#00H
        mov  key_step,#00H
        mov  key_step_buffer,#00H
        mov  P0,#0ffH
        mov  P1,#0ffH
        mov  P2,#0aaH
        mov  IE,#088H  ;
        mov         TMOD,#010H
        mov         TH1, #0D8H
        mov         TL1, #0EFH
        setb TR1  ;启动T1
        setb EA
;/////////////////////////////////////////////////////////////////////////////////////////
;//主程序一直循环显示
;//
;////////////////////////////////////////////////////////////////////////////////////////        
loop:
          lcall keystep_disp            
          ljmp  loop
;/////////////////////////////////////////////////////////////////////////////////////////
;//键值显示程序
;//
;////////////////////////////////////////////////////////////////////////////////////////
keystep_disp:
                mov  a,key_step
                cjne a,#00H,keystep_disp_1   ;判断是否都没按过
                mov  P0,#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
                lcall  delay        
                ret
;/////////////////////////////////////////////////////////////////////////////////////////
;//功能:按键扫描
;//方法:线反转法
;////////////////////////////////////////////////////////////////////////////////////////
key_check:
                mov  Key,#0f0H
                mov         a,Key
                cjne a,#0f0H,key_low
key_high:
                mov  key_state,#00H           ;没键按下,标志位清零
exit:
                ret
        
key_low:
                jb         key_state.0,key_unchange_1;有键按下判断是否抖动
                setb key_state.0
                mov  Key,#0f0H
                mov         a,Key
                orl  a,#0fH
                mov  Key,a
                mov  key_step_buffer,Key
                ret
                        
key_unchange_1:
                jb   key_state.1,exit        
                mov  Key,#0f0H
                mov  a,Key
                orl  a,#0fH
                mov  Key,a
                mov  a,Key
                cjne a,Key_step_buffer,key_high
                setb key_state.1            ;确定有键按下,自锁
                mov  key_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
        djnz  r4,$
        djnz  r3,delay1
        ret

;/////////////////////////////////////////////////////////////////////////////////////////
;//kcodtab 按键0——15对应的键值
;//segtab2 共阳数码管对应的0——9
;////////////////////////////////////////////////////////////////////////////////////////
kcodtab:
                db  11101110b,11011110b,10111110b,1111110b
                db  11101101b,11011101b,10111101b,1111101b
                db  11101011b,11011011b,10111011b,1111011b
                db  11100111b,11010111b,10110111b,1110111b
segtab2:                  
                db  0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h
                db  080h,090h,088h,083h,0c6h,0a1h,086h,08eh         
END


1.jpg

矩阵键盘.rar

57.78 KB, 下载次数: 928

乐于分享,勇于质疑!
发表于 2014-8-19 21:57:55 | 显示全部楼层
汇编看看都难啊
乐于分享,勇于质疑!
 楼主| 发表于 2014-8-19 22:01:46 | 显示全部楼层

我也是新手,一起努力!
乐于分享,勇于质疑!
发表于 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编程是这是 ...

多谢你的指导,以后请多多指教
乐于分享,勇于质疑!
发表于 2014-8-24 22:08:39 | 显示全部楼层
我刚学的时候就是看汇编的书很难看得进,后来看到大部份人都是用C语言和它有移植方便等优点就决定学C语言了,所以现在对汇编还是门外汉。
乐于分享,勇于质疑!
 楼主| 发表于 2014-8-24 23:48:16 | 显示全部楼层
yao1318 发表于 2014-8-24 22:08
我刚学的时候就是看汇编的书很难看得进,后来看到大部份人都是用C语言和它有移植方便等优点就决定学C语言了 ...

我之前都是用C,现在想学汇编就利用51来学方便点,
乐于分享,勇于质疑!
发表于 2014-8-25 07:46:21 | 显示全部楼层
看来你可能是被台系的MCU的关系吧,我的一个工友也是这样。
乐于分享,勇于质疑!
 楼主| 发表于 2015-3-31 16:24:41 | 显示全部楼层
  1. ;------------------------------------------------------------
  2. ;给大家分享个程序,网上看到的
  3. ORG 0040H
  4. AJMP MAIN
  5. MAIN:
  6. MOV P1,#0FFH
  7. MOV P2,#0FFH   ;初始化端口
  8. LOOP:
  9. CALL SREAD_KEY   ;读单按键--子程序
  10. MOV R0,KEY_NUM  

  11. CJNE R0,#00000010B,MAIN1 ;比较键值不等跳
  12.      CPL LED1_6.0   ;取反P2.0
  13. MAIN1:
  14. CJNE R0,#00000011B,MAIN2 ;比较键值不等跳
  15. CPL LED1_6.1   ;取反P2.1
  16. MAIN2:
  17. CJNE R0,#00000100B,MAIN3 ;比较键值不等跳
  18.      CPL LED1_6.2   ;取反P2.2
  19. MAIN3:
  20. CJNE R0,#00000101B,MAIN4 ;比较键值不等跳
  21. CPL LED1_6.3   ;取反P2.3
  22. MAIN4:
  23. CJNE R0,#00000110B,MAIN5 ;比较键值不等跳
  24. CPL LED1_6.4   ;取反P2.4
  25. MAIN5:
  26. CJNE R0,#00000111B,MAIN_EXIT ;比较键值不等跳
  27. CPL LED1_6.5   ;取反P2.5
  28. MAIN_EXIT:
  29. JMP LOOP
  30. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  31. ;读单按键--子程序
  32. ;子程序执行后返回值KEY_NUM即键值
  33. ;-----------------------------说明----------------------------
  34. ;短击:键按下时间<500MS
  35. ;长击:键按下时间>500MS
  36. ;两次按键间隔时间<700MS
  37. ;键值定义:
  38. ;KEY_NUM="00000000":  无键按下
  39. ;KEY_NUM="00000001":  无意义
  40. ;KEY_NUM="00000010":  单次短击
  41. ;KEY_NUM="00000011":  单次长击
  42. ;KEY_NUM="00000100":  短击+短击
  43. ;KEY_NUM="00000101":  短击+长击
  44. ;KEY_NUM="00000110":  长击+短击
  45. ;KEY_NUM="00000111":  长击+长击
  46. ;KEY_NUM="00001000":  短击+短击+短击
  47. ;KEY_NUM="00001001":  短击+短击+长击
  48. ;KEY_NUM="00001011":  短击+长击+长击
  49. ;KEY_NUM="00001111":  长击+长击+长击
  50. ;以编码从左看起第一个1看作为分界线,左边为0、而右边的0和1表示为:
  51. ;0短击1长击。
  52. ;以上组合已足够用了!
  53. ;*************************************************************
  54. ; KEY EQU P1.0
  55. ; KEY_NUM EQU 20H
  56. ;*************************************************************
  57. SREAD_KEY:
  58. MOV KEY_NUM,#00H ;键值清0
  59. JB KEY,SKEY_EXIT ;键未按下跳
  60. CALL DL10MS  ;延时去抖动
  61. JB KEY,SKEY_EXIT ;键未按下跳
  62. MOV KEY_NUM,#1  ;置键值为#00000001B
  63. SKEY_A:
  64. MOV R0,#00H  ;清计数器
  65. CLR C   ;清CY
  66. SKEY_B:
  67. CALL DL10MS
  68. INC R0
  69. MOV A,#50
  70. SUBB A,R0
  71. JC SKEY_C  ;当键按下>500MS跳
  72. JNB KEY,SKEY_B  ;键未释放跳
  73. CALL DL10MS  ;延时去抖动
  74. JNB KEY,SKEY_B  ;键未释放跳
  75. CLR C   ;CY置0
  76. JMP SKEY_D
  77. SKEY_C:
  78. JNB KEY,$  ;键未释放停
  79. CALL DL10MS  ;延时去抖动
  80. JNB KEY,$  ;键未释放停
  81. SETB C   ;CY置1
  82. SKEY_D:   
  83. MOV A,KEY_NUM
  84. RLC A   ;键值左移一位,C->键值低位
  85. MOV KEY_NUM,A
  86. JB KEY_NUM.2,SKEY_EXIT ;判断按键检测是否完成,完成跳
  87. ;说明:KEY_NUM.1时只判断单次按键两种组合,KEY_NUM.2时可判断两次按键4种组合+单次按键的2种组合=6种,以此类推。
  88. MOV R0,#00H  ;清计数器
  89. CLR C   ;CY置0
  90. SKEY_E:
  91. CALL DL10MS
  92. INC R0
  93. MOV A,#70
  94. SUBB A,R0
  95. JC SKEY_EXIT  ;当未按下>700MS跳出
  96. JB KEY,SKEY_E  ;键释放跳
  97. CALL DL10MS  ;延时去抖动
  98. JB KEY,SKEY_E  ;键释放跳
  99. JMP SKEY_A  ;当未按下<700MS再次检测
  100. SKEY_EXIT:
  101. RET
  102. ;************************************************************   
  103. ;延时10mS   
  104. ;************************************************************   
  105. DL10ms:
  106. MOV R5,#14H  ;20              ;10.262ms=20*511+2*20+1=20.261   
  107. TIME10MS_1:
  108. MOV R6,#0FFH  ;255    ;511us=255*2+1   
  109. DJNZ R6,$   
  110. DJNZ R5,TIME10MS_1   
  111. RET   
  112. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  113. END
复制代码
乐于分享,勇于质疑!
发表于 2015-3-31 21:32:12 | 显示全部楼层
感谢分享
乐于分享,勇于质疑!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2021-6-18 10:18 , Processed in 0.161620 second(s), 20 queries .

快速回复 返回顶部 返回列表