51单片机汇编
看到网上很多原创帖我很羡慕,嫉妒是不会,恨更不可能啦。只是很渴望有一天我也能在论坛发帖子来帮助别人。虽然没有没有鸿哥、朱老师等等的水平那么高,也没有文采,但是我还是把自己写的程序贴出来让高手们指教指教,欢迎拍砖,新手可以一起学习一起探讨。本帖最后由 又一个暑假 于 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
汇编看看都难啊
我也是新手,一起努力! 感谢分享。努力加油。感谢你为论坛的付出。 给点小建议,51汇编规范点写法,运行主函数之前先清理一下RAM的内存单元和配置一下堆栈指针,在C编程是这是启动代码做的事,帖主可参照51启动代码 不是盖的 发表于 2014-8-24 13:06
给点小建议,51汇编规范点写法,运行主函数之前先清理一下RAM的内存单元和配置一下堆栈指针,在C编程是这是 ...
多谢你的指导,以后请多多指教 我刚学的时候就是看汇编的书很难看得进,后来看到大部份人都是用C语言和它有移植方便等优点就决定学C语言了,所以现在对汇编还是门外汉。 yao1318 发表于 2014-8-24 22:08
我刚学的时候就是看汇编的书很难看得进,后来看到大部份人都是用C语言和它有移植方便等优点就决定学C语言了 ...
我之前都是用C,现在想学汇编就利用51来学方便点, 看来你可能是被台系的MCU的关系吧,我的一个工友也是这样。 ;------------------------------------------------------------
;给大家分享个程序,网上看到的
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 感谢分享
页:
[1]