📄 adkey.lst
字号:
MPASM 5.06.4 ADKEY.ASM 7-27-2007 17:03:52 PAGE 1
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
00001
00002 #INCLUDE <P16F877A.INC> ;
00001 LIST
00002 ; P16F877A.INC Standard Header File, Version 1.00 Microchip Technology, Inc.
00400 LIST
00003
00000020 00004 KEYRES EQU 0X20 ;键值的ASCII码
00000021 00005 ADKEYH EQU 0X21 ;模拟键盘输入A/D转换结果的高8位
00000022 00006 KEYRES_B EQU 0X22 ;键值转存
00000023 00007 COUNTLINE EQU 0X23 ;延时计数器
00000024 00008 LED_DATA EQU 0X24 ;要显示的数值
00000025 00009 CLKCOUNT EQU 0X25 ;脉冲记数器
00010
00011 #DEFINE SRCLK PORTC,3; SPI CLK
00012 #DEFINE RCLK PORTC,4; 完成脉冲线
00013 #DEFINE SER PORTC,5; SPI SDO
00014
00015
00016 ;因程序在2K范围内,goto ,call指令不考虑对PCLATH的处理,查表例外。
00017
0000 00018 ORG 0X00
0000 0000 00019 NOP
0001 2810 00020 GOTO ADKEY_1
00021
0010 00022 ORG 0X10 ;读取键值判断测试程序入口
0010 00023 ADKEY_1
0010 2029 00024 CALL INITADKEY;
0011 2072 00025 CALL PRELED;
0012 30FF 00026 MOVLW 0XFF
0013 00A3 00027 MOVWF COUNTLINE;
0014 00028 ADKEY_2
0014 2033 00029 CALL GETADKEY
0015 3030 00030 MOVLW 0X30
0016 0620 00031 XORWF KEYRES,W
0017 1D03 00032 BTFSS STATUS,Z
0018 281A 00033 GOTO ADKEY_3 ;键值不为30(有键),去抖动
0019 2814 00034 GOTO ADKEY_2
001A 00035 ADKEY_3
001A 0BA3 00036 DECFSZ COUNTLINE,F;延时去抖动
001B 281A 00037 GOTO ADKEY_3
001C 0820 00038 MOVF KEYRES,W
001D 00A2 00039 MOVWF KEYRES_B ;转移键值
001E 00040 ADKEY_4
001E 2033 00041 CALL GETADKEY ;
001F 3030 00042 MOVLW 0X30
0020 0620 00043 XORWF KEYRES,W
0021 1D03 00044 BTFSS STATUS,Z
0022 281E 00045 GOTO ADKEY_4 ;键未释放,键值与前一次读入一致,继续AD,
0023 0822 00046 MOVF KEYRES_B,W ;键已释放,键值为0x30
0024 00A4 00047 MOVWF LED_DATA;insert some display,USE PORTC;
0025 2079 00048 CALL MONILED;
0026 30FF 00049 MOVLW 0XFF
0027 00A3 00050 MOVWF COUNTLINE
MPASM 5.06.4 ADKEY.ASM 7-27-2007 17:03:52 PAGE 2
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
0028 2814 00051 GOTO ADKEY_2
00052
0029 00053 INITADKEY ;A/D 转换初始化子程序
0029 018C 00054 CLRF PIR1;
002A 3041 00055 MOVLW 0X41;
002B 009F 00056 MOVWF ADCON0; ENABLE AD,AN0,LEFT MODE,VDD,AD 转换时钟为 FOSC/8
002C 1683 00057 BSF STATUS,RP0;
002D 018B 00058 CLRF INTCON; 采用查询法,不需要中断
Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.
002E 018C 00059 CLRF PIE1;
00060
Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.
002F 1405 00061 BSF TRISA,0;
0030 300E 00062 MOVLW 0X0E; 右移位模式,高8位存在ADRESH,only RA0 analog port,VDD,VSS
Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.
0031 009F 00063 MOVWF ADCON1;
0032 0008 00064 RETURN
00065 ;************************************
0033 00066 GETADKEY ;读取键值处理子程序
00067
0033 151F 00068 BSF ADCON0,GO ;启动AD转换
0034 191F 00069 BTFSC ADCON0,GO ;等待A/D转换结束
0035 2834 00070 GOTO $-1
0036 081E 00071 MOVF ADRESH,W ;读取并存储A/D 转换结果
0037 00A1 00072 MOVWF ADKEYH ;判断键值1~9,若无键按下,认为键值为0
0038 3031 00073 MOVLW 0X31 ;
0039 00A0 00074 MOVWF KEYRES
003A 30CB 00075 KEY1 MOVLW 0XCB ;CC为S1按下对应A/D转换数字量的高8位
003B 0221 00076 SUBWF ADKEYH,W ;比较阈值设为CB可增强抗干扰能力
003C 1C03 00077 BTFSS STATUS,C ;采用逐键比较判断
003D 283F 00078 GOTO KEY2
003E 2871 00079 GOTO KEYOUT
003F 0AA0 00080 KEY2 INCF KEYRES,F
0040 30A8 00081 MOVLW 0XA8 ;A9为S2按下对应A/D转换数字量的高8位
0041 0221 00082 SUBWF ADKEYH,W
0042 1C03 00083 BTFSS STATUS,C
0043 2845 00084 GOTO KEY3
0044 2871 00085 GOTO KEYOUT
0045 0AA0 00086 KEY3 INCF KEYRES,F
0046 308F 00087 MOVLW 0X8F ;90为S3按下对应A/D转换数字量的高8位
0047 0221 00088 SUBWF ADKEYH,W
0048 1C03 00089 BTFSS STATUS,C
0049 284B 00090 GOTO KEY4
004A 2871 00091 GOTO KEYOUT
004B 0AA0 00092 KEY4 INCF KEYRES,F
004C 307D 00093 MOVLW 0X7D ;7E为S4按下对应A/D转换数字量的高8位
004D 0221 00094 SUBWF ADKEYH,W
004E 1C03 00095 BTFSS STATUS,C
004F 2851 00096 GOTO KEY5
0050 2871 00097 GOTO KEYOUT
0051 0AA0 00098 KEY5 INCF KEYRES,F
0052 306F 00099 MOVLW 0X6F ;70为S5按下对应A/D转换数字量的高8位
0053 0221 00100 SUBWF ADKEYH,W
MPASM 5.06.4 ADKEY.ASM 7-27-2007 17:03:52 PAGE 3
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
0054 1C03 00101 BTFSS STATUS,C
0055 2857 00102 GOTO KEY6
0056 2871 00103 GOTO KEYOUT
0057 0AA0 00104 KEY6 INCF KEYRES,F
0058 3063 00105 MOVLW 0X63 ;64为S6按下对应A/D转换数字量的高8位
0059 0221 00106 SUBWF ADKEYH,W
005A 1C03 00107 BTFSS STATUS,C
005B 285D 00108 GOTO KEY7
005C 2871 00109 GOTO KEYOUT
005D 0AA0 00110 KEY7 INCF KEYRES,F
005E 305A 00111 MOVLW 0X5A ;5B为S7按下对应A/D转换数字量的高8位
005F 0221 00112 SUBWF ADKEYH,W
0060 1C03 00113 BTFSS STATUS,C
0061 2863 00114 GOTO KEY8
0062 2871 00115 GOTO KEYOUT
0063 0AA0 00116 KEY8 INCF KEYRES,F
0064 3053 00117 MOVLW 0X53 ;54为S8按下对应A/D转换数字量的高8位
0065 0221 00118 SUBWF ADKEYH,W
0066 1C03 00119 BTFSS STATUS,C
0067 2869 00120 GOTO KEY9
0068 2871 00121 GOTO KEYOUT
0069 0AA0 00122 KEY9 INCF KEYRES,F
006A 304C 00123 MOVLW 0X4C ;4D为S9按下对应A/D转换数字量的高8位
006B 0221 00124 SUBWF ADKEYH,W
006C 1C03 00125 BTFSS STATUS,C
006D 286F 00126 GOTO KEY0
006E 2871 00127 GOTO KEYOUT
006F 3030 00128 KEY0 MOVLW 0X30 ;无键按下,返回30作为主函数判断有无键按下的设定值
0070 00A0 00129 MOVWF KEYRES ;也可以设定其他不与键值冲突的数值
0071 00130 KEYOUT
0071 0008 00131 RETURN
00132
0072 00133 PRELED
0072 0187 00134 CLRF PORTC;
0073 3008 00135 MOVLW 0X8
0074 00A5 00136 MOVWF CLKCOUNT;
0075 1683 00137 BSF STATUS,RP0;
00138
Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.
0076 0187 00139 CLRF TRISC; MAKE RC3,RC4,RC5 OUTPUT
0077 1283 00140 BCF STATUS,RP0;
0078 0008 00141 RETURN
00142
0079 00143 MONILED; 入口参数LED_DATA,为0-9ASCALL码
00144 ;芯片全部在时钟上升沿完成动作,故需在低电平期间完成数据的变化。
0079 3000 00145 MOVLW HIGH LED_TABLE
007A 008A 00146 MOVWF PCLATH;
007B 300F 00147 MOVLW 0X0F;
007C 05A4 00148 ANDWF LED_DATA,F;得到0-9;
007D 0824 00149 MOVF LED_DATA,W;
007E 2098 00150 CALL LED_TABLE;
007F 00A4 00151 MOVWF LED_DATA; 得到0-9对应的LED段码;该码表与SPI主模式下码表一致,故模拟时,高位
; 先送出,芯片最高工作频率30M故不需要特别的延时
MPASM 5.06.4 ADKEY.ASM 7-27-2007 17:03:52 PAGE 4
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
0080 3000 00152 MOVLW HIGH MONILED
0081 008A 00153 MOVWF PCLATH; 切换PC高位
0082 1207 00154 BCF RCLK;
0083 00155 GOGOGO
0083 1187 00156 BCF SRCLK;
0084 0DA4 00157 RLF LED_DATA,F;
0085 1803 00158 BTFSC STATUS,C;
0086 2888 00159 GOTO SETSER;
0087 288A 00160 GOTO CLRSER;
0088 00161 SETSER
0088 1687 00162 BSF SER;
0089 288B 00163 GOTO SETSRCLK;
008A 00164 CLRSER
008A 1287 00165 BCF SER;
008B 00166 SETSRCLK
008B 0000 00167 NOP
008C 0000 00168 NOP
008D 1587 00169 BSF SRCLK
008E 0000 00170 NOP
008F 0BA5 00171 DECFSZ CLKCOUNT,F;
0090 2883 00172 GOTO GOGOGO;
0091 1207 00173 BCF RCLK;干扰太厉害,必须在这清0,然后制造上升沿
0092 0000 00174 NOP
0093 0000 00175 NOP
0094 1607 00176 BSF RCLK;
0095 3008 00177 MOVLW 0X8;
0096 00A5 00178 MOVWF CLKCOUNT;
0097 0008 00179 RETURN
00180
00181
0098 00182 LED_TABLE ;七段码调整 如果表出现PCL溢出,要调整表的位置
0098 0782 00183 ADDWF PCL,F
0099 3400 3406 345B 00184 DT 0X00,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F
344F 3466 346D
347D 3407 347F
346F
00185
00186
00187
00188 END
MPASM 5.06.4 ADKEY.ASM 7-27-2007 17:03:52 PAGE 5
SYMBOL TABLE
LABEL VALUE
ACKDT 00000005
ACKEN 00000004
ACKSTAT 00000006
ADCON0 0000001F
ADCON1 0000009F
ADCS0 00000006
ADCS1 00000007
ADCS2 00000006
ADDEN 00000003
ADFM 00000007
ADIE 00000006
ADIF 00000006
ADKEYH 00000021
ADKEY_1 00000010
ADKEY_2 00000014
ADKEY_3 0000001A
ADKEY_4 0000001E
ADON 00000000
ADRESH 0000001E
ADRESL 0000009E
BCLIE 00000003
BCLIF 00000003
BF 00000000
BRGH 00000002
C 00000000
C1INV 00000004
C1OUT 00000006
C2INV 00000005
C2OUT 00000007
CCP1CON 00000017
CCP1IE 00000002
CCP1IF 00000002
CCP1M0 00000000
CCP1M1 00000001
CCP1M2 00000002
CCP1M3 00000003
CCP1X 00000005
CCP1Y 00000004
CCP2CON 0000001D
CCP2IE 00000000
CCP2IF 00000000
CCP2M0 00000000
CCP2M1 00000001
CCP2M2 00000002
CCP2M3 00000003
CCP2X 00000005
CCP2Y 00000004
CCPR1H 00000016
CCPR1L 00000015
CCPR2H 0000001C
CCPR2L 0000001B
CHS0 00000003
CHS1 00000004
MPASM 5.06.4 ADKEY.ASM 7-27-2007 17:03:52 PAGE 6
SYMBOL TABLE
LABEL VALUE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -