找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2066|回复: 2
打印 上一主题 下一主题
收起左侧

单片机串行通信Proteus仿真 汇编语言源程序

[复制链接]
跳转到指定楼层
楼主
A机代码:;端口引脚定义区LCD_RS                BIT                P1.0                 ;1602数据命令选择端口
LCD_RW                BIT                P1.1                 ;1602读写选择端口
LCD_EN                BIT                P1.2                 ;1602使能端口
LCD_DATA        EQU                P0                         ;1602数据端口

;变量声明区
ALL_FLAG        EQU                20H                         ;标志位
LCD_FLAG        EQU                ALL_FLAG.7        ;1602读忙标志位
LCD_DAT                EQU                30H                         ;1602数据命令字        
DELAYED                EQU                31H                         ;延时字
G EQU 50H         
S EQU 51H
G_R EQU 59H         
S_R EQU 58H
DDATA_R  EQU        57H
DDATA                EQU                56H                         ;延时字
org 0000H
LJMP start
org 0003H        ;外部中断0 中断入口
LJMP EXT0
ORG 0023H
LJMP UARTInterrupt
org 0030H
start:
                 MOV SP,#60H
                LCALL LCD_INIT
                LCALL Init_Exit
                LCALL InitUART
LOOP:
                MOV LCD_DAT,#80H
                ACALL LCD_W_CMD
                MOV LCD_DAT,#73H
                ACALL LCD_W_DATA                  
                MOV LCD_DAT,#65H
                ACALL LCD_W_DATA                  
                MOV LCD_DAT,#6eH
                ACALL LCD_W_DATA                  
                MOV LCD_DAT,#64H
                ACALL LCD_W_DATA               
                MOV LCD_DAT,#3AH
                ACALL LCD_W_DATA
                MOV LCD_DAT,S
                ACALL LCD_W_DATA               
                MOV LCD_DAT,G
                ACALL LCD_W_DATA


                LCALL ASCII
                LCALL KEY
                AJMP LOOP


Init_Exit:
      MOV IP ,#00010100B                ;配置优先级
      MOV IE,#10010101B                        ;中断允许
      MOV TCON,#01000101B                ;配置触发条件
          RET
EXT0:
           POP ACC
      POP PSW
          LCALL SendOneByte
          CALL WaitSendFinish
          PUSH ACC
      PUSH PSW
      RETI

InitUART:
    MOV TMOD,#20H
    MOV SCON,#40H
    MOV TH1,#0FDH
    MOV TL1,TH1
    MOV PCON,#80H
    SETB EA
    SETB ES
    SETB TR1
        SETB REN
    RET

UARTInterrupt:
    JB RI,IsUART_Receive
    CLR TI
    RETI
IsUART_Receive:
    CLR RI
    PUSH ACC
    MOV A,SBUF
        MOV DDATA_R,A
    POP ACC
    RETI

SendOneByte:
    CLR ES
    CLR TI
        MOV A,DDATA
         MOV C,    P
    MOV TB8, C              ;校验位送到TB8
    MOV SBUF, A
WaitSendFinish:
    JB TI,WaitSendFinish
    CLR TI
    SETB ES
    RET

LCD_R_DATA:
                        MOV                LCD_DATA,#0FFH
LCD_BUSY:        CLR                LCD_RS
                        SETB        LCD_RW
                        NOP
                        SETB        LCD_EN
                        NOP
                        MOV                Acc,LCD_DATA
                        MOV                C,Acc.7
                        MOV                LCD_FLAG,C
                        CLR                LCD_EN
                        NOP
                        JB                LCD_FLAG,LCD_BUSY        
                        RET                        


LCD_W_DATA:
                        LCALL        LCD_R_DATA
                        SETB        LCD_RS
                        CLR                LCD_RW
                        NOP                        
                        MOV                LCD_DATA,LCD_DAT
                        SETB        LCD_EN
                        NOP
                        CLR                LCD_EN
                        RET


LCD_W_CMD:
                        LCALL        LCD_R_DATA
                        CLR                LCD_RS
                        CLR                LCD_RW
                        NOP               
                        MOV                LCD_DATA,LCD_DAT
                        SETB        LCD_EN
                        NOP
                        CLR                LCD_EN
                        RET

        
LCD_CMD:
                        CLR                LCD_RS
                        CLR                LCD_RW
                        NOP               
                        MOV                LCD_DATA,LCD_DAT
                        SETB        LCD_EN
                        NOP
                        CLR                LCD_EN
                        RET

LCD_INIT:
                        MOV                DELAYED,#30
                        LCALL        DELAY_MS
                        MOV                LCD_DAT,#38H
                        LCALL        LCD_CMD
                        MOV                DELAYED,#10
                        LCALL        DELAY_MS                    
                        MOV                LCD_DAT,#38H
                        LCALL        LCD_CMD
                        MOV                DELAYED,#10
                        LCALL        DELAY_MS
                        MOV                LCD_DAT,#38H
                        LCALL        LCD_CMD
                        MOV                DELAYED,#10
                        LCALL        DELAY_MS
                        MOV                LCD_DAT,#038H
                        LCALL        LCD_W_CMD
                        MOV                LCD_DAT,#08H
                        LCALL        LCD_W_CMD
                        MOV                LCD_DAT,#01H
                        LCALL        LCD_W_CMD
                        MOV                LCD_DAT,#06H
                        LCALL        LCD_W_CMD
                        MOV                LCD_DAT,#0CH
                        LCALL        LCD_W_CMD
                        RET

KEY:
                        ACALL KEY0_1   ;调用KEY0_1,判断是否有键按下
                        JB F0,$-2   ;无键按下,转ACALL KEY0_1,继续扫描
                        MOV A,R1   ;R1为取码指针
                        MOV DDATA,R1
                        RET

KEY0_1:    ;按键检测子程序
                        SETB F0   ;设F0=1
                        MOV R3,#0F7H  ;行扫描指针初值(P2.3=0)
                        MOV R1,#00H   ;取码指针初值
L2:
                        MOV A,R3   ;载入扫描指针
                        MOV P2,A   ;输出至P2,开始扫描为0的一行
                        NOP
                        MOV A,P2   ;读入P2
                        SETB C   
                        MOV R5,#4   ;检测P2.7~P2.4,共4 列
L3:    ;检测4列
                        RLC A   ;左移一位(P2.7~P2.4)
                        JNC KEY1   ;检测到C=0,表示被按下
                        INC R1   ;无键按下则取码指针加1
                        DJNZ R5,L3   ;4列检测完毕?
                        MOV A,R3   ;载入扫描指针
                        SETB C
                        RRC A       ;扫描为0的下一行,
                        MOV R3,A   ;存回R3扫描指针寄存器
                        JC L2   ;C=0,行扫描完毕

                        MOV LCD_DAT,#0C0H ;换行
                        ACALL LCD_W_CMD
                        MOV LCD_DAT,#72H
                        ACALL LCD_W_DATA                  
                        MOV LCD_DAT,#65H
                        ACALL LCD_W_DATA                  
                        MOV LCD_DAT,#63H
                        ACALL LCD_W_DATA                  
                        MOV LCD_DAT,#65H
                        ACALL LCD_W_DATA               
                        MOV LCD_DAT,#69H
                        ACALL LCD_W_DATA
                        MOV LCD_DAT,#76H
                        ACALL LCD_W_DATA                  
                        MOV LCD_DAT,#65H
                        ACALL LCD_W_DATA                  
                        MOV LCD_DAT,#64H
                        ACALL LCD_W_DATA                  
                        MOV LCD_DAT,#3AH
                        ACALL LCD_W_DATA        
                        MOV LCD_DAT,S_R
                        ACALL LCD_W_DATA                  
                        MOV LCD_DAT,G_R
                        ACALL LCD_W_DATA        
                        LCALL  ASCII2
                        
                        RET

KEY1:
                        CLR F0   ;F0清0 ,表示按键按下
                        RET   
ASCII:
                        MOV A,R1 ;显示秒
                        MOV B,#10
                        DIV AB
                        ADD A, #48
                        MOV S,A
                        MOV A,B
                        ADD A, #48
                        MOV G,A
                        RET
ASCII2:
                        MOV A,DDATA_R
                        MOV B,#10
                        DIV AB
                        ADD A, #48
                        MOV S_R,A
                        MOV A,B
                        ADD A, #48
                        MOV G_R,A
                        RET

DELAY_MS:        
                        MOV                R7,DELAYED
D19:                        MOV                R6,#0F8H
D20:                        DJNZ        R6,D20        
                        DJNZ        R7,D19
                        
                        RET

        
DELAY_US:
                        MOV                R7,A        
DU1:               
                        DJNZ        R7,DU1
                        RET



