找回密码
 立即注册

QQ登录

只需一步,快速开始

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

这个单片机汇编程序怎么改成共阴极的呀?

[复制链接]
跳转到指定楼层
楼主
ID:827883 发表于 2020-11-8 13:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
;****************************************************************
;项目名称: 数字式秒表设计;功能要求:数字式秒表上电或按键复位后能自动显示系统提示符“P.”,进入准备工作状态。该数字式秒表应具有开始、暂停、连续、清零和停止功能。
;****************************************************************
;堆栈栈底2FH;
;****************************************************************
;LED数码管显示器设定;
;P0.7---P0.0段控线,接LED的显示段dp,g,f,e,d,c,b,a
;P2.0---P2.7位控线,从左至右 (LED7,LED6,LED5,LED4,LED3,LED2,LED1,LED0)
;显示缓冲区设定从左至右依次为78H,79H,7AH,7BH,7CH,7DH,7EH,7FH
;****************************************************************
;独立式键盘设定;
;8个按键S2至S9分别依次接在P1.0至P1.7口线;
;****************************************************************
;独立式键盘设定与功能;
;8个按键S1至S8分别依次接在P1.0至P1.7口线;
;S1的功能为复位
;S2的功能为启动/停止(标识符为22H.0当它为1时启动,为0时停止)
;S3的功能为暂停/继续(标识符为22H.1当它为1时暂停,为0时继续)
;S4的功能为清零
;****************************************************************
;定时器/计数器资源:
;T/C0:工作模式1;功能;定时时间;查询或中断
;****************************************************************
;中断系统资源;
;T/C0
;****************************************************************
;键功能程序;
;K1  (S2键键功能程序)
;K2  (S3键键功能程序)
;K3  (S4键键功能程序)
;********************************************************
;中断服务程序
;********************************************************
;常数表格;
;DISBH(系统提示符P.字型代码序号表)
;DISBI(00-00-00字符的代码序号)
;TAB  (共阳数码管字型代码表)
;********************************************************
;子程序;
;DL                (1毫秒延时子程序)
;DISP           (数码管显示子程序)
;KEY                  (键扫描子程序);
;KEYCL    (P1口数据处理子程序)
;ADD01    (加1子程序)
;*********************************************************   
                        ORG                0000H
START:         LJMP          MAIN
                      ORG           000BH
                      LJMP          ZHD
                           ORG           0030H
MAIN:          MOV           PSW,                 #00H
                      MOV           SP,                 #2FH                    ;确立堆栈区
                           MOV           R0,                 #20H                    ;RAM区首地址
                               MOV              R7,            #96                        ;RAM区单元个数
                              MOV              TMOD,                #01H
                                   SETB                  EA
                                   SETB                  ET0
ML:            MOV                   @R0,                 #00H
                       INC                   R0
                                   DJNZ                  R7,                 ML
TSF:           MOV                   DPTR,                #DISBH   ;系统初始化后提示符“P.”字符代码表首地址
                              MOV                   R5,                 #08H
                                   MOV                   R0,                 #78H
DISPTSF:                CLR                   A
                       MOVC                  A,                         @A+DPTR
                                MOV                   @R0,                 A
                                INC                   R0
                                INC                   DPTR
                        DJNZ                  R5,                 DISPTSF
KEY0:                   LCALL                 DISP
                        LCALL                 KEY
                                JB                    20H.0,         K1
                                JB                    20H.1,         K2
                                JB                    20H.2,                 K3
                                LJMP                  KEY0
KEY00:                  LCALL                 KEY
                        LCALL                 DISP
                                JB                    20H.2,         K3
                                LJMP                  KEY00
K1:                     JB                    22H.1,         KEY0
                                CPL                   22H.0
                        JB                    22H.0,         01      ;高电平则计时
                                CLR                  TR0                         ;低电平则停止
                                LCALL                 DISP
                                LJMP                 KEY00
K01:                    MOV                   7AH,                 #12H        ;从零开始计时
                        MOV                   7DH,                #12H
                                MOV                   7FH,                 #10H
                                MOV                   79H,                 #00H
                                MOV                   7BH,                 #00H
                                MOV                   7CH,                 #00H
                                MOV                   7EH,                 #00H
                        MOV                   7FH,                 #00H
                                LCALL                 DISP
                                MOV                   TH0,                 #0D8H
                                MOV                   TL0,                 #0F0H
                        SETB                  TR0                                     ;启动定时器
                                LJMP                  KEY0
K2:                     JB                    22H.0,         K21                    ;判断秒表是否启动,如不是启动状态则此次按键无效
                        LJMP                 KEY0
K21:                    CPL                   22H.1
                       JB                    22H.1,         K22
                                SETB                  TR0                                    ;继续计时
                                LJMP                  KEY0
K22:                    CLR                   TR0                                   ;暂停秒表
                                LCALL                 DISP                  
                                LJMP                  KEY0
K3:                     JB                    22H.0,         KEY0                     ;只有当停止是,清零键才有效
                                MOV                   R0,                 #79H                ;秒表清零
                                LCALL                 CLR0        
                                MOV                   R0,                 #7CH
                                LCALL                 CLR0        
                                MOV                   R0,            #7FH
                                LCALL                 CLR0        
                                LJMP                  KEY0
ZHD:                   PUSH                  PSW
                        PUSH                  ACC
                                MOV                   TMOD,                #01H                    ;定时器以工作方式1工作
                                SETB                  RS1                                           ;设定组号为2组
                                CLR                  RS0
                                MOV                   TH0,                 #0D8H
                                MOV                   TL0,                 #0F0H
                                MOV                   R0,                 #79H
                                LCALL                 ADD01
                                CJNE                  R2,                 #99,        RETT   ;判断100毫秒到没
                                MOV                   R0,                 #7CH
                                LCALL                 ADD01
                           CJNE                  R2,                        #60,         RETT    ;判断60秒到没
                                LCALL                 CLR0
                                MOV                   R0,                 #7FH
                                LCALL                 ADD01
                                CJNE                  R2,                         #60,        RETT    ;判断60分到没
                                LCALL                 CLR0
RETT:                   POP                   ACC
                        POP                   PSW
                                RETI
;*******************************************************
;常数表格区
;系统初始化后提示符“P.”字符代码表;
DISBH:  DB 10H,10H,10H,10H,10H,10H,10H,11H;提示符“P.”字符序号显示字符段选码表(共阳极代码)
TAB:    DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H;0-8
        DB 90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0BFH
;9,A,B,C,D,E,F,灭,p.,-
;*******************************************************
;子程序区;
ADD01:                MOV                   A,                 @R0
               DEC                   R0
                           SWAP                 A
                           ORL                   A,                 @R0
                           ADD                   A,                #01H
                           DA                    A
                           MOV                   R2,         A
                           ANL                   A,                 #0FH
                           MOV                   @R0,         A
                           MOV                   A,                 R2
                           ANL                   A,                 #0F0H
                           SWAP                  A
                           INC                   R0
                          MOV                   @R0,         A
                           RET
CLR0 :         MOV                   @R0,        #00H
                           DEC                   R0
                           MOV                   @R0,         #00H
                           RET
;键扫描子程序
KEY:           LCALL          KEYCL              ;调P1口数据处理子程序
               JZ             EXIT               ;没有键按下,转返回
                          LCALL          DISP               ;调显示子程序去抖动
                          LCALL          DISP
                           LCALL          KEYCL                      ;调P1口数据处理子程序
                           JZ             EXIT                ;没有键按下,转返回
                           MOV            B,                 20H     ;保存取反后的键值
KEYSF:         LCALL          KEYCL          ;调P1口数据处理子程序
               JZ             KEY1                ;键释放,转恢复键值
                           LCALL          DISP
                           LCALL          DISP                ;调显示子程序延时
                           LJMP           KEYSF                       ;等待释放
KEY1:          MOV            20H,                 B    ;键值送20H保存
EXIT:          RET
;子程序返回
;P1口数据处理子程序
KEYCL:   PUSH                 PSW                 ;保护现场
         CLR                  RS1                 ;改变当前寄存器组为组1
                  SETB                 RS0
                  MOV                          P1,         #0FFH   ;先向P1口写1
                  MOV                  A,                 P1      ;读P1口数据
                  CPL                  A                   ;P1口数据取反
                  MOV                  20H,         A       ;保存取反后的键值
                  CLR                    RS1                 ;恢复当前寄存器组为组0
                  CLR                  RS0
                  POP                  PSW                 ;恢复现场
                  RET                                      ;子程序返回
;显示子程序
;入口: 78H,79H,7AH,7BH,7CH,7DH,7EH,7FH,
DISP:   PUSH             DPH                     ;保护现场
         PUSH                  DPL
                  PUSH                 ACC
                  PUSH                 PSW
                  CLR                  RS1           ;改变当前寄存器组为组1
                  SETB         RS0
                  MOV          R1,         #78H            ;显示缓冲存储单元首地址
                  MOV                 R2,         #01H            ;从右至左显示
  MOV             R5,         #08H            ;循环次数,即驱动数码管的位数
DISP1:          MOV          A,                 @R1
                  MOV          DPTR,         #TAB
                  MOVC                A,                 @A+DPTR
                  MOV          P0,         A          ;送段控
                  MOV          P2,         R2         ;送位控
                  LCALL         DL                           ;延时1毫秒
                  MOV          A,                 R2         ;位控码送A
                  RL           A                             ;获得新的位控码
                  MOV          R2,         A          ;保存新的位控码
                  INC          R1                           ;获得新的显示缓冲单元地址
                  DJNZ         R5,         DISP1      ;循环没有结束则继续
DISP2:   POP          PSW                                           ;恢复现场
                  POP                 ACC              
                  POP          DPL
                  POP          DPH
                  RET
;延时1ms子程序(晶振频率12MHz)DL
DL:     MOV                  R7,                #01H
DL1:    MOV                  R6,                #8EH
DL0:    MOV                  R5,                #02H
        DJNZ                 R5,                $
        DJNZ                 R6,                DL0
        DJNZ                 R7,                DL1
        RET
                END

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

使用道具 举报

沙发
ID:96682 发表于 2020-11-8 15:48 来自手机 | 只看该作者
改段码或用反
回复

使用道具 举报

板凳
ID:96682 发表于 2020-11-8 15:53 来自手机 | 只看该作者
改段码或用反相器都可以
回复

使用道具 举报

地板
ID:68468 发表于 2020-11-8 20:01 | 只看该作者
佩服佩服,还用汇编写单片机程序。
段码求反就行。
回复

使用道具 举报

5#
ID:827883 发表于 2020-11-8 22:09 | 只看该作者
wc86110 发表于 2020-11-8 15:53
改段码或用反相器都可以

共阴极的段码是什么呀,网上没找到,这个程序有什么问题吗
回复

使用道具 举报

6#
ID:414556 发表于 2020-11-8 23:03 | 只看该作者
共阴可以把共阳的码段取反,前提是硬件对应的脚一致
回复

使用道具 举报

7#
ID:235200 发表于 2020-11-9 01:04 | 只看该作者
                 MOV          R1,         #78H            ;显示缓冲存储单元首地址
                  MOV                 R2,         #0FEH     ;此句修改 #01H            ;从右至左显示
  MOV             R5,         #08H            ;循环次数,即驱动数码管的位数
DISP1:          MOV          A,                 @R1
                  MOV          DPTR,         #TAB
                  MOVC                A,                 @A+DPTR
                  CPL           A         ;加这一条
                  MOV          P0,         A          ;送段控
                  MOV          P2,         R2         ;送位控
                  LCALL         DL                           ;延时1毫秒
                  MOV          A,                 R2         ;位控码送A
                  RL           A                             ;获得新的位控码
                  MOV          R2,         A          ;保存新的位控码
                  INC          R1                           ;获得新的显示缓冲单元地址
                  DJNZ         R5,         DISP1      ;循环没有结束则继续

按以上方式改2行就可以了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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