⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 5045.asm

📁 Small RTOS51是为51系列单片机而编写的。它是完全免费的、源代码公开的多任务实时操作系统。它可在无任何外部数据存储器的单片80C51系统上运行
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;**************************************************
;    平凡单片机工作室
;  HTTP://WWW.MCUSTUDIO.COM
;   (C) COPYRIGHT 2003 PINGFAN'S MCUSTUDIO
;    ALL RIGHTS RESERVED
;5045.ASM
;作者:周坚   
;功能描述:
;1)读指定地址的内容 
;开机后,LED数码管以十六进制形式显示一个数字
;按下S1键或S2键,LED数码管上显示的数字加1或减1
;该数字表示的是待读的X5045中存储器单元的地址,
;按下S4键,读出该单元的内容,并且以十六进制的形式显示在LED数码管上。
2)将值写入指定单元 
;开机后,P1.0所接LED点亮,此时,可以按S1或S2,使LED数码管显示至待写入单元的地址值,
;然后按下S3键,该地址值被记录,P1.1所接LED亮,按S1或S2,
;LED数码管以十六进制形式显示待写入的数据,按下S4键,该数据被写入刚才指定的EEPROM单元中。
;**************************************************

    CS      BIT     P2.4    ; 
    SI      BIT     P2.2    ; 
    SCK     BIT     P2.3    ; 
    SO      BIT     P2.0    ; 
    WP      BIT     P2.1    ;

    WREN_INST   EQU     06H ;写允许命令字(WREN)
    WRDI_INST   EQU     04H ;写禁止命令字(WRDI)
    WRSR_INST   EQU     01H ;写状态寄存器命令字(WRSR)
    RDSR_INST   EQU     05H ;读状态寄存器命令字(RDSR)
    WRITE_INST  EQU     02H ;写存储器命令字 (WRITE)
    READ_INST   EQU     03H ;读存储器命令字 (READ)
    MAX_POLL    EQU     99H ;测试的最大次数
        
    WDT200      EQU     90H ;WD1 WD0=01
    WDT600      EQU     0A0H;WD1 WD0=10
    WDT1400     EQU     80H ;如果最高位是1代表设置看门狗WD1 WD0 =00
    NOWDT       EQU     0B0H;WD1 WD0=11
    PROQTR      EQU     04H ;BL1 BL0=01保护区域为高128字节
    PROHALF     EQU     08H ;BL1 BL0=10写保护区域为高256字节
    PROALL      EQU     0CH ;BL1 BL0=11写保护区域为整个存储器
    NOPRO       EQU     00H ;如果最高位是0,代表设置保护区域 BL1 BL0=00,不写保护
        
;***************************************************************************************
    KMARK       BIT     00H ;有键被按着
    KFIRST      BIT     01H ;第一次
    KFUNC       BIT     02H ;代表两种功能
    KENTER      BIT     03H ;代表执行S4键的操作
    KS12        BIT     04H ;S1 S2两个键被按下
    KFUNC1      BIT     05H
    KCOUNT      EQU     21H ;统计次数
    COUNT       EQU     22H
    COUNTER     EQU     23H ;用于显示的计数器
    MTD         EQU     30H ;发送数据缓冲区
    MRD         EQU     30H ;接收数据缓冲区
    NUMBYT      EQU     2FH ;传送字节数存放单元
    STATBYT     EQU     2FH ;状态字节存放单元
    DATAADDR    EQU     2DH ;该单元及DATAADDR+1是待操作的EEPROM的地址单元,该位存入高1位地址,ADDRDATA+1单元存入低8位地址
    FIRST       EQU     P2.7;第一位数码管的位控制
    SECOND      EQU     P2.6;第二位数码管的位控制
    DISPBUF     EQU     5EH ;5E,5FH是显示缓冲区
    TMRVAR      EQU     60110;65536-5000*12/11.0592 定时器初值5毫秒
    
        
    ORG     0
    JMP     START
    ORG     0BH
    JMP     INT_T0
    ORG     30H
START:  
    MOV     SP,#5FH
    CALL    INIT_T0
    SETB    P2.0
    SETB    CS
    SETB    SO
    CLR     SCK
    CLR     SI      ;初始化
    MOV     20H,#0  ;复位所有标志
    CLR     A
    MOV     COUNT,A
    MOV     KCOUNT,A
    MOV     COUNTER,A
    MOV     P1,#11111110B   ;点亮"读"控制灯
    MOV     A,COUNT
    CALL    CALC
    SETB    CS
    SETB    SO
    CLR     SCK
    CLR     SI              ;初始化
    SETB    EA
LOOP:   
    JB      KS12,MAIN_0
    JMP     MAIN_1
MAIN_0: 
    MOV     A,COUNT
    CALL    CALC
MAIN_1: 
    JB      KFUNC,MAIN_2    ;如果是第二功能(写)转
    MOV     P1,#11111110B   ;否则点亮LED1
    MOV     DATAADDR,#0     ;在本应用中,高位地址始终为0
    MOV     DATAADDR+1,COUNT;将计数值送到地址寄存器中
    JMP     MAIN_3
MAIN_2: 
    MOV     P1,#11111101B   ;点亮LED2
    MOV     R0,#MTD
    MOV     A,COUNT
    MOV     @R0,A           ;将计数值送入数值寄存器中
