打印

TIMER0这样用对吗?仿真时怎么看不出LED的循环两灭

[复制链接]
5702|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 mugangzhu 于 2009-9-24 08:24 编辑

LIST P=69P42
ROMSIZE=3072
;**********************************
;系统寄存器
;**********************************
IE   EQU  00H;中断使能标志寄存器
IRQ  EQU  01H;中断请求寄存器
T0M  EQU  02H;定时器0
T0L  EQU  04H;定时器0低4位
T0H  EQU  05H;定时器0高4位
PORTA EQU 08H
PORTB EQU 09H
PORTC EQU 0AH;按键PORTC.0取消,PORTC.1打开输出
PORTD EQU 0BH
PORTE EQU 0CH;输出PORT
TBR   EQU 0EH;查表寄存器
INX   EQU 0FH;索引寄存器
DPL   EQU 10H;查表指针低4位
DPM   EQU 11H;查表指针中3位
DPH   EQU 12H;查表指针高3位
PCCR  EQU 1AH;PORTC输入/输出控制寄存器
PECR  EQU 1CH;PORTE输入/输出控制寄存器
WDT   EQU 1FH;看门狗定时器
;***********************************
;用户寄存器
;**********************************
AC_BACK  EQU 30H;A备份寄存器
TEMP     EQU 31H;临时寄存器
TEMERL_0 EQU 32H;定时时间低4位
TEMERH_0 EQU 33H;定时时间高4位
CT0      EQU 34H
CT1      EQU 35H;延时用
KEY_ST   EQU 36H;键状态寄存器
;**********************************
;程序
;**********************************
                ORG  0000H
                JMP  RESET
                RTNI
                JMP TIMER_IST
                RTNI
                JMP  PORT_IST
;************************************
;PORT_IST中断服务子程序
;************************************
PORT_IST:               
               STA  AC_BACK,00H
               LDI  IRQ,00H
               ORIM IE,0001B
PORT_IST_END:
               LDA  AC_BACK,00H
               RTNI
;************************************
;TIMER_IST中断服务程序
;************************************
TIMER_IST:
              STA  AC_BACK,00H
              LDI  IRQ,00H
              ANDIM  IE,1011B
TIMER_IST_END:
              LDA  AC_BACK,00H
              RTNI                             
;************************************
;上电程序
;************************************
RESET:
              NOP
;-------------------------------------              
;清用户寄存器   
POWER_RESET:
              LDI  DPL,00H
              LDI  DPM,03H
              LDI  DPH,00H;从30H开始
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;到0BFH结束
;----------------------------------------
;初始化系统寄存器
              LDI T0L,0FH
              LDI T0H,0EH
              LDI T0M,00H
              LDI PORTC,00H
              LDI PCCR,00H;输入口
              LDI PORTE,00H
              LDI PECR,0FH;输出口
;主程序
MAIN:
;PORT_IST中断
PORT_INT_SET:
              LDI PORTA,03H
              LDI PORTB,0CH
              LDI PORTC,0FH
              LDI PORTD,0FH;打开上拉电阻使用下降沿中断
              NOP
              NOP          ;等待程序稳定
              LDI IRQ,00H
              LDI IE,0001B;允许PORT中断
              HALT
              NOP
              NOP
;*********************************************              
;检测按键状态
KEY_CK:
              LDA PORTC,00H;取PORTC按键值
              STA TEMP,00H;把按键值存放在临时寄存器当中
              CALL DELAY
              LDA PORTC,00H
              SUB TEMP,00H
              BNZ PORT_INT_SET               
              LDA TEMP, 00H                                                   
              BA0 KEY_CK_2
              JMP PORT_INT_SET              
KEY_CK_2:     

              ORIM PORTE,0111B
;*******************************
;打开TIMER0中断计时                           
;**********************************************
              LDI IRQ,00H
              ORIM IE,0100B
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP            
              ANDIM PORTE,08H
              LDI IRQ,00H
              ORIM IE,0100B
              NOP
              NOP            
              JMP KEY_CK            
;延时去抖动              
DELAY:                     
              LDI CT0,02H
              SBIM CT0,01H
              BC $-1
              RTNI  
;********************************************
              END
沙发
warm_ice| | 2009-9-23 14:10 | 只看该作者
你写程序之前先画一下流程图,这样才能做到思路清晰.
请你把流程图画好并贴上来,如果那时还有问题,我可帮你解决问题.

使用特权

评论回复
板凳
mugangzhu|  楼主 | 2009-9-23 15:05 | 只看该作者
成功了!!!谢谢啊!

使用特权

评论回复
地板
warm_ice| | 2009-9-23 16:33 | 只看该作者
本帖最后由 warm_ice 于 2009-9-23 17:44 编辑

3# mugangzhu
不错.

使用特权

评论回复
5
mugangzhu|  楼主 | 2009-9-23 17:27 | 只看该作者
不过,好像那个TIMER0定时器在程序中没有起到定时的作用??

使用特权

评论回复
6
mugangzhu|  楼主 | 2009-9-23 17:28 | 只看该作者
还有就是是不是用软仿真就不能用按键秒去抖动啊,用了之后接着就回到HALT模式了

使用特权

评论回复
7
warm_ice| | 2009-9-23 17:45 | 只看该作者
不过,好像那个TIMER0定时器在程序中没有起到定时的作用??
mugangzhu 发表于 2009-9-23 17:27

流程图画好了没有?画的过程就会考虑到这个问题.

使用特权

评论回复
8
warm_ice| | 2009-9-23 17:45 | 只看该作者
还有就是是不是用软仿真就不能用按键秒去抖动啊,用了之后接着就回到HALT模式了
mugangzhu 发表于 2009-9-23 17:28

可以用去抖动的.

使用特权

评论回复
9
mugangzhu|  楼主 | 2009-9-24 06:45 | 只看该作者
本帖最后由 mugangzhu 于 2009-9-24 08:25 编辑

什么流程图?就是上电进入HALT模式,等待PORT中断唤醒,有PORT中断时检测是开启按键按下还是取消按键按下,若是取消按键按下则返回,否则继续执行,
可是感觉用TIMER0定时没有起到作用啊

使用特权

评论回复
10
warm_ice| | 2009-9-24 13:26 | 只看该作者
什么流程图?就是上电进入HALT模式,等待PORT中断唤醒,有PORT中断时检测是开启按键按下还是取消按键按下,若是取消按键按下则返回,否则继续执行,
可是感觉用TIMER0定时没有起到作用啊 ...
mugangzhu 发表于 2009-9-24 06:45

就是把你这些流程一步一步的画出来,如果流程图画的好,再写程序就非常简单了.
TIMER0的用法我是跟你说过的.

使用特权

评论回复
11
mugangzhu|  楼主 | 2009-9-24 14:54 | 只看该作者
在上面那个程序的基础上有修改了一下,大致流程图是这样的
现在问题是必须长按取消按键才能回到HALT模式,不是按一下就回到HALT?????

流程图.png (16.49 KB )

流程图.png

使用特权

评论回复
12
warm_ice| | 2009-9-24 15:20 | 只看该作者
1.你能画流程图这是一个进步,同时我要说的是流程图要画的特点细,一步一步具体是怎么操作的.尤其是对于新手,这非常重要.
2.请将你的最新程序在1楼更新一下,不然我对不上你的程序和你的流程图.
3.以现在的程序来看,你所说的程序中的确认及取消键,只有确认键第1次有效果,且为PE口的3个口输出,然后任何按键就没有作用了,你所说的长按才能起到取消键的作用,怀疑是看门狗定时器起的作用,使程序复位了.

使用特权

评论回复
13
mugangzhu|  楼主 | 2009-9-24 15:25 | 只看该作者
不能更新了
LIST P=69P42
ROMSIZE=3072
;**********************************
;系统寄存器
;**********************************
IE   EQU  00H;中断使能标志寄存器
IRQ  EQU  01H;中断请求寄存器
T0M  EQU  02H;定时器0
T0L  EQU  04H;定时器0低4位
T0H  EQU  05H;定时器0高4位
PORTA EQU 08H
PORTB EQU 09H
PORTC EQU 0AH;按键PORTC.0取消,PORTC.1打开输出
PORTD EQU 0BH
PORTE EQU 0CH;输出PORT
TBR   EQU 0EH;查表寄存器
INX   EQU 0FH;索引寄存器
DPL   EQU 10H;查表指针低4位
DPM   EQU 11H;查表指针中3位
DPH   EQU 12H;查表指针高3位
PCCR  EQU 1AH;PORTC输入/输出控制寄存器
PECR  EQU 1CH;PORTE输入/输出控制寄存器
WDT   EQU 1FH;看门狗定时器
;***********************************
;用户寄存器
;**********************************
AC_BACK  EQU 30H;A备份寄存器
TEMP     EQU 31H;临时寄存器
TEMERL_0 EQU 32H;定时时间低4位
TEMERH_0 EQU 33H;定时时间高4位
CT0      EQU 34H
CT1      EQU 35H;延时用
KEY_ST   EQU 36H;键状态寄存器
CT2      EQU 37H
CT3      EQU 38H
CT4      EQU 39H
CT5      EQU 3AH
CT6      EQU 3BH
;**********************************
;程序
;**********************************
                ORG  0000H
                JMP  RESET
                RTNI
                JMP TIMER_IST
                RTNI
                JMP  PORT_IST
