📄 keyboard3.s43
字号:
;**************************************************************
; 文件名称:
; 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 + -