⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboard3.s43

📁 使用LED和小键盘做一个记时的程序
💻 S43
📖 第 1 页 / 共 2 页
字号:
;**************************************************************
; 文件名称:
;         keyBoard3.s43
; 文件说明:
;         使用LED和小键盘做一个计时程序,格式为HHMMSS,按FUN键
;     后将选中其中的两位,再按“INC”对选中为进行加操作,按“DEC”
;     进行减操作,按四次退出功能选择。
;**************************************************************
#include  "msp430x44x.h " 

;***************************************************************
;       RAM单元定义
;***************************************************************
hour	            equ	        201h	    ; 时
min     	    equ	        202h	    ; 分
second              equ     	203h        ; 秒		
flag                equ         204h        ; 标志寄存器
led_disp_data       equ         205h        ; led 显示缓冲
led_disp_bit        equ         206h        ; led显示位选
counter        	    equ     	207h        ; 显示计数
dip                 equ         208h        ; 小数点 
inc_dec_buffer      equ         209h        ; inc缓存;dec缓存
fun_buffer          equ         20ah        ; fun缓存
key_flag            equ         20bh        ; 键盘中断标志缓存
fun_flag            equ         20ch        ; 功能键标志缓存
second_flag         equ         200h        ; 0.5S标志
;***************************************************************
;           按键定义
;***************************************************************
key_inc                 equ         008h    ; P1.3
key_dec                 equ         004h    ; P1.2
key_fun                 equ         002h    ; P1.1
;***************************************************************
; 首先,对系统进行初始化。关看门狗、置端口的输入输出状态、以及中断情况态
; 接着,对用到的ram区进行初始化、对标志位初始化。
;***************************************************************
                ORG     08000h              ; 程序起始位置
;***************************************************************
Reset          
              	mov.w   #0600h,SP                       ; 初始化堆栈
StopWDT       	mov.w   #WDTPW+WDTHOLD,&WDTCTL          ; 关看门狗              	         	              	
Setup_P1        
                bic.b   #key_inc+key_dec+key_fun,&P1DIR ; 设置P1DIR
              	bis.b   #key_inc+key_dec+key_fun,&P1OUT ;             
              	bis.b   #key_inc+key_dec+key_fun,&P1IES ; 接收从高到低的跳变
              	bis.b   #key_inc+key_dec+key_fun,&P1IE  ; 使能中断  	                
Setup_P3        
              	mov.b   #0ffh,&P3DIR                    ; P3为输出模式
              	mov.b   #00h,&P3OUT             	; 输出值为0                      
              	mov.b   #0ffh,&P4DIR                    ; 设置P4为输出模式
              	bis.b   #03h,&P4OUT                     ; P4.1,P4.0 为1
Setup_BT
                mov.b   #BTSSEL+BT_ADLY_500,&BTCTL       ; 中断间隔设置               
                mov.b   #0a5h,&BTCTL                     ; 设置BTCTL
              	bis.b   #BTIE,&IE2                       ; 使能Basic Timer 中断               	         
Setup_TA
              	mov.w   #TASSEL1+TACLR,&TACTL            ; led 刷新一位定时
             	mov.w   #CCIE,&CCTL0
              	mov.w   #3600,&CCR0                      ; 4.5ms            
              	bis.w   #MC0,&TACTL                 	                      	              	                                
clr_ram        
                clr     R8                               ; R8 =0
loop_clr        clr.b   second_flag(R8)                  ; 对从200H起始的单元设置其值为0
                inc.b   R8                               ; R8=1
                cmp.b   #0dh,R8                          ; 判断R8是否大于0x0d
                jeq     clr_ram_over                     ; 
                jmp     loop_clr                         ; 继续循环
clr_ram_over    clr     R8                               ; 清零r8
                eint	                                 ; 
;***************************************************************
;               主程序区        
;***************************************************************
mainloop		               
                nop
                nop                
                bis.w     #LPM0,SR                       ; CPUOFF
                nop
                nop
                bic.b     #key_inc+key_dec+key_fun,&P1IE ; 清除中断使能                           
                call      #key_scan                      ; 调用key_scan
ret_jmp         jmp       mainloop                       ;
               
key_scan        
                push      R15                            ; 保存R15
                call      #delay_10ms                    ; 去抖动和防止干扰
                mov.b     &P1IN,R15                      ;
                inv.b     R15
                bit.b     #key_inc+key_dec+key_fun,R15   ; 判断有无按键按下           
                jz        ret_scan 
                                
loop_key       
                mov.b     &P1IN,R15                      ; 判断按键有无松开
                inv.b     R15
                bit.b     #key_inc+key_dec+key_fun,R15   ; 
                jnz       loop_key                       ; 没有按键继续循环                
                call      #keycodej3                     ; 判断键值
               
                
ret_scan        clr.b     &P1IFG                         ; 清除标志
                bis.b     #key_inc+key_dec+key_fun,&P1IE ; 开中断
                 
                jmp       ret_jmp                        ;
      
