一起来学汇编
本人新手,离毕业还有15天学了一段时间的汇编,写了个小程序,贴出来大家喷喷,喷喷更快成长,顺便也参加一下原创帖的活动,支持一下该网站。懂汇编的多多指教,这里也特别感谢王工(wangchuangwccc)和乐工( yueyunno1)给我的帮助。希望大家一起来学习!
全部回复(8)
正序查看
倒序查看
现在还没有回复呢,说说你的想法
@又一个暑假
首先来点个LED灯[图片] 想起刚开始学单片机看到灯亮是多么高兴[图片]
再贴上程序
K1 bit P2.3 ;按键的I/O口 key_state EQU 20H ;消抖和防止一直触发用的 key_step EQU 21H ;任务标志 ORG 0000H SJMP STAR ORG 1BH LJMP Timer0_intrrupt ;装T1中断服务程序 star: mov key_state,#00H ;初始化 mov key_step,#00H mov P1,#0ffH mov IE,#88H ; mov TMOD,#10H mov TH1,#0D8H mov TL1,#0EFH setb TR1 ;启动T18 setb EA loop: key_switch: jb key_step.0, key_low_step1 ;查询要执行什么任务 jb key_step.1, key_low_step2 jb key_step.2, key_low_step3 jb key_step.3, key_low_step4 jb key_step.4, key_low_step5 jb key_step.5, key_low_step6 jb key_step.6, key_low_step7 jb key_step.7, key_low_step8 key_low_step0: mov P1,#00H ; 上电就执行的任务不一定是点LED灯 jmp loop key_low_step1: mov P1,#01H ;任务一 不一定是点LED灯 jmp loop key_low_step2: mov P1,#02H ;任务二 不一定是点LED灯 jmp loop key_low_step3: mov P1,#04H ;;任务三 不一定是点LED灯 jmp loop key_low_step4: mov P1,#08H ;任务四 不一定是点LED灯 jmp loop key_low_step5: mov P1,#10H ;任务五 不一定是点LED灯 jmp loop key_low_step6: mov P1,#20H ;任务六 不一定是点LED灯 jmp loop key_low_step7: mov P1,#40H ;任务七 不一定是点LED灯 jmp loop key_low_step8: mov P1,#80H ;任务八 不一定是点LED灯 jmp loop key_check: ;检测按键 jb K1,key_high key_low: ;有按下可能是抖动 jb key_state.0,key_unchange setb key_state.0 ret key_high: ;没按下 mov key_state,#00H mov a,key_step cjne a,#00H,exit mov P1,#00H exit: ret key_unchange: ;确定按下,是不是已经触发 jb key_state.1,exit setb key_state.1 mov a,key_step jz key_unchange11 key_unchange1: ;确定按下 rl a mov key_step,a ret key_unchange11 : mov key_step,#01H ret Timer0_intrrupt: ;中断服务函数 clr EA mov TH1,#0D8H mov TL1,#0EFH acall key_check ;扫描按键 setb EA exit_interrupt: reti END
0
回复
提示
@又一个暑假
再贴上程序[图片]K1bitP2.3;按键的I/O口key_stateEQU20H ;消抖和防止一直触发用的key_stepEQU21H;任务标志ORG0000HSJMPSTARORG1BHLJMPTimer0_intrrupt;装T1中断服务程序star:movkey_state,#00H;初始化movkey_step,#00HmovP1,#0ffHmovIE,#88H;movTMOD,#10HmovTH1,#0D8HmovTL1,#0EFHsetbTR1;启动T18setbEAloop:key_switch:jbkey_step.0,key_low_step1 ;查询要执行什么任务jbkey_step.1,key_low_step2jbkey_step.2,key_low_step3jbkey_step.3,key_low_step4jbkey_step.4,key_low_step5jbkey_step.5,key_low_step6jbkey_step.6,key_low_step7jbkey_step.7,key_low_step8key_low_step0:movP1,#00H;上电就执行的任务不一定是点LED灯jmploopkey_low_step1:movP1,#01H;任务一不一定是点LED灯jmploopkey_low_step2:movP1,#02H;任务二不一定是点LED灯jmploopkey_low_step3:movP1,#04H;;任务三不一定是点LED灯jmploopkey_low_step4:movP1,#08H;任务四不一定是点LED灯jmploopkey_low_step5:movP1,#10H;任务五不一定是点LED灯jmploopkey_low_step6:movP1,#20H;任务六不一定是点LED灯jmploopkey_low_step7:movP1,#40H;任务七不一定是点LED灯jmploopkey_low_step8:movP1,#80H;任务八不一定是点LED灯jmploopkey_check:;检测按键jbK1,key_highkey_low:;有按下可能是抖动jbkey_state.0,key_unchangesetbkey_state.0retkey_high:;没按下movkey_state,#00Hmova,key_stepcjnea,#00H,exitmovP1,#00Hexit:retkey_unchange:;确定按下,是不是已经触发jbkey_state.1,exitsetbkey_state.1mova,key_stepjzkey_unchange11key_unchange1:;确定按下rlamovkey_step,aretkey_unchange11:movkey_step,#01HretTimer0_intrrupt:;中断服务函数clrEAmovTH1,#0D8HmovTL1,#0EFHacallkey_check;扫描按键setbEAexit_interrupt:retiEND
最后来介绍一下程序要实现什么功能
这个小程序主要是为了学习用定时器定时器来扫描按键
一上电就运行
key_low_step0的任务
然后通过按键来切换任务(这里只是用每一个LED灯来表示一个任务当然key_low_step0的任务全亮不是所有任务都执行)
不是为了让LED轮了点亮,如果是让LED灯轮流点亮完全不用那么麻烦
0
回复
提示
@又一个暑假
[图片]
shcp EQU P2.0 ; //数据在上升沿进入移位寄存器 date1 EQU P2.1 ; //串行数据输入端 clock EQU P2.2 ; //上升沿时将数据输出到并行端口 send_data EQU 20H i EQU 30H ORG 0000H ljmp start start: mov i,#0 loop: clr clock mov dptr,#tab ;发送给第一片595 movc a,@a+dptr mov send_data,a lcall _74hc595_send_data mov dptr,#tab1 ;发送给第二片595 mov a,i movc a,@a+dptr mov send_data,a lcall _74hc595_send_data setb clock lcall delay_ms inc i mov a,i cjne a,#16,loop ljmp start _74hc595_send_data: ;74hc595发送数据子函数 mov r0,#00H mov a,send_data loop_07_1: clr shcp rlc a mov date1,C setb shcp inc r0 cjne r0,#08H,loop_07_1 ret delay_ms : MOV R6,#0ffH DEL1: MOV R7,#250 DJNZ R7,$ DJNZ R6,DEL1 RET tab: DB 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff tab1: DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe end
0
回复
提示
@又一个暑假
shcpEQUP2.0;//数据在上升沿进入移位寄存器date1EQUP2.1;//串行数据输入端clockEQUP2.2;//上升沿时将数据输出到并行端口send_dataEQU20HiEQU30HORG0000Hljmpstartstart:movi,#0loop:clrclockmovdptr,#tab;发送给第一片595movca,@a+dptrmovsend_data,alcall_74hc595_send_datamovdptr,#tab1;发送给第二片595mova,imovca,@a+dptrmovsend_data,alcall_74hc595_send_datasetbclocklcalldelay_msincimova,icjnea,#16,loopljmpstart_74hc595_send_data:;74hc595发送数据子函数movr0,#00Hmova,send_dataloop_07_1:clrshcprlcamovdate1,Csetbshcpincr0cjner0,#08H,loop_07_1retdelay_ms:MOVR6,#0ffHDEL1:MOVR7,#250DJNZR7,$DJNZR6,DEL1RETtab:DB0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfftab1:DB0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfeend
这个程序就是传说中的流水灯
今天不小心看到了74hc595连级的图,就有了写程序的冲动,最近学了点汇编,就用汇编写一下
0
回复
提示
;///////////////////////////////////////////////////////////////////////////////////////// ;//矩阵键盘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 ; mov P0,key_step; 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
0
回复
提示