打印

如何实现啊?

[复制链接]
楼主: mugangzhu
手机看帖
扫描二维码
随时随地手机跟帖
21
warm_ice| | 2009-12-17 16:30 | 只看该作者 回帖奖励 |倒序浏览
无所谓对不对,同样的功能你可以把它写的很简单,也可以写的很复杂,只要达到了您的设计要求即可.
现在程序是否还有问题?

使用特权

评论回复
22
mugangzhu|  楼主 | 2009-12-17 17:11 | 只看该作者

D

本帖最后由 mugangzhu 于 2009-12-17 17:15 编辑

呵呵,谢谢啊,还是不能实现亮灭的,我就是不知道为什么不行,查了应该没有问题了啊
LIST P=69P42
ROMSIZE=3072
;*******************************
;系统寄存器
;********************************
IE  EQU 00H
IRQ EQU 01H
TM0 EQU 02H
T0L EQU 04H
T0H EQU 05H
PORTA EQU 08H
PORTB EQU 09H
PORTC EQU 0AH;输出口
PORTD EQU 0BH;输入口
TBR   EQU 0EH
INX   EQU 0FH
DPL   EQU 10H
DPM   EQU 11H
DPH   EQU 12H
PDCR  EQU 1BH
PCCR  EQU 1AH
T0    EQU 1EH
WDT   EQU 1FH
;**************
;用户定义寄存器
;**************
AC_BACK EQU 30H
TEMP    EQU 31H
CT1     EQU 32H;
CT0     EQU 33H;延时用寄存器
KEY_ST  EQU 34H;键状态
T0M_CT  EQU 35H;计时用3s
T0M_CT_1 EQU 36H
T0M_CT_2 EQU 37H
T0M_1    EQU 38H;bit0=1关闭输出=0开启输出
YS_1     EQU 39H
YS_2     EQU 3AH
YS_3     EQU 3BH
;***************
;程序
;****************
               ORG       0000H
               JMP       REST               
               RTNI               
               JMP       TIMER0_ISP               
               RTNI               
               RTNI                        
;****************************
;延时3S TM0中断服务子程序
;****************************
TIMER0_ISP:
              STA AC_BACK,00H
              ANDIM IRQ,1011B              
              SBIM  T0M_CT,01H
              SBI  T0M_CT,07H;分析定时时间是否允许打开输出
              BAZ  RS_4
              SBIM  T0M_CT,01H                                               
              BNZ TIMER0_END
              LDI T0M_CT,0FH
              LDI T0M_1,0001B;输出状态标志位置1关闭输出                           
TIMER0_END:   
              LDI IE,0100B                        
              LDA AC_BACK,00H
              RTNI                        
;****************
;上电初始化
;*****************
REST:
               NOP
               NOP            
               LDI  DPL,00H
               LDI  DPM,03H
               LDI  DPH,00H               
POWER_RESET_1:
               LDI  INX,00H
               ADIM DPL,01H
               LDI  TEMP,00H
               ADCM DPM,00H
               BA3  POWER_RESET_2
               JMP  POWER_RESET_3
POWER_RESET_2:
               ADIM DPH,01H
POWER_RESET_3:
               SBI  DPH,01H
               BNZ  POWER_RESET_1
               SBI  DPM,04H
               BNZ  POWER_RESET_1              
               CALL XTJCQ_IST              ;初始化系统寄存器
XTJCQ_IST:
               LDI  PORTD,00H
               LDI  PDCR,00H;输入口
               LDI  PORTC,00H
               LDI  PCCR,0FH;输出口                                            
               LDI  T0,00H;选择外部时钟
               LDI  T0L,0FH
               LDI  T0H,0EH
               LDI  T0M_CT,0FH;
               LDI  TM0,00H; 2048分频比
               LDI  T0M_1,01H
               LDI  PORTD,0FH;使用低电平按键有效
               LDI  YS_1,0FH              
               LDI IE,0100B
               
                                       
;主程序
MAIN:         
                     
               NOP
               NOP
               LDA PORTD,00H
               STA TEMP,00H
               CALL DELAY
               LDA PORTD,00H
               SUB TEMP,00H
               BNZ  RS_1                                                                           
               SBI   TEMP,0FH
               BNZ   RS_3     ;有新的按键按下                                                                                                                                                                                                  
               LDA  T0M_1,00H
               BA0  RS_1                                                                                                                     
               JMP  RS_2      
DELAY:
                LDI CT1,01H
                LDI CT0,0FH
                SBIM CT0,01H
                BC $-1
                SBIM CT1,01H
                BC $-4
                RTNI
RS_1:
              ANDIM PORTC,00H;关闭输出口
              ANDIM T0M_1,1000B;清输出状态标志           
              JMP  MAIN
RS_2:                 
              LDA YS_1,00H
              STA YS_2,00H
              EORIM YS_2,0FH
              STA   PORTC,00H
              JMP MAIN
RS_3:      
              LDA   TEMP,00H
              STA   YS_1,00H
              LDA   YS_1,00H
              STA   YS_3,00H            
              EORIM YS_3,0FH              
              STA   PORTC,00H
              JMP   MAIN
RS_4:         
              LDI   T0M_1,00H;输出状态标志位置0打开输出
              JMP TIMER0_END                                                                                                                              
                END

使用特权

评论回复
23
warm_ice| | 2009-12-17 17:32 | 只看该作者
用示波器抓一下输出口的波型上来看看.

使用特权

评论回复
24
mugangzhu|  楼主 | 2009-12-18 12:04 | 只看该作者
我用示波器看了,按下按键对应的输出口全是高电平啊

使用特权

评论回复
25
warm_ice| | 2009-12-18 12:09 | 只看该作者
那你可以在输出低电平的地方设置断点,看是否会执行到此.如果不能执行,你再在确认按键后设置断点,停下后再单步执行,看看标志位或是中断是否正常.

使用特权

评论回复
26
mugangzhu|  楼主 | 2009-12-18 12:29 | 只看该作者
可以执行到输出低电平的位置啊,太奇怪了啊

使用特权

评论回复
27
mugangzhu|  楼主 | 2009-12-18 13:04 | 只看该作者
还有一点我不明白,为什么
TIMER0_END:   
              LDI IE,0100B                        
              LDA AC_BACK,00H
              RTNI         执行完之后返回到

DELAY:
                LDI CT1,01H
                LDI CT0,0FH
                SBIM CT0,01H
                BC $-1
                SBIM CT1,01H
                BC $-4
                RTNI
中的BC $-1这一步了?????

使用特权

评论回复
28
warm_ice| | 2009-12-18 13:29 | 只看该作者
可以执行到输出低电平的位置啊,太奇怪了啊
mugangzhu 发表于 2009-12-18 12:29

能输出低电平的话,那就看一下是否下次又变成高电平了,如果是这样,在外边用示波器抓波型就只有高电平了.

使用特权

评论回复
29
warm_ice| | 2009-12-18 13:31 | 只看该作者
还有一点我不明白,为什么
TIMER0_END:   
              LDI IE,0100B                        
              LDA AC_BACK,00H
              RTNI         执行完之后返回到

DELAY:
                LDI CT1,0 ...
mugangzhu 发表于 2009-12-18 13:04

问这个问题,说明你不明白什么是中断.

主程序在按顺序执行,在有中断产生时,中断主程序的执行,插入中断服务程序,中断服务程序执行完成后,再返回到主程序原执行点继续执行.

使用特权

评论回复
30
mugangzhu|  楼主 | 2009-12-18 15:05 | 只看该作者
是啊,可是中断不是从那地方开始啊?

使用特权

评论回复
31
warm_ice| | 2009-12-18 15:12 | 只看该作者
是啊,可是中断不是从那地方开始啊?
mugangzhu 发表于 2009-12-18 15:05

中断是从任何地方开始的.
一般来说,中断如果固定从哪个地方开始,就不叫中断了.

使用特权

评论回复
32
mugangzhu|  楼主 | 2009-12-18 16:32 | 只看该作者
呵呵,谢谢啊,可是我的那个小程序你觉得问题出现在什么地方,还是不能实现功能啊

使用特权

评论回复
33
warm_ice| | 2009-12-18 16:38 | 只看该作者
既然你的程序能运行在输出低电平,那你就在程序停下后,在输出低电平和输出高电平的地方各设置一个断点,看下次来是运行到输出低电平还是输出高电平,如果是运行到输出高电平的地方,那就说明你的程序逻辑还有些问题.
也就是我让你画详细流程图的原因.

使用特权

评论回复
34
mugangzhu|  楼主 | 2009-12-18 16:51 | 只看该作者
可是我设置断点,高电平和低电平都可以运行到得啊,可是整个程序跑起来输出就看不到低电平了呢,太奇怪了啊

使用特权

评论回复
35
warm_ice| | 2009-12-18 16:59 | 只看该作者
假设低电平只显示0.01S,你能看得到么?
你要保证低电平输出一段时间才行.而不是只输出一下就OK了.
我在33楼让你做的也就是说检查程序是否能保证输出低电平一段时间,而不是只输出一下低电平.

使用特权

评论回复
36
mugangzhu|  楼主 | 2009-12-18 17:05 | 只看该作者
就算他说出0.01S那用上面的示波器应该能测出来吧,可是上面连一点低电平都没有,应该根本就没有低电平输出的时候,还有就是我在低电平输出时设置断点运行程序可以执行低电平这段程序,可是整个程序运行起来输出缺看不到有低电平输出的时候,我感觉有矛盾啊,但分析了一下感觉程序没有问题啊

使用特权

评论回复
37
warm_ice| | 2009-12-18 17:12 | 只看该作者
那就简单了,断点停在输出低电平的位置时,执行完输出低电平的指令,拿万用表测量一下,输出的是低电平还是高电平.如果是低电平那就正常,如果是高电平那就是有问题.不是程序设置有问题,就是外部电路有问题.

使用特权

评论回复
38
mugangzhu|  楼主 | 2009-12-18 17:14 | 只看该作者
你说这样啊,我现在没有仿真工具,只能用上面的软仿真,也没有电路,只是在软仿真里设置四个输入按键,四个输出指示灯,难道这样就不能仿真出程序的实际应用功能吗?

使用特权

评论回复
39
warm_ice| | 2009-12-18 17:24 | 只看该作者
软件仿真+虚拟设备也一样可以看到状态,你在输出低电平指令上设置断点,初始化程序再全速运行,当停在断点处时,看一下虚拟设备的相应口是否为低电平.

另外,你要注意一下不要把虚拟设备中的端口设置错误,上下拉电阻也要接正确.
如果还有问题,建议你站内发短消息,将您的联系方式给我,电话沟通吧,这样太累了.

使用特权

评论回复
40
mugangzhu|  楼主 | 2009-12-22 09:21 | 只看该作者
呵呵,已经成功了,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则