1、 MOV R1,#00H ;操作数据初始值 MOV A,R1MAIN: MOV DPTR,#TAB ;读取与A中数值对应的显示段码 MOVC A,A+DPTR MOV P5,A ;段码送并行口1显示 INC R1 ;操作数据(R1)增1 CJNE A,#0AH,MAIN;检查操作数据是否大于显示范围(F) SJMP INIT1 ; MOV R6,#0H$include (Init_Device.inc) ; END二1. 例程5程序修改(1) 将KEY2、KEY4的功能对调(2) 每次停下再启动以后,更改发光二极管点亮的循环方向$include (C8051F020.inc) ; ORG 00
2、00H LJMP INITIAL ;主程序入口 ORG 0003H LJMP STOP ;外中断0服务程序入口,开始键(STAR) ORG 0013H LJMP STAR ;外中断1服务程序入口 停止键(STOP) ORG 0100HINITIAL: LCALL Init_Device ; MOV P3,#0FFH ;熄灭全部发光二极管 MOV A,#0FFH MOV DPTR,#7F80H MOVX DPTR,A ;清除数码管2(NUM2)显示 MOV A,#0FEH ;点亮发光二极管的初始数据 MOV R1,#1H ;发光二极管点亮位置初值 MOV R4,#0FH MOV IP,#04H
3、;设置INT0(开始键STAR)为高优先级 MOV TCON,#05H ;外中断采用边沿触发 SETB EX0 ;INT1(停止键STOP)开中断 SETB EA ;开放中断 CLR EA ;关闭中断 CJNE R4, #0FH, LP RL A CJNE R4,#0FH,LP MOV P3,A CJNE R4,#0FH,LP INC R1 CJNE R4,#0FH,LP SETB EA LCALL DELAY1 CJNE R1,#8H,LOOP MOV R1,#0H SJMP LOOPLP: CLR EA CJNE R4,#0F0H,LOOP RR A CJNE R4,#0F0H,LOOP
4、MOV P3,A CJNE R4,#0F0H,LOOP DEC R1 CJNE R1,#0H,LP MOV R1,#8H SJMP LP ;停止键的中断服务程序STOP: PUSH ACC ;保护A寄存器内容 MOV A,R1 ;读取发光二极管点亮位置计数值 MOV DPTR,#TAB MOVC A,A+DPTR ;获取发光二极管点亮位置计数值的显示段码 MOVX DPTR,A ;发光二极管点亮位置计数值的显示数据送显示 SETB EX1 ;INT0(启动键STAR)开中断 JNZ $ ;等待重新启动条件-A=0 MOV A,#0FFH MOVX DPTR,A ;清除数码管2(NUM2)显示
5、CLR EX1 ;禁止INT0中断(避免程序误动作) POP ACC ;恢复A寄存器内容 CLR IE1;清除INT1(停止键STOP)中断标志(避免程序误动作) RETI ;中断返回 启动键的中断服务程序STAR: MOV A,#00H ;设置启动条件-A=0 CLR IE0 ;清除INT0(启动键STOP)中断标志(避免程序误动作) PUSH ACC MOV A,R4 CPL A MOV R4,A POP ACC中断返回 DB 0C0H,0F9H,0A4H,0B0H,099H ;0-4段码 DB 092H,082H,0F8H,080H ;5-8段码DELAY1: MOV R6,#0 ; M
6、OV R7,#0 DJNZ R7,$ DJNZ R6,D1 RET$include (Init_Device.inc) ;初始设置子程序文件包含伪指令 END2. 修改例程6,将计数范围由0-F扩展至00-FF(使用定时器/计时器0),并在2位数码管上用10进制数显示计数结果(00-99)$include (C8051F020.inc) ;DP2 EQU 07F80H DP_L EQU 30H ;低位数值暂存器DP_H EQU 31H ;高位数值暂存器 LCALL Init_Device ; MOV TMOD,#00000101B ;C/T0工作于方式2 MOV A,#0 ;显示初值为0 MO
7、V DP_L,A MOV DP_H,A CALL DISPLAY ;调用显示子程序显示初值0 MOV TL0,#0 ;C/T0置初值0 SETB TR0 ;启动计数器0 MOV A,TL0 ;读计数器0的计数值 CJNE A,#0AH,L1 MOV TL0,#0 MOV A,#0 INC DP_H MOV A,DP_H CJNE A,#0AH,MM MOV DP_H,#0 MM: MOV A,#0L1: MOV DP_L,A ;在NUM2显示计数器0的计数值调用显示子程序显示计数值 SJMP LOOP ;无限次循环 ;显示子程序DISPLAY: MOV A,DP_L ;读低位显示值 CALL
8、DECODE ;调用换码子程序 MOV DPTR,#DP2 ;显示段码送NUM2 MOVX DPTR,A MOV A,DP_H ;读高位显示值 MOV P5,A RET 换码子程序 DECODE: MOV DPTR,#TAB MOVC A,A+DPTR RET DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H ;显示段码0-7 DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH ;显示段码8-F$include (Init_Device.inc) ; END 三通过对例程8的程序进行修改和上机调试,改变源程序的 功能(1)
9、将发送1、2、3、4的ASCII码改为发送A、B、C、D的ASCII码(2) 将接收的第2、第3字节数据的显示位置交换$include (C8051F020.inc) ;NUM2 EQU 07F80H ;NUM2地址NUM3 EQU 07F90H ;NUM3地址NUM4 EQU 07FA0H ;NUM4地址NUM5 EQU 07FB0H ;NUM5地址TIM_L EQU 0FDH ;T/C1低字节计数值TIM_H EQU 0FDH ;T/C1高字节计数值 REC_BUF0 EQU 32H ;数据接收缓冲器0REC_BUF1 EQU 34H ;数据接收缓冲器1REC_BUF2 EQU 33H ;
10、数据接收缓冲器2FLAG BIT 01H ;数据发送完成标志 ORG 0000H LJMP MAIN ;转主程序 ORG 0023H LJMP RECE ;转串行通信中断程序 ;主程序 lcall Init_Device ; MOV A,#0FFH MOV P5,A MOV DPTR,#NUM2 MOVX DPTR,A ;清除数码管NUM1的显示 MOV DPTR,#NUM3清除数码管NUM2的显示 MOV DPTR,#NUM4清除数码管NUM3的显示 MOV DPTR,#NUM5清除数码管NUM4的显示 MOV R6,#0 ;通信操作状态寄存器清除 MOV SP,#40H ;堆栈栈底设置 M
11、OV TMOD,#00100000B ;T/C1方式2 MOV TH1,#TIM_H ;T/C1重装填值 MOV TL1,#TIM_L ;T/C1计数值 SETB TR1 ;启动T/C1 MOV SCON0,#01010000B ;串口方式1 SETB ES ;串口中断允许 SETB EA ;开中断 主循环 CALL KEYBOARD ;调用案件状态分析子程序 CJNE A,#0FFH,L0 ;按键状态发生变化转L0 CLR FLAG ;按键状态无变化,清除发送完成标志 SJMP LOOP L0: JB FLAG,LOOP ;数据发送完成,返回主循环 MOV R7,A ;否则,键值暂存R7 M
12、OV A,#043H ;C MOV SBUF0,A ;发送字符C的ASCII码值 CALL DELAY MOV A,#04FH ;O发送字符O的ASCII码值 MOV A,#04DH ;M发送字符M的ASCII码值 MOV A,#04BH ;K发送字符K的ASCII码值 MOV A,#40H ;发送数字0的ASCII码值 MOV SBUF0,A MOV A,R7 ADD A,#40H ;生成键值的ASCII码值发送键值的ASCII码值 SETB FLAG ;置位发送完成标志 SJMP LOOP 中断服务程序RECE: JNB TI,REC1 ;非发送转接收处理 CLR TI ;否则,清除发送中
13、断标志 RETI ;REC1: PUSH ACC ;保护累加器A MOV A,SBUF0 ;读接收缓冲器 CJNE R6,#0,REC2 CJNE A,#43H,REC6 ;接收状态为0,进行字符C的过滤处理 MOV R6,#1 ;接收状态改为1 SJMP REC6REC2: CJNE R6,#1,REC3 CJNE A,#4FH,REC5 ;接收状态为1,进行字符O的过滤处理 MOV R6,#2 ;接收状态改为2REC3: CJNE R6,#2,REC4 CJNE A,#4DH,REC5 ;接收状态为2,进行字符M的过滤处理 MOV R6,#3 ;接收状态改为3 MOV R5,#3 ;数据接
14、收计数器设置为3REC4: CJNE R6,#3,REC6 PUSH ACC ;接收状态为3,暂存接收的内容 MOV A,#REC_BUF0 ADD A,R5 MOV R0,A ;生成接收数据存放缓冲器地址 POP ACC ;恢复接收数据至A寄存器 MOV R0,A ;保存接收的数据 DEC R5 ;接收数据计数器减1 CJNE R5,#0,REC6 CALL DISPLAY ;接收数据计数器减为0,进行接收结果的显示REC5: MOV R6,#0 ;接收状态恢复为0(就绪状态)REC6: POP ACC ;恢复累加器A CLR RI ;清除接收中断标志 RETI ;KEYBOARD: MOV
15、 A,P2 ;读按键状态输入端口 RR A RRC A ;KEY1有效键值移入位累加器C JC K1 ;键值无效转KEY2键值的分析 MOV A,#1 ;否则,KEY1代码送A寄存器 SJMP K5 K1:KEY2有效键值移入位累加器C JC K2 ;键值无效转KEY3键值的分析 MOV A,#2 ;否则,KEY2代码送A寄存器 SJMP K5K2:KEY3有效键值移入位累加器C JC K3 ;键值无效转KEY4键值的分析 MOV A,#3 ;否则,KEY3代码送A寄存器K3:KEY4有效键值移入位累加器C JC K4 ;键值无效转按键无效处理 MOV A,#4 ;否则,KEY4代码送A寄存器
16、K4: MOV A,#0FFH ;按键无效代码送A寄存器K5: RET MOV A,REC_BUF2 ;读取接收的第2字节数据 SWAP A ;高、低4位交换 ANL A,#0FH ;分离高4位有效数值 CALL DECODE ;换码在数码管NUM2显示第2字节数据高4位数值 MOV A,REC_BUF2 ; ANL A,#0FH ;提取低4位有效数值 CALL DECODE ;在数码管NUM3显示第2字节数据低4位数值 MOV A,REC_BUF1 ;读取接收的第3字节数据 SWAP A ;在数码管NUM4显示第3字节数据高4位数值提取低4位有效数值 MOVX DPTR,A ;在数码管NUM5显示第3字节数据低4位数值 RET - DECODE PROGRAM - MOVC A,A+DPTR- DELAY PROGRAM - MOV R5,#80H MOV R6,#0H DJNZ R6,$ DJNZ R5,D1 DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH$include (Init_Device.inc) ; END
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1