内容发布更新时间 : 2024/12/28 21:18:06星期一 下面是文章的全部内容请认真阅读。
五.由设置子程序可以看出,进入设置子程序后就屏蔽了“+”,“-”和设置
键。然后逐步判断按键,执行相应程序。设计总结
六.附件
A、程 序 实 现
单片机系统初始化和存储器分配程序 $NOMOD51 ;------------------------------------------------------------------------------ ; This file is part of the C51 Compiler package //这个文件是c51 链接的数据 ;------------------------------------------------------------------------------ ; STARTUP.A51: This code is executed after processor reset. 这个代码在程序重启之后执行 ; ; To translate this file use A51 with the following invocation: ; ; A51 STARTUP.A51 ; ; To link the modified STARTUP.OBJ file to your application use the following ; BL51 invocation: ; ; BL51
XDATASTART EQU 0H ; the absolute start-address of XDATA memory XDATA 存储的实际起始地址 XDATALEN EQU 0H ; the length of XDATA memory in bytes. ; PDATASTART EQU 0H ; the absolute start-address of PDATA memory PDATALEN EQU 0H ; the length of PDATA memory in bytes. ; ; Notes: The IDATA space overlaps physically the DATA and BIT areas of the ; 8051 CPU. At minimum the memory space occupied from the C51
; run-time routines must be set to zero.
;------------------------------------------------------------------------------ ;
; Reentrant Stack Initilization ;
; The following EQU statements define the stack pointer for reentrant ; functions and initialized it: ;
; Stack Space for reentrant functions in the SMALL model.
IBPSTACK EQU 0 ; set to 1 if small reentrant is used.
IBPSTACKTOP EQU 0FFH+1 ; set top of stack to highest location+1. ;
; Stack Space for reentrant functions in the LARGE model.
XBPSTACK EQU 0 ; set to 1 if large reentrant is used.
XBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1. ;
; Stack Space for reentrant functions in the COMPACT model.
PBPSTACK EQU 0 ; set to 1 if compact reentrant is used. PBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1. ;
;------------------------------------------------------------------------------ ;
; Page Definition for Using the Compact Model with 64 KByte xdata RAM ;
; The following EQU statements define the xdata page used for pdata ; variables. The EQU PPAGE must conform with the PPAGE control used ; in the linker invocation. ;
PPAGEENABLE EQU 0 ; set to 1 if pdata object are used. ;
PPAGE EQU 0 ; define PPAGE number. ;
PPAGE_SFR DATA 0A0H ; SFR that supplies uppermost address byte ; (most 8051 variants use P2 as uppermost address byte) ;
;------------------------------------------------------------------------------
; Standard SFR Symbols ACC DATA 0E0H B DATA 0F0H SP DATA 81H DPL DATA 82H DPH DATA 83H
NAME C_STARTUP
C_C51STARTUP SEGMENT CODE STACK SEGMENT IDATA
RSEG STACK DS 1
EXTRN CODE (?C_START) PUBLIC C_STARTUP
CSEG AT 0 ?C_STARTUP: LJMP STARTUP1
RSEG C_C51STARTUP
STARTUP1:
IF IDATALEN <> 0
MOV R0,#IDATALEN - 1 CLR A
IDATALOOP: MOV @R0,A
DJNZ R0,IDATALOOP ENDIF
IF XDATALEN <> 0
MOV DPTR,#XDATASTART MOV R7,#LOW (XDATALEN) IF (LOW (XDATALEN)) <> 0
MOV R6,#(HIGH (XDATALEN)) +1 ELSE
MOV R6,#HIGH (XDATALEN) ENDIF
CLR A
XDATALOOP: MOVX @DPTR,A INC DPTR
DJNZ R7,XDATALOOP DJNZ R6,XDATALOOP ENDIF
IF PPAGEENABLE <> 0
MOV PPAGE_SFR,#PPAGE ENDIF
IF PDATALEN <> 0 MOV R0,#LOW (PDATASTART) MOV R7,#LOW (PDATALEN) CLR A PDATALOOP: MOVX @R0,A INC R0 DJNZ R7,PDATALOOP ENDIF IF IBPSTACK <> 0 EXTRN DATA (?C_IBP) MOV C_IBP,#LOW IBPSTACKTOP ENDIF IF XBPSTACK <> 0 EXTRN DATA (?C_XBP) MOV C_XBP,#HIGH XBPSTACKTOP MOV C_XBP+1,#LOW XBPSTACKTOP ENDIF IF PBPSTACK <> 0 EXTRN DATA (C_PBP) MOV C_PBP,#LOW PBPSTACKTOP ENDIF MOV SP,#STACK-1 ; This code is required if you use L51_BANK.A51 with Banking Mode 4 ; EXTRN CODE (B_SWITCH0) ; CALL B_SWITCH0 ; init bank mechanism to code bank 0 LJMP C_START END
键盘扫描程序 #include
#define uint unsigned int sbit key1=P1^0; sbit key2=P1^1; void delay(uint z); uchar keyscan() // 键盘扫描程序 { uchar temp,num; num=17; P1=0xfe; // p1.0口置0 temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(20); temp=P1; temp=temp&0xf0; if(temp!=0xf0) { // delay(10); //延迟去抖 P1=P1&0xf0; while(P1!=0xf0); switch(temp) { case 0xe0:num=7;break; //0xf0和0xe0的交处,即p1.0与p1.4的交处 case 0xd0:num=8;break; // p1.0与p1.5的交处, case 0xb0:num=9;break; case 0x70:num=15;break; default:break; } } else break; } P1=0xfd; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(20); temp=P1; temp=temp&0xf0;