MAIN_3:
    JB      KENTER,MAIN_4   ;如果有回车键,转
    JMP     LOOP            ;否则回去继续循环
MAIN_4: 
    JB      KFUNC,MAIN_5    ;如果是第二功能,转
    CLR     P1.7            ;点亮D8,显示命令被正确执行
    MOV     NUMBYT,#1       ;读出1个字节
    CALL    READ_DATA       ;读数据存于MRD开始的缓冲区
    MOV     R0,#MRD
    MOV     A,@R0
    MOV     COUNT,A         ;送到计数器中
    CALL    CALC            ;调用计算显示程序
    CLR     KENTER          ;清回车标记
    CALL    DELAY
    SETB    P1.7
    JMP     LOOP            ;继续循环
MAIN_5: 
    SETB    WP              ;
    CLR     P1.7            ;点亮D8,显示命令被正确执行
    MOV     NUMBYT,#1       ;写入1个字节
    CALL    WRITE_DATA      ;将数据写入EEPROM
    CLR     KENTER
    CLR     WP
    CALL    DELAY
    SETB    P1.7        
    JMP     LOOP
;主程序到此结束

DELAY:  
    MOV     R7,#0FFH
D1: MOV     R6,#0FFH
    DJNZ    R6,$
    DJNZ    R7,D1
    RET

CALC:   
    MOV     B,#16
    DIV     AB
    MOV     DISPBUF,A
    MOV     DISPBUF+1,B     
    RET
INIT_T0:                    ;初始化T0为5毫秒的定时器
    MOV     TMOD,#01H
    MOV     TH0,#HIGH(TMRVAR)
    MOV     TL0,#LOW(TMRVAR)
    SETB    ET0             ;开T0中断
    SETB    TR0             ;定时器0开始运行
    RET                     ;返回
    
;以下是中断程序,实现显示及键盘处理
INT_T0:                     ;定时器T0的中断响应程序
    PUSH    ACC             ;ACC入栈
    PUSH    PSW             ;PSW入栈
    SETB    RS0             ;用第二组工作寄存器
    MOV TH0,#HIGH(TMRVAR)   ;
    MOV TL0,#LOW(TMRVAR)
    SETB    FIRST
    SETB    SECOND          ;关显示
    MOV     A,#DISPBUF      ;显示缓冲区首地址
    ADD     A,COUNTER 
    MOV     R0,A
    MOV     A,@R0           ;根据计数器的值取相应的显示缓冲区的值
    MOV     DPTR,#DISPTAB   ;字形表首地址
    MOVC    A,@A+DPTR       ;取字形码
    MOV     P0,A            ;将字形码送P0位(段口)
    MOV     A,COUNTER       ;取计数器的值
    JZ      DISPFIRST       ;如果是0则显示第一位
    CLR     SECOND          ;否则显示第二位
    AJMP    DISPNEXT
DISPFIRST:
    CLR     FIRST           ;显示第一位 
DISPNEXT:
    INC     COUNTER         ;计数器加1
    MOV     A,COUNTER
    DEC     A               ;如果计数器计到2,则让它回0
    DEC     A 
    JZ      RSTCOUNT 
    AJMP    KEY
RSTCOUNT:
    MOV     COUNTER,#0      ;计数器的值只能是0或1
KEY:    
    ORL     P3,#00111100B
    MOV     A,P3
    ORL     A,#11000011B
    CPL     A
    JZ      NO_KEY          ;无键按下,返回
    JNB     KMARK,KEY_1     ;键按下标志有效吗(无效转)?
    DEC     KCOUNT          ;键值计数器减1
    MOV     A,KCOUNT
    JNZ     INT_EXIT        ;如果是0,退出中断
    JNB     P3.2,KEY_S1     ;S1键按下
    JNB     P3.3,KEY_S2     ;S2键按下
    JNB     P3.4,KEY_S3     ;S3键按下
    JNB     P3.5,KEY_S4     ;S4键搂下
    JMP     NO_KEY          ;无键按下
KEY_1:
    MOV     KCOUNT,#4
    SETB    KMARK
    JMP     INT_EXIT    
KEY_S1: 
    INC     COUNT
    SETB    KS12
    JMP     KEY_2
KEY_S2: 
    DEC     COUNT
    SETB    KS12
    JMP     KEY_2
KEY_S3: 
    JB      KFUNC1,KEY_S31
    CPL     KFUNC       ;如果KFUNC=0,代表第一种功能,KFUNC=1,第二种功能
    SETB    KFUNC1
KEY_S31:
    CLR     KS12
    JMP     KEY_2
KEY_S4: 
    SETB    KENTER      ;如果该位是1,则根据KFUNC分别执行读或写的操作
    CLR     KS12
KEY_2:  
    JNB     KFIRST,KEY_3    ;如果无效,转
    MOV     KCOUNT,#20
    JMP     INT_EXIT
KEY_3:  
    MOV     KCOUNT,#200
    SETB    KFIRST
    JMP     INT_EXIT
NO_KEY: 
    CLR     KMARK
    CLR     KFIRST
    CLR     KFUNC1
    MOV     KCOUNT,#0
INT_EXIT:   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -