No.83237 作者:cq2000 邮件:cq2000@ah163.com ID:31359 登陆:5次 文章数:3篇 最后登陆IP:218.106.90.4 最后登陆:2006/11/20 11:12:22 注册:2005/3/2 14:08:36 财富:125 发帖时间:2005/9/5 22:09:34 发贴者IP:61.190.89.155 标题:cq2000:第一次搞PIC,帮忙看看这段键盘程序 摘要:No.83237第一次搞PIC,帮忙看看这段键盘程序 为看得明白指令,把指令注释都加上了 这段程序的键盘扫描看不懂,好像有定时中断又有PORTB电平变化中断 ;*********************** MJ_KEYSCAN.ASM *************************** ; f=4.00000MHZ Date:2005-08-30 ; ID==050830 Checksum=xxxx ; TMR0 USED ;**************************************************************** LIST P=16f628A INCLUDE "P16f628A.INC" ;------------------------------------- ;DEFINE PORTA.0 C011 ;DEFINE PORTA.1 C012 ;DEFINE PORTA.2 C013 ;DEFINE PORTA.3 C014 ;DEFINE PORTB.4 ROW1 ;DEFINE PORTB.5 ROW2 ;DEFINE PORTB.6 ROW3 ;DEFINE PORTB.7 ROW4 ;------------------------------------- #define FOSC D'4000000' ;INTER CLOCK ;-------------------------------- OPTIONREG EQU 01H ; PCL EQU 02H ; TEMPC EQU 20H TEMPD EQU 21H TEMPE EQU 22H PABUF EQU 23H PBBUF EQU 24H COUNT EQU 25H MSDTIME EQU 26H LSDTIME EQU 27H KEYFLAG EQU 28H ; DEBNCE EQU 29H NEWKEY EQU 2AH ; WBUFFER EQU 2BH ; STATBUFFER EQU 2CH ; ;****************************************** ;KEYFLAG EQU 28H ; KEYHIT EQU 0 ; DEBNCEON EQU 1 ; NOENTRY EQU 2 ; SERVKEY EQU 3 ; ;****************************************** PUSH MACRO MOVWF WBUFFER ;将W 内容送至WBUFFER SWAPF WBUFFER ;WBUFFER寄存器的高半字节和低半字节相互交换。 SWAPF STATUS,W MOVWF STATBUFFER ENDM ; POP MACRO SWAPF STATBUFFER,W MOVWF STATUS SWAPF WBUFFER,W ENDM ;************************************* ORG 0 GOTO START ;------------------------------------- ORG 4 ;**************************************** PICINT PUSH CALL SERVICEINTERRUPTS POP RETFIE ;*************************************************************************************************************** START ;主程序 CALL INITPORTS ;端口初始化 CALL INITTIMERS ;中断初始化 LOOP BTFSC KEYFLAG,SERVKEY ;KEYFLAG.SERVKEY=0则跳过下一条指令。KEYFLAG.SERVKEY=1--有键 CALL SERVICEKEY ;调键盘服务 GOTO LOOP ;*************************************************************************************************************** SERVICEKEY ;键盘服务 MOVF NEWKEY,W ;将NEWKEY单元(2AH)键值内容传送到TEMPE单元(22H) MOVWF TEMPE SWAPF MSDTIME,W ;MSDTIME(26H)[MD7,MD6,MD5,MD4,MD3,MD2,MD1,MD0]--> MSDTIME[MD3,MD2,MD1,MD0,0,0,0,0] ANDLW B'11110000' MOVWF MSDTIME SWAPF LSDTIME,W ;LSDTIME(27H)[LD7,LD6,LD5,LD4,LD3,LD2,LD1,LD0]--> W[0,0,0,0,LD7,LD6,LD5,LD4] ANDLW B'00001111' IORWF MSDTIME ;MSDTIME OR W--> MSDTIME[MD3,MD2,MD1,MD0,LD7,LD6,LD5,LD4] SWAPF LSDTIME,W ;LSDTIME(27H)[[LD7,LD6,LD5,LD4,LD3,LD2,LD1,LD0]--> W[LD3,LD2,LD1,LD0,0,0,0,0] ANDLW B'11110000' IORWF TEMPE,W ;TEMPE(22H) OR W[LD3,LD2,LD1,LD0,0,0,0,0]--> LSDTIME MOVWF LSDTIME BCF KEYFLAG,SERVKEY ;KEYFLAG.SERVKEY=0 RETURN ;************************************************************************************************************************* INITPORTS CLRF PORTA ;立即数00000000----> PORTA锁存器 MOVLW 0X0E ;立即数00001110----> PORTB锁存器 MOVWF PORTB BSF STATUS,RP0 ;STATUS状态寄存器RP0位置1(选择存储体BANK1) MOVLW 0XF0 ;立即数11110000送TRISA,设置RA端口高四位输入,低四位输出 MOVWF TRISA MOVLW 0XF1 ;立即数11110001送TRISB,设置RB端口高四位输入和最低位输入,RB1RB2RB3输出 MOVWF TRISB BCF STATUS,RP0 ;STATUS状态寄存器RP0位置0(选择存储体BANK0) RETURN ;----------------------------------------- INITTIMERS ;允许RB口电平变化中断,允许TMR2对PR2匹配中断 CLRF MSDTIME CLRF LSDTIME CLRF KEYFLAG ; MOVLW 0X07 ;关闭比较器的功能,RA端口设为数字口 MOVWF CMCON ; BANKSEL PIE1 ;T2 20MS ;BANK存储块选择1 BSF PIE1,TMR2IE ; ;允许TMR2对PR2匹配中断 MOVLW 0X4E ; ;PR2寄存器赋值 MOVWF PR2 ; MOVLW B'10000100' ;立即数10000100送OPTION_REG 寄存器(RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0) MOVWF OPTIONREG ;RBPU=1---(PORTB 弱上拉使能位)禁止PORTB 弱上拉 ;INTEDG=0---(中断触发边沿选择位)RB0/INT 引脚下降沿触发中断 ;T0CS=0---(TMR0 时钟源选择位)内部指令周期时钟(CLKOUT) ;T0SE=0---(TMR0 计数脉冲边沿选择位)在RA4/T0CKI 引脚上的上升沿递增1 ;PSA=0---(预分频器分配位)预分频器分配给Timer0 模块(=1 预分频器分配给WDT) ;PS2 PS1 PS0=100---(预分频器分频比选择位)TMR0 分频比1:32,WDT分频比1:16 BANKSEL PORTA ; ;BANK存储块选择0 MOVLW 0X7F ;立即数01111111送T2CON寄存器(— TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0) MOVWF T2CON ;TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0(Timer2 输出后分频比选择位)=1111(1:16 后分频比) ;TMR2ON(Timer2 使能位)=1,使能 ;T2CKPS1:T2CKPS0(Timer2时钟预分频比选择位)=11(预分频比为16) M ......
>>返回讨论的主题
|