;************************************
;PORT_IST中断服务子程序
;************************************
PORT_IST:               
               STA  AC_BACK,00H
               LDI  IRQ,00H
               ORIM IE,0001B
PORT_IST_END:
               LDA  AC_BACK,00H
               RTNI
;************************************
;TIMER_IST中断服务程序
;************************************
TIMER_IST:
              STA  AC_BACK,00H
              LDI  IRQ,00H
              ANDIM  IE,1011B
TIMER_IST_END:
              LDA  AC_BACK,00H
              RTNI                             
;************************************
;上电程序
;************************************
RESET:
              NOP
;-------------------------------------              
;清用户寄存器   
POWER_RESET:
              LDI  DPL,00H
              LDI  DPM,03H
              LDI  DPH,00H;从30H开始
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;到0BFH结束
;----------------------------------------
;初始化系统寄存器
              LDI T0L,0FH
              LDI T0H,0EH
              LDI T0M,00H
              LDI PORTC,00H
              LDI PCCR,00H;输入口
              LDI PORTE,00H
              LDI PECR,0FH;输出口
;主程序
MAIN:
;PORT_IST中断
PORT_INT_SET:
              ANDIM PORTE,00H
              LDI PORTA,0FH
              LDI PORTB,0CH
              LDI PORTC,0FH
              LDI PORTD,0FH;打开上拉电阻使用下降沿中断
              NOP
              NOP          ;等待程序稳定
              LDI IRQ,00H
              LDI IE,0001B;允许PORT中断
              HALT
              NOP
              NOP
;*********************************************              
;检测按键状态
KEY_CK:
              LDA PORTC,00H;取PORTC按键值
              STA TEMP,00H;把按键值存放在临时寄存器当中
              CALL DELAY
              LDA PORTC,00H
              SUB TEMP,00H
              BNZ PORT_INT_SET               
              LDA TEMP, 00H                                                   
              BA0 KEY_CK_2
              JMP PORT_INT_SET
                                   
KEY_CK_2:                  
              ORIM PORTE,0001B
              CALL DELAY_1
              LDA PORTC,00H;取PORTC按键值
              STA TEMP,00H;把按键值存放在临时寄存器当中
              CALL DELAY
              LDA PORTC,00H               
              STA TEMP, 00H
              LDA TEMP,00H                                                   
              BA0 KEY_CK_3
              NOP
KEY_CK_3:
              EORIM PORTE,0011B
              CALL DELAY_1
              LDA PORTC,00H;取PORTC按键值
              STA TEMP,00H;把按键值存放在临时寄存器当中
              CALL DELAY
              LDA PORTC,00H
              STA TEMP, 00H
              LDA TEMP,00H                                      
              BA0 KEY_CK_4
              JMP PORT_INT_SET
              NOP
KEY_CK_4:
              EORIM PORTE,0110B
              CALL DELAY_1
              LDA PORTC,00H;取PORTC按键值
              STA TEMP,00H;把按键值存放在临时寄存器当中
              CALL DELAY
              LDA PORTC,00H
              STA TEMP, 00H
              LDA TEMP,00H                                      
              BA0 KEY_CK_5
              JMP PORT_INT_SET
              NOP
KEY_CK_5:
              EORIM PORTE,0011B
              CALL DELAY_1
              LDA PORTC,00H;取PORTC按键值
              STA TEMP,00H;把按键值存放在临时寄存器当中
              CALL DELAY
              LDA PORTC,00H
              STA TEMP, 00H
              LDA TEMP,00H                                      
              BA0 KEY_CK_6
              JMP PORT_INT_SET
              NOP
KEY_CK_6:
              EORIM PORTE,0111B
              CALL DELAY_1
              LDA PORTC,00H;取PORTC按键值
              STA TEMP,00H;把按键值存放在临时寄存器当中
              CALL DELAY
              LDA PORTC,00H
              STA TEMP, 00H
              LDA TEMP,00H                                    
              BA0 KEY_CK_7
              JMP PORT_INT_SET
              NOP
KEY_CK_7:
              EORIM PORTE,0111B
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1
              LDA PORTC,00H;取PORTC按键值
              STA TEMP,00H;把按键值存放在临时寄存器当中
              CALL DELAY
              LDA PORTC,00H
              STA TEMP, 00H
              LDA TEMP,00H                                    
              BA0 KEY_CK_8
              JMP PORT_INT_SET
              NOP
KEY_CK_8:
              EORIM PORTE,0111B
              NOP
              CALL DELAY_1
              CALL DELAY_1                          
              JMP  KEY_CK
                     
;延时去抖动              
DELAY:  
                                 
              LDI CT0,01H
              SBIM CT0,01H
              BC $-1
            
              
              RTNI  
DELAY_1:  
             LDI CT2,02H
             LDI CT3,0FH
             LDI CT4,0FH
             LDI CT5,0FH
             LDI CT6,0FH
             SBIM CT6,01H
             BC $-1
             SBIM CT5,01H
             BC $-4
             SBIM CT4,01H
             BC $-7
             SBIM CT3,01H
             BC $-0AH
             SBIM CT2,01H
             BC $-0DH
             RTNI            
;********************************************
              END     
程序中我没有用看门狗的

使用特权

评论回复
14
warm_ice| | 2009-9-24 15:37 | 只看该作者
关于输出时判断新按键的方式我觉得不合适,你看你的流程图,是说在输出的任何时刻有取消键就取消,以你的程序来看,假设你现在正在输出PE口的一种状态(因为有延时,所以有一段时间),这时按取消键,你的程序能扫描得到并处理么??你再好好想一想,按你流程图的说法(即任何时刻),通常这种事只有中断可以完成.

使用特权

评论回复
15
mugangzhu|  楼主 | 2009-9-24 15:42 | 只看该作者
是的,开始我就想到这种方式只有中断才可以完成的,但反复试了试还是不行,我就想每执行一步就检测一下按键,可是这样的结果是必须等到这一步执行完了按键才可以起到取消作用的啊

使用特权

评论回复
16
mugangzhu|  楼主 | 2009-9-24 16:27 | 只看该作者
检测按键部分该如何使用中断,我是真想不出来了,给指点指点吧

使用特权

评论回复
17
warm_ice| | 2009-9-24 16:32 | 只看该作者
是的,开始我就想到这种方式只有中断才可以完成的,但反复试了试还是不行,我就想每执行一步就检测一下按键,可是这样的结果是必须等到这一步执行完了按键才可以起到取消作用的啊 ...
mugangzhu 发表于 2009-9-24 15:42

那你就要把检测按键的任务交给端口中断来完成,在程序的全过程端口中断都要打开,有按键按下的时候就会产生端口中断,在中断程序中检测是哪个按键并设置标志,在主程序中根据标志来处理即可.
TIMER中断一般也是设置标志,然后在主程序中根据标志位进行处理.

使用特权

评论回复
18
mugangzhu|  楼主 | 2009-9-24 16:40 | 只看该作者
我有点不明白你的意思,可不可以借助上面的一段程序说明一下?谢谢啊

使用特权

评论回复
19
warm_ice| | 2009-9-24 16:48 | 只看该作者
我有点不明白你的意思,可不可以借助上面的一段程序说明一下?谢谢啊
mugangzhu 发表于 2009-9-24 16:40

程序就不结合了,结果结合起来说,就差不多把程序写好了,我只说一下思路,你自己来完成,这样才有意义.
端口中断在整个程序中都是打开的,这样就随时可以监控按键的产生,当有按键按下的时候,就会产生端口中断,这时程序会响应端口中断,即执行端口中断程序,在端口中断中,你可以将你判断是哪个按键的内容放进去,判断完按键后,设置一个标志(比如设置一个KEY_STATE的寄存器,当没有按键按下时,给它赋值为0,当只有确认键按下时,给它赋值 为3,当只有取消键按下时,给它赋值为A,当两个按键都按下的时候,给它赋值F),当中断执行后返回主程序时,主程序只需要来判断KEY_STATE这个寄存器的值就知道按键是状态了,主程序再根据按键的状态进行操作即可.

使用特权

评论回复
20
mugangzhu|  楼主 | 2009-9-24 16:55 | 只看该作者
上面不是有一个端口中断吗?用那个怎么不行?

使用特权

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

本版积分规则

70

主题

358

帖子

1

粉丝