;---------------------------------------------------------------------------; ; my9.ASM 简单的自动键,按下S31,连续发点,按下S32连续发划,同时按下发 ; ; 连续的点划 点划,先按点的开关就先发点,先按划的开关就先发划; ; 把PORTB的8号口的跳线接到BUZ上,其他的接LED,会有Morse闪耀,输入键用的 ; ; 是PORTA的0,1口,采用双拨式,即两个单独的开关,点一个,划一个。 ; ; 把PORTA的1孔与KB1孔相边,PORTA的2孔与KB4孔相边(因这两个相距远按下时方便); ;---------------------------------------------------------------------------; ;-----------------------------------------------------------------------; ; 作者:孙继利 BG2CM 2002年1月22日 ; ;-----------------------------------------------------------------------; LIST P=16F84 ; 告诉编译程序使用何种PIC单片机 INCLUDE "p16f84.inc" ; 定义了特殊寄存器等内容的头文件 ERRORLEVEL -224 __CONFIG _PWRTE_ON & _XT_OSC & _WDT_OFF ; 配置字 ;变量定义 L1 EQU 0x20 L2 EQU 0x21 L3 EQU 0x22 ORG 0 ; 程序从零地址开始 ;-----------------------------------------------------------------------; ; 我们设置了PORTA4为输入,PORTA0-3为输出,PORTB0-7均为输出 ; ;-----------------------------------------------------------------------; movlw B'00011111' ; 1代表输入,0代表输出 tris PORTA ; 设置PORTA movlw B'00000000' tris PORTB ; 设置PORTB ;-----------------------------------------------------------------------; ; 这里是主程序 ; ;-----------------------------------------------------------------------; movlw B'11111111' movwf PORTB ; 初始为11111111 call delay_3_dot ;全部输出一个长音,即一个划 movlw B'00000000' ;全部输出低电平 movwf PORTB bcf STATUS,C ; 清空状态位C,以免出现不确定状态 ;-----------发一个点的跳转--------------- loop_dot btfss PORTA,0 ;PORTA的0口,即PORTA的第1孔,为高电平时跳,即不按下时跳 goto dot ;-----------发一个划的跳转--------------- loop_dash btfss PORTA,1 ;PORTA的1口,即第2孔,为高电平时跳,即不按下时跳 goto dash goto loop_dot ;-----------发一个点和一个间隔的子程------,点,划之间的间隔为一个点的长度 dot movlw B'11111111' movwf PORTB call delay_1_dot ;发一个点 movlw B'00000000' ;停发 movwf PORTB call delay_1_dot ;后面加一个间隔 goto loop_dash ;继续检查发划否 ;-----------发一个划和一个间隔的子程------,一个划等于3个点的长度 dash movlw B'11111111' movwf PORTB call delay_3_dot ;发一个划 movlw B'00000000' ;停发 movwf PORTB call delay_1_dot ;后面加一个间隔 goto loop_dot ;继续检查发点否 ;-----------1个点的延时------------------------ delay_1_dot movlw .1 ; 延时程序,用循环的方式 movwf L1 loopdot1 movlw .255 movwf L2 loopdot2 movlw .255 movwf L3 loopdot3 decfsz L3, f goto loopdot3 decfsz L2, f goto loopdot2 decfsz L1, f goto loopdot1 return ;-----------3个点的延时------------------------ delay_3_dot movlw .3 ; 延时程序,用循环的方式 movwf L1 loop3dot1 movlw .255 movwf L2 loop3dot2 movlw .255 movwf L3 loop3dot3 decfsz L3, f goto loop3dot3 decfsz L2, f goto loop3dot2 decfsz L1, f goto loop3dot1 return end ; 形式上的程序结束