;***************************************************************
;               PORT 1 INT 
;***************************************************************
PORT1_INT  
            bic.w     #LPM0,0(SP)                         ; 退出LMP0
            mov.b     &P1IFG,&key_flag                    ; 获取按键中断标识
ret_int     clr.b     &P1IFG                              ; 清除P1IFG
            reti                                          ;
;***************************************************************
;          延时10ms子程序 
;***************************************************************
delay_10ms
            mov     #2666,R15                             ; R15 = 2666
loop_delay  dec     R15                                   ; R15=R15-1
            jnz     loop_delay                            ; 
            ret                                           ;
;***************************************************************
;         判断按键子程序 
;***************************************************************
keycodej3    
test_inc    bit.b     #key_inc,&key_flag                 ; 是INC吗?
            jz        test_dec                           ; 
            call      #inc_fun                           ; 
            jmp       ret_1                              ;
test_dec    bit.b     #key_dec,&key_flag                 ; 是DEC吗?
            jz        test_fun                           ;
            call      #dec_fun                           ;
            jmp       ret_1                              ;
test_fun    bit.b     #key_fun,&key_flag                 ; 是FUN吗?
            call      #fun_fun                           ;
            jmp       ret_1                              ;
            
ret_1       
            ret
;****************************************************************
;        inc按键子程序 
;****************************************************************
inc_fun     
            bit.b     #1,&fun_flag                      ; 是否对FUN按下过?
            jz        ret_inc                           ;
            cmp.b     #1,&fun_buffer                    ; 是HOUR要增加吗?
            jeq       inc_hour                          ; 

            inc.b     &inc_dec_buffer                   ; 操作缓存+1
            dadc.b    &inc_dec_buffer                   ; 
            cmp.b     #60h,&inc_dec_buffer              ; 是否要进位
            jlo       inc_move                          ;
            clr.b     &inc_dec_buffer                   ; 进位,清零操作缓存
            jmp       inc_move                          ; 
inc_hour                                                ;
            inc.b     &inc_dec_buffer                   ;
            dadc.b    &inc_dec_buffer                   ;
            cmp.b     #23h,&hour                        ; 是否要清零小时
            jlo       inc_move                          ;
            clr.b     &inc_dec_buffer                   ;
inc_move    mov.b     &fun_buffer,R15                   ;
               
            mov.b     &inc_dec_buffer,second_flag(R15)  ;
ret_inc     ret
;****************************************************************
;          dec按键子程序 
;****************************************************************
dec_fun     
            bit.b     #1,&fun_flag                     ; 是否FUN按下过?
            jz        ret_dec                          ;  
            cmp.b     #01h,&inc_dec_buffer             ; 大于等于1 吗?
            jhs       loop_dec                         ; 如果大于等于跳转
            cmp.b     #1,&fun_buffer                   ; 是对小时操作吗?
            jeq       dec_hour                         ;
            mov.b     #60h,&inc_dec_buffer             ; 变为60H,对分或者秒操作
            jmp       loop_dec                         ; 
dec_hour    mov.b     #24h,&inc_dec_buffer             ; 变为24H
loop_dec    bit.b     #0fh,&inc_dec_buffer             ; 是小时吗?
            jz        set_dec                          ;
unset_dec   dec.b     &inc_dec_buffer                  ; 减去1
            clrc                                       ;
            dadd.b   #0,&inc_dec_buffer                ; 
            jmp       dec_move                         ;
set_dec     sub.b     #06,&inc_dec_buffer              ; 减去6
            jmp       unset_dec                        ;  
dec_move    mov.b     &fun_buffer,R15                  ; 
            mov.b     &inc_dec_buffer,second_flag(R15) ; 保存
                                       
ret_dec     ret
;****************************************************************
;       fun按键子程序 
;****************************************************************
fun_fun     
            inc.b    &fun_buffer                                ; fun_buffer 加1
            cmp.b    #1,&fun_buffer                             ; 是1吗? 小时增加
            jeq      fun_star_hour                              ;
            cmp.b    #2,&fun_buffer                             ; 是2 ? 分增加
            jeq      fun_min                                    ;
            cmp.b    #3,&fun_buffer                             ; 是3 ? 秒增加
            jeq      fun_second                                 ;
            cmp.b    #4,&fun_buffer                             ; 是4 ? fun按了4次
            jeq      fun_stop                                   ;

fun_ret      ret
;****************************************************************
fun_star_hour     
            bis.b     #1,&fun_flag                              ; 设置fun_flag标识
            
            mov.b     &hour,&inc_dec_buffer                     ; hour如操作缓存
                    
            jmp       fun_ret                                   ; 
;****************************************************************
fun_min                                                         ;
            mov.b     &min,&inc_dec_buffer                      ; min进操作缓存
            jmp       fun_ret                                   ;
;****************************************************************
fun_second                                                      ;
            mov.b     &second,&inc_dec_buffer                   ; second进操作缓存

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -