1、2024/10/13 周日1第第4 4章章 80C5180C51的汇编语言程序设计的汇编语言程序设计程序编制的程序编制的方法方法和和技巧技巧4.1源程序的源程序的编辑编辑和和汇编汇编4.2基本基本程序结构程序结构4.3子程序子程序及其调用及其调用4.4简单简单I/O设备的并口直接驱动设备的并口直接驱动示例示例4.52024/10/13 周日2 单片机应用系统由单片机应用系统由硬件系统硬件系统和和应用程序应用程序构成构成 汇编语言汇编语言 高级语言高级语言 应用程序设计方法应用程序设计方法 汇编语言汇编语言,生成的目标程序占内存空间少、运行速,生成的目标程序占内存空间少、运行速度快,具有效率高、
2、实时性强。度快,具有效率高、实时性强。高级语言高级语言,对系统的功能描述与实现简单,程序阅,对系统的功能描述与实现简单,程序阅读、修改和移植方便,适合于编写复杂的程序。读、修改和移植方便,适合于编写复杂的程序。2024/10/13 周日34.1 程序编制的方法和技巧程序编制的方法和技巧4.1.1 4.1.1 程序编制的步骤程序编制的步骤 明确任务:功能要求、技术指标明确任务:功能要求、技术指标 运行环境调研运行环境调研 任务分析任务分析 将实际问题转化为计算机处理的程序算法将实际问题转化为计算机处理的程序算法 算法比较与优化(内存需求算法比较与优化(内存需求与与运行速度)运行速度)算法设计算法
3、设计2024/10/13 周日4 流程描述流程描述 流程图符号流程图符号 “超级循环超级循环”框架框架2024/10/13 周日5 强化模块观念强化模块观念使程序占用空间减少、结构清晰使程序占用空间减少、结构清晰循环初值和结束条件,避免循环初值和结束条件,避免“死机死机”现象现象子程序的现场保护(注意栈平衡、寄存器内容)子程序的现场保护(注意栈平衡、寄存器内容)程序模块(主程序模块、各种子程序模块)程序模块(主程序模块、各种子程序模块)模块化优点:分块设计、便于阅读、调试方便模块化优点:分块设计、便于阅读、调试方便4.1.2 4.1.2 程序编制的方法和技巧程序编制的方法和技巧 采用循环和子程
4、序采用循环和子程序对中断子程序还有注意保护对中断子程序还有注意保护PSWPSW的内容的内容2024/10/13 周日64.1.3 4.1.3 汇编语言的语句格式汇编语言的语句格式非数字字符开头,后跟字母、数字、非数字字符开头,后跟字母、数字、“-”、“?”等等不能用已定义的保留字(指令助记符、伪指令等)不能用已定义的保留字(指令助记符、伪指令等)后跟英文冒号后跟英文冒号“:”KeilKeil的汇编器的汇编器A51A51可以识别的语句形式为:可以识别的语句形式为:标号(即符号地址)标号(即符号地址)标号:指令助记符指令助记符 操作数1,操作数2,操作数3,;注释 指令助记符指令助记符是指令功能的
5、英文缩写。是指令功能的英文缩写。2024/10/13 周日7数据:二进制(数据:二进制(B B)十进制(十进制(D D或省略或省略D D)十六进制(十六进制(H H),注意),注意A AFF开头时要加开头时要加“0 0”ASCII ASCII码,如码,如 A A,12451245v符号:符号名、标号或符号:符号名、标号或“$”(PCPC的当前值)的当前值)v表达式:由运算符和数据构成(见表表达式:由运算符和数据构成(见表4.14.1)操作数操作数 注释注释英文分号英文分号“;”开头开头2024/10/13 周日8优先级运 算 符功 能表达式及其结果示例高低()括号4*(5+6)即44NOT、H
6、IGH、LOW取反、取高字节、取低字节NOT 55H 即AAH;HIGH 1234H 即12H、正号、负号5、6*、/、MOD乘、除(取商)、取余数17/5 即3;17 MOD 5 即2、加、减 54 即 9;54=即1SHL、SHR左移、右移2 SHL 2即8;8 SHR 2 即 2AND、OR、XOR与、或、异或45H AND 0FH即05H、=、=比较运算符MOV A,X8;若X8为真,则为MOV A,01H若X8为假,则为MOV A,00H表表4.14.12024/10/13 周日94.2 源程序的编辑和汇编源程序的编辑和汇编目标程序的产生过程如下图:目标程序的产生过程如下图:2024
7、/10/13 周日104.2.1 4.2.1 源程序的编辑和汇编源程序的编辑和汇编 源程序的编辑源程序的编辑 ORG ORG 0000H LJMP MAIN ORG ORG 0040HMAIN:MOV R7,#16 MOV R0,#60H MOV A,#55HLOOP:MOV R0,A INC R0 DJNZ R7,LOOP SJMP$ENDEND依据汇编语言规则依据汇编语言规则用好用好伪指令伪指令符号符号不用中文不用中文SJMP$SJMP$用于调试用于调试以以 .ASM.ASM存盘存盘2024/10/13 周日11 源程序的汇编源程序的汇编汇编源程序转为目标程序的过程叫汇编源程序转为目标程序
8、的过程叫汇编汇编汇编通常在汇编通常在WindowsWindows下的下的集成开发环境集成开发环境完成完成用用A51.EXEA51.EXE汇编生成汇编生成.OBJ.OBJ、.LIB.LIB及及.LST.LST 目标程序的连接目标程序的连接.OBJ.OBJ、.LIB.LIB经经BL51.EXEBL51.EXE生成无扩展名的生成无扩展名的绝对地址目标文件绝对地址目标文件绝对地址目标文件绝对地址目标文件可以用于仿真器调试可以用于仿真器调试调试无误的目标文件用调试无误的目标文件用OH51.EXEOH51.EXE转换为转换为.HEX.HEX文件文件.HEX.HEX文件经文件经编程器编程器写入单片机存储器写
9、入单片机存储器2024/10/13 周日124.2.2 4.2.2 伪指令伪指令伪指令,也叫汇编命令。仅对汇编过程进行指示伪指令,也叫汇编命令。仅对汇编过程进行指示伪指令无对应的单片机可执行代码伪指令无对应的单片机可执行代码 起始地址设定伪指令起始地址设定伪指令ORGORGORG ORG 表达式表达式表达式通常为十六进制地址,例:表达式通常为十六进制地址,例:ORG 8000HSTART:MOV A,#30H ORGORG可多次使用,但地址值的顺序要由小到大可多次使用,但地址值的顺序要由小到大 结束汇编伪指令结束汇编伪指令ENDENDEND该伪指令位于源程序的该伪指令位于源程序的最后一行最后一
10、行。2024/10/13 周日13 定义字节数据表伪指令定义字节数据表伪指令DBDB定义字数据表伪指令定义字数据表伪指令DWDW1000H 标号:标号:DB DB 字节数据表字节数据表如:如:ORG 1000HORG 1000HDB -2,-4,-6,8,10,18DB -2,-4,-6,8,10,18FEH FCHFAH08H0AH12H1001H 标号:标号:DW DW 字数据表字数据表 ORG 1400H ORG 1400HDATA1:DW 32DATA1:DW 324A4AH,3CHH,3CH 1400H32H 4AH00H3CH1401H1402H1403H大端模式2024/10/1
11、3 周日14 定义常值为符号名伪指令定义常值为符号名伪指令EQUEQU符号名符号名 EQU EQU 常值表达式常值表达式 LENLEN EQUEQU 10 10 SUMSUM EQUEQU 21H 21HBLOCKBLOCK EQU EQU 22H 22H CLR A CLR A MOV R7,MOV R7,LENLEN MOV R0,MOV R0,BLOCKBLOCK LOOP:ADD A,R0 LOOP:ADD A,R0 INC R0 INC R0 DJNZ R7,LOOP DJNZ R7,LOOP MOV MOV SUMSUM,A,A 符号名为:符号名为:v地址地址v常数常数v段名段名v
12、字符串字符串v寄存器名寄存器名v位名位名比较:比较:标号标号只能是地址只能是地址2024/10/13 周日15 定义位地址为符号名伪指令定义位地址为符号名伪指令BITBIT符号名符号名 BIT BIT 位地址表达式位地址表达式如:如:ST BIT P1.0 ;ST BIT P1.0 ;将将P1.0P1.0的位地址赋给符号名的位地址赋给符号名STSTCF BIT 0D7H ;CF BIT 0D7H ;将位地址为将位地址为D7HD7H的位定义为符号名的位定义为符号名用用BITBIT定定义义的的“符符号号名名”一一经经定定义义便便不不能能重重新新定义和改变定义和改变其它一些伪指令参见教材表其它一些伪
13、指令参见教材表4.2 4.2 2024/10/13 周日164.3 基本程序结构基本程序结构一般不影响标志寄存器一般不影响标志寄存器PSWPSW的状态。的状态。传送类指令有两大类传送类指令有两大类 一般传送(一般传送(MOVMOV )特殊传送,如:特殊传送,如:MOVC MOVC MOVX MOVX PUSH PUSH、POPPOP XCH XCH、XCHDXCHD SWAP SWAP 2024/10/13 周日174.3.1 4.3.1 顺序程序顺序程序(无分支、无循环)(无分支、无循环)4.3 基本程序结构基本程序结构【例例4-14-1】片内片内RAMRAM的的21H21H单单元存放一个十
14、进制数据十元存放一个十进制数据十位的位的ASCIIASCII码,码,22H22H单元存单元存放该数据个位的放该数据个位的ASCIIASCII码。码。编写程序将该数据转换成编写程序将该数据转换成压缩压缩BCDBCD码存放在码存放在20H20H单元。单元。2024/10/13 周日18 ORG 0040H ORG 0040HSTART:MOV A,21H ;START:MOV A,21H ;取十位取十位ASCIIASCII码码 ANL A,#0FH ;ANL A,#0FH ;保留低半字节保留低半字节 SWAP A ;SWAP A ;移至高半字节移至高半字节 MOV 20H,A ;MOV 20H,A
15、 ;存于存于20H20H单元单元 MOV A,22H ;MOV A,22H ;取个位取个位ASCIIASCII码码 ANL A,#0FH ;ANL A,#0FH ;保留低半字节保留低半字节 ORL 20H,A ;ORL 20H,A ;合并到结果单元合并到结果单元 SJMP$SJMP$END END2024/10/13 周日194.3.2 4.3.2 分支程序分支程序(单分支、双分支、多分支)(单分支、双分支、多分支)【例例4-24-2】设变量设变量x x以补码以补码的形式存放在片内的形式存放在片内RAMRAM的的30H30H单元,变量单元,变量y y与与x x的关的关系是系是:当当x x大于大
16、于0 0时时,y=x;,y=x;当当x=0 x=0时时,y=20H;,y=20H;当当x x小于小于0 0时时,y=x+5,y=x+5。编制程序。编制程序,根据根据x x的大小求的大小求y y并送回原单元。并送回原单元。2024/10/13 周日20 ORG 0040HORG 0040HSTART:MOV A,30H ;START:MOV A,30H ;取取x x至累加器至累加器 JZ NEXTJZ NEXT ;x=0,;x=0,转转NEXTNEXT ANL A,#80H ;ANL A,#80H ;否,保留符号位否,保留符号位 JZ DONEJZ DONE ;x 0,;x 0,转结束转结束 M
17、OV A,#05H ;x 0MOV A,#05H ;x 0处理处理 ADD A,30H ADD A,30H MOV 30H,A ;X+05H MOV 30H,A ;X+05H送送Y Y SJMP DONE SJMP DONE NEXT:MOV 30H,#20H;x=0,20H NEXT:MOV 30H,#20H;x=0,20H送送Y Y DONE:SJMP DONE DONE:SJMP DONE END END 2024/10/13 周日21【例例4-34-3】根据根据R7R7的内容的内容x x(转移序号)转向相应的处理程序。(转移序号)转向相应的处理程序。设设R7R7内容为内容为0 04 4
18、,对应的处理程序入口地址分别为,对应的处理程序入口地址分别为PP0PP0PP4PP4。2024/10/13 周日22 START:MOV R7,#3 ;START:MOV R7,#3 ;以转移序号以转移序号3 3为例为例 ACALL JPNUMACALL JPNUM AJMP START AJMP START JPNUM:MOV DPTR,#TAB ;JPNUM:MOV DPTR,#TAB ;置分支入口地址表首址置分支入口地址表首址 MOV A,R7MOV A,R7 ADD A,R7ADD A,R7 ;乘乘2 2,调整偏移量,调整偏移量 MOV R3,A MOV R3,A MOVC A,A+D
19、PTR ;MOVC A,A+DPTR ;取地址高字节,暂存于取地址高字节,暂存于R3R3 XCH A,R3 XCH A,R3 INC A INC A MOVC A,A+DPTR ;MOVC A,A+DPTR ;取地址低字节取地址低字节 MOV DPL,A ;MOV DPL,A ;处理程序入口地址低处理程序入口地址低8 8位送位送DPLDPL MOV DPH,R3 ;MOV DPH,R3 ;处理程序入口地址高处理程序入口地址高8 8位送位送DPHDPH CLR A CLR A JMP A+DPTRJMP A+DPTR 2024/10/13 周日23 TAB:DW PP0 TAB:DW PP0 D
20、W PP1 DW PP1 DW PP2 DW PP2 DW PP3DW PP3 DW PP4 DW PP4 PP0:MOV 30H,#0 ;PP0:MOV 30H,#0 ;转移序号为转移序号为0 0时时,置功能号置功能号“0 0”于于30H30H单单元元 RETRET PP1:MOV 30H,#1 ;PP1:MOV 30H,#1 ;转移序号为转移序号为1 1时时,置功能号置功能号“1 1”于于30H30H单单元元 RETRET PP2:MOV 30H,#2 ;PP2:MOV 30H,#2 ;转移序号为转移序号为2 2时时,置功能号置功能号“2 2”于于30H30H单单元元 RETRET PP3
21、:MOV 30H,#3PP3:MOV 30H,#3 ;转移序号为转移序号为3 3时时,置功能号置功能号“3 3”于于30H30H单单元元 RETRET PP4:MOV 30H,#4 ;PP4:MOV 30H,#4 ;转移序号为转移序号为4 4时时,置功能号置功能号“4 4”于于30H30H单单元元 RETRET 2024/10/13 周日244.3.3 4.3.3 循环程序循环程序(2种:先执行,后判断;先判断,后执行)种:先执行,后判断;先判断,后执行)【例例4-44-4】将内部将内部RAMRAM的的30H30H至至3FH3FH单元初始化为单元初始化为00H00H。MAIN:MOV R0,#
22、30H;MAIN:MOV R0,#30H;置初值置初值 MOV A,#00H ;MOV A,#00H ;MOV R7,#16 ;MOV R7,#16 ;LOOP:MOV R0,A ;LOOP:MOV R0,A ;循环处理循环处理 INC R0 ;INC R0 ;DJNZ R7,LOOP;DJNZ R7,LOOP;循环修改,判结束循环修改,判结束 SJMP$;SJMP$;结束处理结束处理2024/10/13 周日25【例例4-54-5】将内部将内部RAMRAM起始地址为起始地址为60H60H的数据串传送到外部的数据串传送到外部RAMRAM中中起始地址为起始地址为1000H1000H的存储区域,直
23、到发现的存储区域,直到发现$字符停止传送。字符停止传送。MAIN:MOV R0,#60H ;MAIN:MOV R0,#60H ;置初值置初值 MOV DPTR,#1000HMOV DPTR,#1000HLOOP0:MOV A,R0 ;LOOP0:MOV A,R0 ;取数据取数据 CJNE A,#24H,LOOP1;CJNE A,#24H,LOOP1;循环结束?循环结束?SJMP DONE ;SJMP DONE ;是是LOOP1:MOVX DPTR,A ;LOOP1:MOVX DPTR,A ;循环处理循环处理 INC R0 ;INC R0 ;循环修改循环修改 INC DPTR INC DPTR
24、SJMP LOOP0 ;SJMP LOOP0 ;继续循环继续循环 DONE:SJMP DONE ;DONE:SJMP DONE ;结束处理结束处理2024/10/13 周日264.4 子程序及其调用子程序及其调用 完成完成通用功能通用功能、反复使用反复使用的程序设计成的程序设计成子程序。子程序。使应用使应用程序结构清晰紧凑,便于阅读和调试程序结构清晰紧凑,便于阅读和调试 执行要由其它程序来调用,执行完后要返回到调用程序执行要由其它程序来调用,执行完后要返回到调用程序 结构上仍然采用一般程序的结构上仍然采用一般程序的3 3种结构种结构 调用时注意:调用时注意:一是现场的保护和恢复;一是现场的保护
25、和恢复;二是主程序与子程序间的参数传递。二是主程序与子程序间的参数传递。2024/10/13 周日274.4.1 4.4.1 现场保护与恢复现场保护与恢复在主程序中实现(在主程序中实现(结构灵活结构灵活)PUSH PSW ;PUSH PSW ;保护现场(保护现场(含当前工作寄存器组号)含当前工作寄存器组号)PUSH ACC ;PUSH ACC ;PUSH B ;PUSH B ;MOV PSW,#10H;MOV PSW,#10H;切换当前工作寄存器组切换当前工作寄存器组LCALL addr16 ;LCALL addr16 ;子程序调用,子程序调用,POP B ;POP B ;恢复现场恢复现场PO
26、P ACC ;POP ACC ;POP PSW ;POP PSW ;含当前工作寄存器组切换含当前工作寄存器组切换2024/10/13 周日28在子程序中实现(在子程序中实现(程序规范、清晰程序规范、清晰)SUB1:PUSH PSW ;SUB1:PUSH PSW ;保护现场(保护现场(含当前工作寄存器组含当前工作寄存器组号)号)PUSH ACC ;PUSH ACC ;PUSH B ;PUSH B ;MOV PSW,#10H;MOV PSW,#10H;切换当前工作寄存器组切换当前工作寄存器组 POP B ;POP B ;恢复现场恢复现场 POP ACC ;POP ACC ;POP PSW ;POP
27、 PSW ;内含当前工作寄存器组切换内含当前工作寄存器组切换 RETRET2024/10/13 周日294.4.2 4.4.2 参数传递参数传递利用累加器或寄存器(利用累加器或寄存器(简单、快速,但参数个数不多简单、快速,但参数个数不多)【例例4-64-6】实现两个实现两个8 8位的十六进制无符号数求和的子程序。位的十六进制无符号数求和的子程序。SADD:MOV A,R3 ;SADD:MOV A,R3 ;取加数(在取加数(在R3R3中)中)CLR CCLR C ADD A,R4 ;ADD A,R4 ;被加数(在被加数(在R4R4中)加中)加A A JC PP1 JC PP1 MOV R3,#0
28、0H;MOV R3,#00H;结果小于结果小于255255时,高字节时,高字节R3R3内容为内容为00H00H SJMP PP2 SJMP PP2 PP1:MOV R3,#01H;PP1:MOV R3,#01H;结果大于结果大于255255时,高字节时,高字节R3R3内容为内容为01H01H PP2:MOV R4,A ;PP2:MOV R4,A ;结果的低字节在结果的低字节在R4R4中中 RETRET入口入口:(R3R3)=加数;加数;(R4R4)=被加数。被加数。出口出口:(R3R3)=和的高字节;和的高字节;(R4R4)=和的低字节。和的低字节。2024/10/13 周日30利用存储器(利
29、用存储器(个数多,用个数多,用R0R0或或R1R1及及DPTRDPTR为参数表指针为参数表指针)【例例4-74-7】将内部将内部RAM RAM 中两个中两个4 4字节无符号整数相加,和的高字节无符号整数相加,和的高字节由字节由R0R0指向。数据采用大端模式存储。指向。数据采用大端模式存储。入口入口:(R0R0)=加数低字节地址;加数低字节地址;(R1R1)=被加数低字节地址。被加数低字节地址。出口出口:(R0R0)=和的高字节起始地址。和的高字节起始地址。NADD:MOV R7,#4 ;NADD:MOV R7,#4 ;字节数字节数4 4送计数器送计数器 CLR C ;CLR C ;NADD1:
30、MOV A,R0 ;NADD1:MOV A,R0 ;利用指针利用指针,取加数低字节取加数低字节 ADDC A,R1 ;ADDC A,R1 ;利用指针利用指针,被加数低字节加被加数低字节加A A MOV R0,A ;MOV R0,A ;DEC R0 DEC R0 DEC R1 DEC R1 DJNZ R7,NADD1 DJNZ R7,NADD1 INC R0 ;INC R0 ;调整指针调整指针,指向出口,指向出口 RET RET 2024/10/13 周日31利用堆栈利用堆栈【例例4-84-8】将内部将内部RAMRAM中中20H20H单元中的单元中的1 1个字节十六进制数转换为个字节十六进制数转
31、换为2 2位位ASCIIASCII码,存放在码,存放在R0R0指示的两个单元中。指示的两个单元中。入口:预转换数据(低半字节)在栈顶入口:预转换数据(低半字节)在栈顶 出口:转换结果(出口:转换结果(ASCIIASCII码)在栈顶码)在栈顶 HEASC:MOV R1,SP ;HEASC:MOV R1,SP ;借用借用R1R1为堆栈指针为堆栈指针 DEC R1DEC R1 DEC R1 ;R1 DEC R1 ;R1指向被转换数据指向被转换数据 XCH A,R1 ;XCH A,R1 ;取被转换数据取被转换数据 ANL A,#0FH ;ANL A,#0FH ;取一位十六进制数取一位十六进制数 ADD
32、 A,#2 ;ADD A,#2 ;偏移调整偏移调整,所加值为所加值为MOVCMOVC与与DBDB间总字节数间总字节数 MOVC A,A+PC ;MOVC A,A+PC ;查表查表 XCH A,R1 ;1XCH A,R1 ;1字节指令字节指令,存结果于堆栈中存结果于堆栈中 RET ;1RET ;1字节指令字节指令ASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37HASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H DB 38H,39H,41H,42H,43H,44H
33、,45H,46H2024/10/13 周日32验证程序段验证程序段 MAIN:MOV A,20H ;MAIN:MOV A,20H ;SWAP A SWAP A PUSH ACC ;PUSH ACC ;预转换的数据(在低半字节)入栈预转换的数据(在低半字节)入栈 ACALL HEASCACALL HEASC POP ACC ;POP ACC ;弹出栈顶结果于弹出栈顶结果于ACCACC中中 MOV R0,A ;MOV R0,A ;存转换结果高字节存转换结果高字节 INC R0 ;INC R0 ;修改指针修改指针 PUSH 20H ;PUSH 20H ;预转换的数据(在低半字节)入栈预转换的数据(在
34、低半字节)入栈 ACALL HEASCACALL HEASC POP ACC ;POP ACC ;弹出栈顶结果于弹出栈顶结果于ACCACC中中 MOV R0,A ;MOV R0,A ;存转换结果低字节存转换结果低字节 SJMP$SJMP$2024/10/13 周日334.4.3 4.4.3 常用子程序示例(略)常用子程序示例(略)2024/10/13 周日344.5 简单简单I/O设备的并口直接驱动示例设备的并口直接驱动示例4.5.1 4.5.1 独立式键盘与独立式键盘与LEDLED显示示例显示示例【例例4-174-17】数据端与数据端与P0P0口口正序正序连接。编写程序,分别实现连接。编写程
35、序,分别实现功能:上电后数码管显示功能:上电后数码管显示“P P”,按下任何键后,显示从,按下任何键后,显示从“0 0”开始每隔开始每隔1 1秒加秒加1 1,加至,加至“F F”后,数码管显示后,数码管显示“P P”,进入等待按键状态。进入等待按键状态。2024/10/13 周日35 TEMP EQU 30H TEMP EQU 30HORG 0000HORG 0000HJMP STARTJMP START ORG 0100H ORG 0100HSTART:MOV SP,#5FHSTART:MOV SP,#5FH MOV P0,#8CH;MOV P0,#8CH;显示显示PPMOV P3,#0FF
36、HMOV P3,#0FFHNOKEY:MOV A,P3NOKEY:MOV A,P3CPL ACPL AJZ NOKEY ;JZ NOKEY ;无键按下无键按下MOV TEMP,P3;MOV TEMP,P3;有键按下有键按下CALL D10msCALL D10msMOV A,P3MOV A,P3CJNE A,TEMP,NOKEY;CJNE A,TEMP,NOKEY;去抖去抖MOV R7,#16MOV R7,#16MOV R2,#0MOV R2,#0LOOP:MOV A,R2LOOP:MOV A,R2 MOV DPTR,#CODE_P0 MOV DPTR,#CODE_P0 MOVC A,A+DPT
37、R MOVC A,A+DPTR MOV P0,A MOV P0,A INC R2 INC R2 SETB RS0;SETB RS0;切换组切换组 CALL D_1S CALL D_1S CLR RS0 CLR RS0 DJNZ R7,LOOP DJNZ R7,LOOP JMP START JMP START D_1S D_1S:(子程序):(子程序)D10msD10ms:(子程序):(子程序)CODE_P0:DB 0C0H,0F9H,0A4H,0B0HCODE_P0:DB 0C0H,0F9H,0A4H,0B0H DB 99H,92H,82H,0F8H DB 99H,92H,82H,0F8H D
38、B 80H,90H,88H,83H,DB 80H,90H,88H,83H,DB 0C6H,0A1H,86H,8EH DB 0C6H,0A1H,86H,8EH 2024/10/13 周日36有时为方便走线而采用逆序连接,显示段码要进行调整:有时为方便走线而采用逆序连接,显示段码要进行调整:CODE_P2:DB 03H,9FH,25H,0DH,99H,49H,40H,1FHCODE_P2:DB 03H,9FH,25H,0DH,99H,49H,40H,1FH DB 01H,09H,11H,0C1H,63H,85H,61H,71H DB 01H,09H,11H,0C1H,63H,85H,61H,71H
39、CODE_P0:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8HCODE_P0:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH试比较:试比较:2024/10/13 周日374.5.2 4.5.2 矩阵式键盘与矩阵式键盘与LEDLED显示示例显示示例步骤:步骤:判有无键按下、判按下哪个键判有无键按下、判按下哪个键 、依键号进入相应程序、依键号进入相应程序 2024/10/13 周日38 判
40、有无键按下判有无键按下 行线接输入口,列线接输出口。行线接输入口,列线接输出口。置所有列线为低电平,然后读行置所有列线为低电平,然后读行线状态,若行线均为高电平,则线状态,若行线均为高电平,则没有键按下;若行线状态不全为没有键按下;若行线状态不全为高电平,则可断定有键按下。高电平,则可断定有键按下。判按下哪个键判按下哪个键先让先让C0C0列为低电平,其余列线为列为低电平,其余列线为高电平,读行线状态,如行线状高电平,读行线状态,如行线状态不全为态不全为“1 1”,则说明所按键在,则说明所按键在该列;否则所按键不在该列,再该列;否则所按键不在该列,再使使C1C1列线为低电平,其它列为高列线为低电
41、平,其它列为高电平,判断电平,判断C1C1列有无按键按下。列有无按键按下。进入相应程序进入相应程序 键号键号 =行首号行首号+列号。列号。根据键号进入相应的功能程序。根据键号进入相应的功能程序。(程序略)2024/10/13 周日39列数多时可用列数多时可用线反转法线反转法(依据键号与键值的对应关系依据键号与键值的对应关系 )。如。如“D D”号号键,先使行线输出全键,先使行线输出全“0 0”,读列线,结果为,读列线,结果为D0HD0H;再使列线输出全;再使列线输出全“0 0”,读行线,结果为,读行线,结果为07H07H。2 2次读的结果拼成一个字节,即次读的结果拼成一个字节,即D7HD7H,该值称为键值。该值称为键值。将键值与键号的对应关系列成一个有序表,并设置一个计数器,将将键值与键号的对应关系列成一个有序表,并设置一个计数器,将所按键值用线反转法求出后,将其作为关键字在键值表中从表首开所按键值用线反转法求出后,将其作为关键字在键值表中从表首开始计数查找,查到匹配处时相应的计数值就是键号,根据键号就可始计数查找,查到匹配处时相应的计数值就是键号,根据键号就可以进入相应的处理程序了。以进入相应的处理程序了。
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100