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

📄 实验10_行列是键盘.s43

📁 MSP-TEST44X 学习板光盘资料及实验说明 本学习板是按照教育大纲
💻 S43
字号:
#include  "msp430x44x.h " 
;-------------------------------------------------------------
;MSP-Test44x Demo   key,LCD
;
;                          MSP430F449             
;                       -----------------
;                   /|\|              XIN|-  
;                    | |                 |            key
;         LCD        --|RST          XOUT|-       
;        ----------    |                 |       |             | 
;       |     COM0|<---|COM0         P1.0|------>|1  2  3  *   |
;       |       . |  . |  .            . |   .   |4  5  6  0   |
;       |     COM3|<---|COM3           . |   .   |7  8  9  #   |    
;       |      S0 |<---|S0             . |   .   |             | 
;       |       . |  . |             P1.7|------>|             |
;       |      S14|<---|S14              |
;
;  Yang Rui
;  Lierda, Inc
;  NOVEMBER 2003
;  Built with IAR Embedded Workbench Version: 1.26B
;--------------------------------------------------------------
flag            	equ             200h        ;标志寄存器
led_disp_data           equ             201h        ;led 显示缓冲
led_disp_bit            equ             202h        ;led显示位选
com_byte                equ             203h        ;行扫描寄存器
buffer                  equ             204h
key_num                 equ             205h        ;键值查表寄存器
counter1                equ             206h        ;行扫描寄存
key_vaule               equ             207h        ;键值寄存器
key_buff                equ             208h        ;键盘缓冲
counter         	equ     	209h        ;lcd寄存

;---------------------------------------------------------------
;--------------   flag byte defin    ---------------------------
;---------------------------------------------------------------
ms              	equ     	01h         ;0.5秒标志
key_press               equ             02h         ;键盘按下标志
flash_busy_bit  	equ             01h
;---------------------------------------------------------------
;---------------   port   defin     ----------------------------
;---------------------------------------------------------------
;P1.0	    bsl
;P1.1       键盘行扫描输出       	
;P1.2	    键盘行扫描输出
;P1.3	    键盘行扫描输出
;P1.4       键盘列扫描输入
;p1.5	    键盘列扫描输
;P1.6	    键盘列扫描输
;P1.7	    键盘列扫描输
	
;----------------------------------------------------------------
                ORG     01100h                    
;----------------------------------------------------------------
Reset          
              	mov.w   #0a00h,SP                 
StopWDT       	
                mov.w   #WDTPW+WDTHOLD,&WDTCTL 
                mov.b   #0ffh,&key_buff          	             	            	                                   	
              	bis.b   #0fh,&P1DIR
              	bis.b   #08h,P1OUT
                bis.b   #04h,P1OUT
                bis.b   #02h,P1OUT              	              	                                
              	call    #lcd_display_ona             ;open lcd                      	      	
;----------------------------------------------------------------
;-----------        主程序区          ----------------------------
;----------------------------------------------------------------
mainloop		
                push.b  &key_buff
                pop.b   &key_buff
                mov.b   #0ffh,r15
delay           dec.b   r15
                jnz     delay      
                call    #lcd_display              ;lcd display
                call    #scan_key_deal
                jmp     mainloop

                     
;----------------------------------------------------------------   
;----------------   lcd显示子程序   ------------------------------
;----------------------------------------------------------------
lcd_display
	            mov.b     	#LCDM1,R15
      
                mov.b     	&key_buff,R13
	            and.b     	#0fh,R13
	            mov.b     	lcd_table(R13),R14	           	         
        	    mov.b     	R14,1(R15)                    
	            mov.b     	R14,0(R15)		            	           	         
        	    mov.b     	R14,3(R15)
         	    mov.b     	R14,2(R15)	                     	         
        	    mov.b     	R14,5(R15)        
	            mov.b     	R14,4(R15)		            	                                          
	            ret            	            
;-----------------------------------------------------------

lcd_display_ona
	              mov.b    #0FCh,&P5SEL                     ;Enable R(LCD) + COM Lines
	              mov.b    #LCDON+LCD4MUX+LCDP1,&LCDCTL     ;STK LCD 4Mux, S0-S19	              
	              call     #show_clr                        ;clear LCD
	              mov.b   #BTFRFQ1,&BTCTL 
	              clr      R9
	              ret         
 

;-----------------------------------------------------------         
;---------清显示存储区.
;-----------------------------------------------------------
show_clr
            	mov.b	#00h,r15                            ; clear display memory
show_clr1
            	mov.b   #00h,LCDMEM(r15)
            	inc.b   r15
            	cmp.b	#0ah,r15
            	jnz     show_clr1
            	ret
            

;-------------------------------------------------- 
;-------------    键盘扫描子程序   ----------------
;-------------------------------------------------- 
scan_key_deal           
            mov.b     #0fh,P1DIR                 ;P1.4/5/6/7键盘输入
            mov.b     #0ffh,&com_byte
            bic.b     #08h,P1OUT
            bic.b     #04h,P1OUT
            bic.b     #02h,P1OUT
            NOP
            nop
            nop
            mov.b     &P1IN,&buffer
            and.b     #0f0h,&buffer
            cmp.b     #0f0h,&buffer
            jz        ret_end                       ;没有键盘按下,转键盘扫描结束                        
            bis.b     #08h,P1OUT                    ;有键盘按下,分时逐行扫描
            bis.b     #04h,P1OUT
            bis.b     #02h,P1OUT
            mov.b     #0ffh,&com_byte
            nop
            nop                
            clr.b     &key_num                      ;键盘计数器      
            mov.b     #02h,&com_byte
            bic.b     com_byte,P1OUT
            mov.b     #03h,&counter1                ;行扫描计数器
            setc                                    ;set c=1            
scan
            bit.b     #10h,&P1IN                    ;检测第一列
            jz        take_key_vaule                ;有键按下,转查找键值
            inc.b     &key_num                      ;键盘计数器加1
            
            bit.b     #20h,&P1IN                    ;检测第二列            
            jz        take_key_vaule                ;有键按下,转查找键值
            inc.b     &key_num                      ;键盘计数器加1
            
            bit.b     #40h,&P1IN                    ;检测第三列
            jz        take_key_vaule                ;有键按下,转查找键值
            inc.b     &key_num                      ;键盘计数器加1
            
            bit.b     #80h,&P1IN                    ;检测第四列
            jz        take_key_vaule                ;有键按下,转查找键值
            inc.b     &key_num                      ;键盘计数器加1
            rlc.b     &com_byte                     ;扫描移位
            bic.b     com_byte,P1OUT                ;下一行输出0
            dec.b     &counter1
            jnz       scan
ret_end
            bic.b     #key_press,&flag              ;        
            mov.b     #0ffh,key_vaule
            ret
take_key_vaule
            bis.b     #key_press,&flag 
test_key_m1
            mov.b     P1IN,&buffer                  ;等待键盘释放
            and.b     #0f0h,&buffer
            cmp.b     #0f0h,&buffer
            jnz       test_key_m1                   ;键盘没有弹开(释放),继续检测      
            mov.b     &key_num,R6                   ;键盘释放,通过键盘计数器查表,取键值           
            mov.b     key_table(R6),&key_vaule 
            mov.b     key_table(R6),&key_buff                     
retun_end            
            ret  
;-----------------------------------------------------------------                                                                                                                       
;------------键盘键值表-------------------------------------------
;----------------------------------------------------------------- 
key_table
            db        0bh           ;*(key_vaule)       00(key_nem)
            db        09h           ;9                  01
            db        08h           ;8                  02
            db        07h           ;7                  03
            db        00h           ;0                  04
            db        06h           ;6                  05
            db        05h           ;5                  06
            db        04h           ;4                  07
            db        0ah           ;#                  08
            db        03h           ;3                  09
            db        02h           ;2                  0a
            db        01h	        ;1                  0b

;-----------------------------------------------------------              
;-----------lcd显示代码表------------------------------------
;----------------------------------------------------------- 
lcd_table
            db        7bh            ;0
            db        12h            ;1
            db        4fh            ;2
            db        1fh            ;3
            db        36h            ;4
            db        3dh            ;5
            db        7dh            ;6
            db        13h            ;7
            db        7fh            ;8
            db        3fH            ;9
            DB        06dH           ;e
            DB        065H           ;f
;------------------------------------------------------------                  
; Interrupt Vector Table
;-----------------------------------------------------------             
            RSEG    INTVEC                  ; MSP430 RESET Vector        
;-------------------------------------------------------------           
            DW      Reset                   ;0FFE0h   
            DW      Reset                   ;0FFE2h    
            DW      Reset                   ;0FFE4h 
            DW      Reset                   ;0FFE6h
            DW      Reset                   ;0FFE8h
            DW      Reset                   ;0FFEAh
            DW      Reset                   ;0FFECh 
            DW      Reset                   ;0FFEEh
            DW      Reset                   ;0FFF0h 
            DW      Reset                   ;0FFF2h
            DW      Reset                   ;0FFF4h 
            DW      Reset                   ;0FFF6h
            DW      Reset                   ;0FFF8h 
            DW      Reset                   ;0FFFAh
            DW      Reset                   ;0FFFCh 
            DW      Reset                   ;0FFFEh            
            END    
              	   


		
		   
			










⌨️ 快捷键说明

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