end
B机代码:;端口引脚定义区
LCD_RS                BIT                P1.0                 ;1602数据命令选择端口
LCD_RW                BIT                P1.1                 ;1602读写选择端口
LCD_EN                BIT                P1.2                 ;1602使能端口
LCD_DATA        EQU                P0                         ;1602数据端口

;变量声明区
ALL_FLAG        EQU                20H                         ;标志位
LCD_FLAG        EQU                ALL_FLAG.7        ;1602读忙标志位
LCD_DAT                EQU                30H                         ;1602数据命令字        
DELAYED                EQU                31H                         ;延时字
G EQU 50H         
S EQU 51H
G_R EQU 59H         
S_R EQU 58H
DDATA_R  EQU        57H
DDATA                EQU                56H                         ;延时字
org 0000H
LJMP start
org 0003H        ;外部中断0 中断入口
LJMP EXT0
ORG 0023H
LJMP UARTInterrupt
org 0030H
start:
                 MOV SP,#60H
                LCALL LCD_INIT
                LCALL Init_Exit
                LCALL InitUART
LOOP:
                MOV LCD_DAT,#80H
                ACALL LCD_W_CMD
                MOV LCD_DAT,#73H
                ACALL LCD_W_DATA                  
                MOV LCD_DAT,#65H
                ACALL LCD_W_DATA                  
                MOV LCD_DAT,#6eH
                ACALL LCD_W_DATA                  
                MOV LCD_DAT,#64H
                ACALL LCD_W_DATA               
                MOV LCD_DAT,#3AH
                ACALL LCD_W_DATA
                MOV LCD_DAT,S
                ACALL LCD_W_DATA               
                MOV LCD_DAT,G
                ACALL LCD_W_DATA


                LCALL ASCII
                LCALL KEY
                AJMP LOOP


Init_Exit:
      MOV IP ,#00010100B                ;配置优先级
      MOV IE,#10010101B                        ;中断允许
      MOV TCON,#01000101B                ;配置触发条件
          RET
EXT0:
           POP ACC
      POP PSW
          LCALL SendOneByte
          CALL WaitSendFinish
          PUSH ACC
      PUSH PSW
      RETI

InitUART:
    MOV TMOD,#20H
    MOV SCON,#40H
    MOV TH1,#0FDH
    MOV TL1,TH1
    MOV PCON,#80H
    SETB EA
    SETB ES
    SETB TR1
        SETB REN
    RET

UARTInterrupt:
    JB RI,IsUART_Receive
    CLR TI
    RETI
IsUART_Receive:
    CLR RI
    PUSH ACC
    MOV A,SBUF
        MOV DDATA_R,A
    POP ACC
    RETI

SendOneByte:
    CLR ES
    CLR TI
        MOV A,DDATA
         MOV C,    P
    MOV TB8, C              ;校验位送到TB8
    MOV SBUF, A
WaitSendFinish:
    JB TI,WaitSendFinish
    CLR TI
    SETB ES
    RET

LCD_R_DATA:
                        MOV                LCD_DATA,#0FFH
LCD_BUSY:        CLR                LCD_RS
                        SETB        LCD_RW
                        NOP
                        SETB        LCD_EN
                        NOP
                        MOV                Acc,LCD_DATA
                        MOV                C,Acc.7
                        MOV                LCD_FLAG,C
                        CLR                LCD_EN
                        NOP
                        JB                LCD_FLAG,LCD_BUSY        
                        RET                        


LCD_W_DATA:
                        LCALL        LCD_R_DATA
                        SETB        LCD_RS
                        CLR                LCD_RW
                        NOP                        
                        MOV                LCD_DATA,LCD_DAT
                        SETB        LCD_EN
                        NOP
                        CLR                LCD_EN
                        RET


LCD_W_CMD:
                        LCALL        LCD_R_DATA
                        CLR                LCD_RS
                        CLR                LCD_RW
                        NOP               
                        MOV                LCD_DATA,LCD_DAT
                        SETB        LCD_EN
                        NOP
                        CLR                LCD_EN
                        RET

        
LCD_CMD:
                        CLR                LCD_RS
                        CLR                LCD_RW
                        NOP               
                        MOV                LCD_DATA,LCD_DAT
                        SETB        LCD_EN
                        NOP
                        CLR                LCD_EN
                        RET

