?? 6t.lt
字號:
1 ;*************************************
2 ;* (SEND.ASM) *
3 ;* 十五路遙控發送控制器 *
4 ;* 2001.7.18 *
5 ;*************************************
6 ;
7 ;**********************************************************************
8 ;* *
9 ;* KEYX0 P1.0 1 40 VCC *
10 ;* KEYX1 P1.1 2 39 P0.0 KEYY0 *
11 ;* KEYX2 P1.2 3 38 P0.1 KEYY1 *
12 ;* KEYX3 P1.3 4 37 P0.2 KEYY2 *
13 ;* P1.4 5 36 P0.3 KEYY3 *
14 ;* P1.5 6 35 P0.4 KEYY4 *
15 ;* P1.6 7 34 P0.5 KEYY5 *
16 ;* P1.7 8 33 P0.6 KEYY6 *
17 ;* RST 9 32 P0.7 KEYY7 *
18 ;* P3.0 10 MCS-51 31 EA VDD *
19 ;* P3.1 11 30 ALE *
20 ;* P3.2 12 29 PSEN *
21 ;* P3.3 13 28 P2.7 *
22 ;* P3.4 14 27 P2.6 *
23 ;* REMOTEOUT T1 P3.5 15 26 P2.5 *
24 ;* P3.6 16 25 P2.4 *
25 ;* P3.7 17 24 P2.3 *
26 ;* XTAL2 18 23 P2.2 *
27 ;* XTAL1 19 22 P2.1 *
28 ;* VSS 20 21 P2.0 *
29 ;* *
30 ;* *
31 ;**********************************************************************
32 ;
33 ;
34 ;
35 ;偽定義
36 KEYX0 EQU P1.0 ;P1.0 -- P1.3位鍵盤行掃描
37 KEYX1 EQU P1.1 ;本系統采用4 * 8 鍵盤陣列
38 KEYX2 EQU P1.2
39 KEYX3 EQU P1.3
40 KEYY EQU P0 ;P0 口鍵盤列掃描
41 ;
42 ;
43 ;
44 ;
45 ;*************************************
46 ;* *
47 ;* 主程序和中斷程序入口 *
48 ;* *
49 ;*************************************
50 ORG 0000H ;程序執行開始地址
0000 014D 51 AJMP START ;跳至START執行
52 ORG 0003H ;外中斷0中斷入口地址
0003 32 53 RETI ;中斷返回(不開中斷)
54 ORG 000BH ;定時器T0中斷入口地址
000B 32 55 RETI ;中斷返回(不開中斷)
56 ORG 0013H ;外中斷1中斷入口地址
0013 32 57 RETI ;中斷返回(不開中斷)
58 ORG 001BH ;定時器T1中斷入口地址
001B 02005C 59 LJMP INTT1 ;跳至INTT1中斷服務程序
60 ORG 0023H ;串行口中斷入口地址
0023 32 61 RETI ;中斷返回(不開中斷)
62 ORG 002BH ;定時器T2中斷入口地址
002B 32 63 RETI ;中斷返回(不開中斷)
64 ;
65 ;*************************************
66 ;* *
67 ;* 初 始 化 程 序 *
68 ;* *
69 ;*************************************
002C E4 70 CLEARMEMIO: CLR A ;A清0
002D 14 71 DEC A ;A為#0FFH
002E F580 72 MOV P0,A ;P0-P3口置1
0030 F590 73 MOV P1,A ;
0032 F5A0 74 MOV P2,A ;
0034 F5B0 75 MOV P3,A ;
0036 C2B5 76 CLR P3.5 ;關遙控輸出
0038 758170 77 CLEARMEM: MOV SP,#70H ;設堆?;窞?0H
003B 75A800 78 MOV IE,#00H ;關所有中斷
003E 75B801 79 MOV IP,#01H ;設優先級
0041 758922 80 MOV TMOD,#22H ;8位自動重裝初值模式
0044 758DF3 81 MOV TH1,#0F3H ;定時為13微秒初值
0047 758BF3 82 MOV TL1,#0F3H ;
004A D2AF 83 SETB EA ;開總中斷允許
004C 22 84 RET ;返回
85 ;
86 ;
87 ;
88 ;
89 ;*************************************
90 ;* *
91 ;* 主 程 序 *
92 ;* *
93 ;*************************************
004D 12002C 94 START: LCALL CLEARMEMIO ;調用初始化子程序
95 ;
0050 12005F 96 MAIN: LCALL KEYWORK ;主體程序。調用查鍵子程序
0053 020050 97 LJMP MAIN ;轉MAIN循環
0056 00 98 NOP ;PC值出錯處理
0057 00 99 NOP
0058 00 100 NOP
0059 02004D 101 LJMP START ;重新初始化
102 ;
103 ;*************************************
104 ;* *
105 ;* T1中斷服務程序 *
106 ;* *
107 ;*************************************
005C B2B5 108 INTT1: CPL P3.5 ;40KHZ紅外線遙控信號產生
005E 32 109 RETI ;中斷返回
110 ;
111 ;
112 ;*************************************
113 ;* *
114 ;* 鍵盤工作子程序(4 * 8 陣列) *
115 ;* 出口為各鍵工作程序入口 *
116 ;*************************************
005F 7580FF 117 KEYWORK: MOV KEYY,#0FFH ;置列線輸入狀態
0062 C290 118 CLR KEYX0 ;行線(P1口)全置0
0064 C291 119 CLR KEYX1
0066 C292 120 CLR KEYX2
0068 C293 121 CLR KEYX3
006A E580 122 MOV A,KEYY ;讀入P0口值
006C F5F0 123 MOV B,A ;KEYY口值暫存B中
006E B4FF01 124 CJNE A,#0FFH,KEYHIT ;不等于#0FFH,轉KEYHIT(有鍵按下)
0071 22 125 KEYOUT: RET ;沒有鍵按下返回
126 ;
0072 1201E5 127 KEYHIT: LCALL DL10MS ;延時去抖動
0075 E580 128 MOV A,KEYY ;再讀入P0口值至A
0077 B5F0F7 129 CJNE A,B,KEYOUT ;A不等于B(是干擾),子程序返回
007A D291 130 SETB KEYX1 ;有鍵按下,找鍵號開始,查0行
007C D292 131 SETB KEYX2
007E D293 132 SETB KEYX3
0080 E580 133 MOV A,KEYY ;讀入P0口值
0082 B4FF1E 134 CJNE A,#0FFH,KEYVAL0 ;P0不等于#0FFH,按下鍵在第0行
0085 D290 135 SETB KEYX0 ;不在第0行,開始查1行
0087 C291 136 CLR KEYX1
0089 E580 137 MOV A,KEYY ;讀入P0口值
008B B4FF1A 138 CJNE A,#0FFH,KEYVAL1 ;P0口不等于#0FFH,按下鍵在第1行
008E D291 139 SETB KEYX1 ;不在第1行,開始查2行
0090 C292 140 CLR KEYX2
0092 E580 141 MOV A,KEYY ;讀入P0口值
0094 B4FF16 142 CJNE A,#0FFH,KEYVAL2 ;P0口不等于#0FFH,按下鍵在第2行
0097 D292 143 SETB KEYX2 ;不在第2行,開始查3行
0099 C293 144 CLR KEYX3
009B E580 145 MOV A,KEYY ;讀入P0口值
009D B4FF12 146 CJNE A,#0FFH,KEYVAL3 ;P0口不等于#0FFH,按下鍵在第3行
00A0 020071 147 LJMP KEYOUT ;不在第3行,子程序返回
148 ;
00A3 7A00 149 KEYVAL0: MOV R2,#00H ;按下鍵在第0行,R2賦行號初值0
00A5 0200B7 150 LJMP KEYVAL4 ;跳到KEYVAL4
151 ;
00A8 7A08 152 KEYVAL1: MOV R2,#08H ;按下鍵在第1行,R2賦行號初值8
00AA 0200B7 153 LJMP KEYVAL4 ;跳到KEYVAL4
154 ;
00AD 7A10 155 KEYVAL2: MOV R2,#10H ;按下鍵在第2行,R2賦行號初值16
00AF 0200B7 156 LJMP KEYVAL4 ;跳到KEYVAL4
157 ;
00B2 7A18 158 KEYVAL3: MOV R2,#18H ;按下鍵在第3行,R2賦行號初值24
00B4 0200B7 159 LJMP KEYVAL4 ;跳到KEYVAL4
160 ;
00B7 900136 161 KEYVAL4: MOV DPTR,#KEYVALTAB ;鍵值翻譯成連續數字
00BA F5F0 162 MOV B,A ;P0口值暫存B內
00BC E4 163 CLR A ;清A
00BD F8 164 MOV R0,A ;清R0
00BE E8 165 KEYVAL5: MOV A,R0 ;查列號開始,R0數據放入A
00BF 9408 166 SUBB A,#08H ;A中數減8
00C1 50AE 167 JNC KEYOUT ;借位C為0,查表出錯,返回
00C3 E8 168 MOV A,R0 ;查表次數小于8,繼續查,
00C4 93 169 MOVC A,@A+DPTR ;查列號表
00C5 08 170 INC R0 ;R0加1
00C6 B5F0F5 171 CJNE A,B,KEYVAL5 ;查得值和P0口值不等,轉KEYVAL5再查
00C9 18 172 DEC R0 ;查得值和P0口值相等,R0減1
00CA E8 173 MOV A,R0 ;放入A(R0中數值即為列號值)
00CB 2A 174 ADD A,R2 ;與行號初值相加成為鍵號值(0-31)
00CC F5F0 175 MOV B,A ;鍵號乘3處理用于JMP散轉指令
00CE 23 176 RL A ;鍵號乘3處理用于JMP散轉指令
00CF 25F0 177 ADD A,B ;鍵號乘3處理用于JMP散轉指令
00D1 9000D5 178 MOV DPTR,#KEYFUNTAB ;取散轉功能程序(表)首址
00D4 73 179 JMP @A+DPTR ;散轉至對應功能程序標號
00D5 02013F 180 KEYFUNTAB: LJMP KEYFUN00 ;跳到鍵號0對應功能程序標號
00D8 020145 181 LJMP KEYFUN01 ;跳到鍵號1對應功能程序標號
00DB 02014B 182 LJMP KEYFUN02 ;跳到鍵號2對應功能程序標號
00DE 020151 183 LJMP KEYFUN03 ;跳到鍵號3對應功能程序標號
00E1 020157 184 LJMP KEYFUN04 ;跳到鍵號4對應功能程序標號
00E4 02015D 185 LJMP KEYFUN05 ;跳到鍵號5對應功能程序標號
00E7 020163 186 LJMP KEYFUN06 ;跳到鍵號6對應功能程序標號
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -