打印

如何实现啊?

[复制链接]
5197|48
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mugangzhu|  楼主 | 2009-12-14 13:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AC, TE, tc, hb
实现的功能如下:
芯片选用69P42,仿真使用IDE66软件中自带的软仿真
上电初始化用户寄存器,进入HALT模式等待外部按键中断唤醒(PORTD为输入端口PORTD.0-3分别接四个按键PORTC为输出口PORTC.0-3分别对应PORTC的四个输入口外接四个指示灯),外部一旦有按键中断其相应PORTC口的外接指示灯会闪亮(采用TIMER0作延时用设置有计时时间标志寄存器),按其他的按键则会关闭当前的输出,执行最后按下键的输出
程序如下:
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
;***************
;程序
;****************
               ORG       0000H
               JMP       REST
               ORG       0001H
               RTNI
               ORG       0002H
               JMP       TIMER0_ISP
               ORG       0003H
               RTNI
               ORG       0004H
               JMP       PORT_IST
;中断服务程序
PORT_IST:
               STA AC_BACK,00H
               ANDIM IRQ,1110B
               ORIM IE,0001B               
PORT_IST_END:
               LDA AC_BACK,00H
               RTNI                           
;****************************
;延时3S TM0中断服务子程序
;****************************
TIMER0_ISP:
              STA AC_BACK,00H
              ANDIM IRQ,1011B              
              SBIM  T0M_CT,01H
              BNZ TIMER0_END              
              LDI T0M_CT,0FH
              ADIM YS_1,01H
              SBI  YS_1,02H
              BNZ TIMER0_END
              LDI T0M_CT,0FH
              LDI T0M_1,0001B                           
TIMER0_END:   
              ORIM 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  YS_1,0FH
               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,00H
               LDI  YS_1,00H

               
;主程序
MAIN:                           
               LDI  PORTA,03H;
               LDI  PORTB,0CH;
               LDI  PORTD,0FH;打开上拉电阻使用下降沿中断
               NOP
               NOP
               NOP
               LDI   IRQ,00H               
               LDI  IE,0001B               
               HALT
               NOP
               NOP
               CALL  KEY_CK;检测按键状态   
KEY_CK:               
               LDA PORTD,00H
               STA TEMP,00H
               
               CALL DELAY
               LDA PORTD,00H
               SUB TEMP,00H
               BNZ MAIN
               EORIM TEMP,0FH
               STA   KEY_ST,00H              
               CALL DISP;输出显示
DISP:         
               CALL RS_4     
               LDA  KEY_ST,00H
               STA  PORTC,00H                                                                                                            
               ADI  T0M_1,0001B
               BA0  DISP;定时时间没到返回到HALT模式
               ANDIM PORTC,00H;关闭输出口
               ANDIM T0M_1,1110B;定时时间到了清定时时间到标志位
               LDI YS_1,00H                                                                        
               JMP MAIN              
DELAY:
                LDI CT1,03H
                LDI CT0,0EH
                SBIM CT0,01H
                BC $-1
                SBIM CT1,01H
                BC $-4
                RTNI
RS_4:
              ORIM IE,0100B
              RTNI                                                                       
                END
现在的问题是按下按键相应的输出只是延时一段时间不是闪亮的,而且必须当前的程序执行完其它的按键才会有效,我想问一下如果实现上面说的那些功能我该如何修改呢?
沙发
warm_ice| | 2009-12-14 13:55 | 只看该作者
要闪亮的话,通常需要利用中断程序来做,在中断中根据需要开关灯.

使用特权

评论回复
板凳
mugangzhu|  楼主 | 2009-12-14 13:59 | 只看该作者
谢谢啊
能否具体说一下呢?

使用特权

评论回复
地板
warm_ice| | 2009-12-14 14:08 | 只看该作者
你现在的做法是有按键才能将CPU从HALT模式唤醒,但你要闪灯,就是要亮-灭-亮-灭...重复,在没有按键的时候也要继续闪,所以这时你只能用中断来唤醒CPU,根据当前的状态对灯进行开关操作.

使用特权

评论回复
5
mugangzhu|  楼主 | 2009-12-14 15:00 | 只看该作者
要是用中断来唤醒的话,我那按键中断还能用吗?

使用特权

评论回复
6
warm_ice| | 2009-12-14 15:11 | 只看该作者
当然能用,你现在就是用端口中断唤醒的,当你确认有按键按下后,需要闪灯时,你再把定时中断打开,在定时中断中处理灯的亮灭.

使用特权

评论回复
7
mugangzhu|  楼主 | 2009-12-14 15:30 | 只看该作者
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
;***************
;程序
;****************
               ORG       0000H
               JMP       REST
               ORG       0001H
               RTNI
               ORG       0002H
               JMP       TIMER0_ISP
               ORG       0003H
               RTNI
               ORG       0004H
               JMP       PORT_IST
;中断服务程序
PORT_IST:
               STA AC_BACK,00H
               ANDIM IRQ,1110B
               ORIM IE,0001B               
PORT_IST_END:
               LDA AC_BACK,00H
               RTNI                           
;****************************
;延时3S TM0中断服务子程序
;****************************
TIMER0_ISP:
              STA AC_BACK,00H
              ANDIM IRQ,1011B              
              SBIM  T0M_CT,01H                                                      
              BNZ TIMER0_END
              LDI T0M_CT,0FH
              LDI T0M_1,0001B                           
TIMER0_END:   
              ORIM 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  YS_1,0FH
               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,00H
               LDI  YS_1,00H

               
;主程序
MAIN:                           
               LDI  PORTA,03H;
               LDI  PORTB,0CH;
               LDI  PORTD,0FH;打开上拉电阻使用下降沿中断
               NOP
               NOP
               NOP
               LDI   IRQ,00H               
               LDI  IE,0001B               
               HALT
               NOP
               NOP
               CALL  KEY_CK;检测按键状态   
KEY_CK:               
               LDA PORTD,00H
               STA TEMP,00H
               
               CALL DELAY
               LDA PORTD,00H
               SUB TEMP,00H
               BNZ MAIN
               EORIM TEMP,0FH
               STA   KEY_ST,00H
               CALL RS_4           
               CALL DISP;输出显示
DISP:                                                                                                                                                        
               LDA  T0M_1,00H
               BA0  RS_1                                                                                                                     
               JMP  RS_2      
DELAY:
                LDI CT1,03H
                LDI CT0,0EH
                SBIM CT0,01H
                BC $-1
                SBIM CT1,01H
                BC $-4
                RTNI
RS_4:
              ORIM IE,0100B
              RTNI
RS_1:
              ANDIM PORTC,00H;关闭输出口
              ANDIM T0M_1,1110B;定时时间到了清定时时间到标志位              
              JMP  DISP
RS_2:  
               LDA  KEY_ST,00H
               STA  PORTC,00H
               JMP DISP                                                                                             
                END  
我这样设计怎么实现不了啊,按键灯一直亮?

使用特权

评论回复
8
warm_ice| | 2009-12-14 15:48 | 只看该作者
你这样还是有问题,进入HALT前,你只开端口中断肯定不行了,不要用LDI  IE,0001B;因为你不知道此时定时中断是什么状态,你只能用ORIM  IE,0001B
这样才可以,你再试试.

使用特权

评论回复
9
mugangzhu|  楼主 | 2009-12-14 16:04 | 只看该作者
还是不行,用上面的示波器测着输出脚有低电平但时间很短,理论上说高低电平应该差不多才对,而且按键只有第一次按才有效

使用特权

评论回复
10
warm_ice| | 2009-12-14 16:29 | 只看该作者
呵呵,看来还是要我全说出来才行啊.本来是想提示你一下,你自己再想想就差不多了.

强烈建议你画程序的流程图,看你现在的程序,你的思路是不清楚的.画好流程图,如果你还不清楚怎么实现,我可以帮你指出问题点,甚至帮你写好程序.可以么?

使用特权

评论回复
11
mugangzhu|  楼主 | 2009-12-15 16:01 | 只看该作者
流程图.rar (3.15 KB) 这是我那个程序的流程图

使用特权

评论回复
12
iammercy| | 2009-12-16 08:58 | 只看该作者
你是想做灯闪烁的效果吗,这个很容易啊,你设置一个标志位,在Timer中断里面把这个标志位每隔一段时间内取反一次,例如每半秒就让这个标志位取反一次,然后主循环里面,如果判断到标志为为1,相应的灯亮,如果判断到标志位为0,相应的灯就蔑, 这样就能看到灯在闪烁了,闪烁的频率是1Hz

使用特权

评论回复
13
mugangzhu|  楼主 | 2009-12-16 09:22 | 只看该作者
谢谢啊,可是我上面那个程序错在哪里了啊?

使用特权

评论回复
14
warm_ice| | 2009-12-16 10:16 | 只看该作者
你这个流程图画了跟没画没什么区别,你如果把最后面的这个框里边的内容画详细了你应该就明白了.

你说"有输出打开TIMER0计时器开始计时,输出指示灯开始闪亮,亮灭时间采用TIMER0计时,如果有其他按键按下怎输出立即切换至最后一次按键有效"

你有没有想过"输出指示灯开始闪亮"这句话,要闪亮就是要隔段时间就要对相应的I/O口进行操作,你怎么保证每隔一段时间就能来改变I/O, 这个想清楚了,你就明白要怎么做了.

使用特权

评论回复
15
mugangzhu|  楼主 | 2009-12-17 12:49 | 只看该作者
新的流程图.rar (3.31 KB)

使用特权

评论回复
16
mugangzhu|  楼主 | 2009-12-17 12:50 | 只看该作者
程序如下:
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打开输出
              RTNI                                                                                                                              
                END
帮忙看下有什么错误

使用特权

评论回复
17
warm_ice| | 2009-12-17 14:51 | 只看该作者
看了一下您的程序,有几点想说一下:
1.您的基本思路是正确的.
2.定时中断中" SBIM  T0M_CT,01H
              SBI  T0M_CT,07H;分析定时时间是否允许打开输出
              BAZ  RS_4
              SBIM  T0M_CT,01H                                               
              BNZ TIMER0_END
       为何要T0M_CT减1会再判断是否为07H,我没看懂.
3.定时中断中跳转到RS_4没有问题,但RS_4执行完后,还是在定时中断中,这时不能直接用RTNI返回,而中要跳回TIMER0_END,正常退出定时中断,否则,按您的程序执行完后,由于IE没有被重新置起,不会再响应定时中断了.
4.RS_4是定时中断的一部分,最好放在一起.
5.以上请修改一下,看是否按您设计的方式进行

使用特权

评论回复
18
mugangzhu|  楼主 | 2009-12-17 15:56 | 只看该作者
2.定时中断中" SBIM  T0M_CT,01H
              SBI  T0M_CT,07H;分析定时时间是否允许打开输出
              BAZ  RS_4
              SBIM  T0M_CT,01H                                               
              BNZ TIMER0_END
       为何要T0M_CT减1会再判断是否为07H,我没看懂.
这样延时的时间更长一些,如果直接减07H的话,延时的时间不会短吗?

使用特权

评论回复
19
warm_ice| | 2009-12-17 16:01 | 只看该作者
我的意思是你T0M_CT减1后,判断它是否等于7,不等于时,又对T0M_CT减1,然后才判断.
当T0M_CT不等于8时,等于对T0M_CT一次减2.   我只是不明白这样设计的目的,不是说这有错误.

使用特权

评论回复
20
mugangzhu|  楼主 | 2009-12-17 16:17 | 只看该作者
你说这啊,我是想判断了07H后接原来的减下去,就是说从06H开始减,这样对吗?

使用特权

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

本版积分规则

70

主题

358

帖子

1

粉丝