LCD_INIT:
                        MOV                DELAYED,#30
                        LCALL        DELAY_MS
                        MOV                LCD_DAT,#38H
                        LCALL        LCD_CMD
                        MOV                DELAYED,#10
                        LCALL        DELAY_MS                    
                        MOV                LCD_DAT,#38H
                        LCALL        LCD_CMD
                        MOV                DELAYED,#10
                        LCALL        DELAY_MS
                        MOV                LCD_DAT,#38H
                        LCALL        LCD_CMD
                        MOV                DELAYED,#10
                        LCALL        DELAY_MS
                        MOV                LCD_DAT,#038H
                        LCALL        LCD_W_CMD
                        MOV                LCD_DAT,#08H
                        LCALL        LCD_W_CMD
                        MOV                LCD_DAT,#01H
                        LCALL        LCD_W_CMD
                        MOV                LCD_DAT,#06H
                        LCALL        LCD_W_CMD
                        MOV                LCD_DAT,#0CH
                        LCALL        LCD_W_CMD
                        RET

KEY:
                        ACALL KEY0_1   ;调用KEY0_1,判断是否有键按下
                        JB F0,$-2   ;无键按下,转ACALL KEY0_1,继续扫描
                        MOV A,R1   ;R1为取码指针
                        MOV DDATA,R1
                        RET

KEY0_1:    ;按键检测子程序
                        SETB F0   ;设F0=1
                        MOV R3,#0F7H  ;行扫描指针初值(P2.3=0)
                        MOV R1,#00H   ;取码指针初值
L2:
                        MOV A,R3   ;载入扫描指针
                        MOV P2,A   ;输出至P2,开始扫描为0的一行
                        NOP
                        MOV A,P2   ;读入P2
                        SETB C   
                        MOV R5,#4   ;检测P2.7~P2.4,共4 列
L3:    ;检测4列
                        RLC A   ;左移一位(P2.7~P2.4)
                        JNC KEY1   ;检测到C=0,表示被按下
                        INC R1   ;无键按下则取码指针加1
                        DJNZ R5,L3   ;4列检测完毕?
                        MOV A,R3   ;载入扫描指针
                        SETB C
                        RRC A       ;扫描为0的下一行,
                        MOV R3,A   ;存回R3扫描指针寄存器
                        JC L2   ;C=0,行扫描完毕

                        MOV LCD_DAT,#0C0H ;换行
                        ACALL LCD_W_CMD
                        MOV LCD_DAT,#72H
                        ACALL LCD_W_DATA                  
                        MOV LCD_DAT,#65H
                        ACALL LCD_W_DATA                  
                        MOV LCD_DAT,#63H
                        ACALL LCD_W_DATA                  
                        MOV LCD_DAT,#65H
                        ACALL LCD_W_DATA               
                        MOV LCD_DAT,#69H
                        ACALL LCD_W_DATA
                        MOV LCD_DAT,#76H
                        ACALL LCD_W_DATA                  
                        MOV LCD_DAT,#65H
                        ACALL LCD_W_DATA                  
                        MOV LCD_DAT,#64H
                        ACALL LCD_W_DATA                  
                        MOV LCD_DAT,#3AH
                        ACALL LCD_W_DATA        
                        MOV LCD_DAT,S_R
                        ACALL LCD_W_DATA                  
                        MOV LCD_DAT,G_R
                        ACALL LCD_W_DATA        
                        LCALL  ASCII2
                        
                        RET

KEY1:
                        CLR F0   ;F0清0 ,表示按键按下
                        RET   
ASCII:
                        MOV A,R1 ;显示秒
                        MOV B,#10
                        DIV AB
                        ADD A, #48
                        MOV S,A
                        MOV A,B
                        ADD A, #48
                        MOV G,A
                        RET
ASCII2:
                        MOV A,DDATA_R
                        MOV B,#10
                        DIV AB
                        ADD A, #48
                        MOV S_R,A
                        MOV A,B
                        ADD A, #48
                        MOV G_R,A
                        RET

DELAY_MS:        
                        MOV                R7,DELAYED
D19:                        MOV                R6,#0F8H
D20:                        DJNZ        R6,D20        
                        DJNZ        R7,D19
                        
                        RET

        
DELAY_US:
                        MOV                R7,A        
DU1:               
                        DJNZ        R7,DU1
                        RET



end


M~%F_L]LR@]%O7](JZP5$S8.png (129.12 KB, 下载次数: 70)

M~%F_L]LR@]%O7](JZP5$S8.png

双机通信.zip

29.86 KB, 下载次数: 9, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:583466 发表于 2019-12-12 21:28 | 只看该作者
赞一个 很好用
回复

使用道具 举报

板凳
ID:583466 发表于 2019-12-12 21:29 | 只看该作者
赞一个 很好用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表