打印

谢谢大家帮忙修改一下

[复制链接]
3014|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mugangzhu|  楼主 | 2009-9-27 07:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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
                RTNI
                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
                        
;************************************
;上电程序
;************************************
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_DUAN            
              LDA TEMP, 00H
              EORIM TEMP,0001B                                                                  
              BA0 PORT_DUAN
              BA1 PORT_DUAN
              LDI IE,0001B;允许PORT中断
                                   
KEY_CK_2:              
              ORIM PORTE,0001B
              CALL DELAY_1;PE0输出
              NOP
KEY_CK_3:
              EORIM PORTE,0011B
              CALL DELAY_1;PE1输出
              NOP
KEY_CK_4:
              EORIM PORTE,0110B
              CALL DELAY_1;PE3输出
              NOP
KEY_CK_5:
              EORIM PORTE,0011B
              CALL DELAY_1;PE0,1,3同时输出
              NOP
KEY_CK_6:
              EORIM PORTE,0111B
              CALL DELAY_1;关闭所有PE口输出
              NOP
KEY_CK_7:
              EORIM PORTE,0111B;打开所有PE口输出
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1
              NOP
KEY_CK_8:
              EORIM PORTE,0111B;关闭所有PE口输出
              NOP
              CALL DELAY_1
              CALL DELAY_1                          
              JMP  KEY_CK_2
                     
;延时去抖动              
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                                                                                      
我想在任意时刻按取消按键都回到HALT模式,谢谢大家帮忙修改一下
沙发
warm_ice| | 2009-9-27 11:51 | 只看该作者
你这个程序自己编译过没有??
PORT_DUAN在什么地方?

使用特权

评论回复
板凳
mugangzhu|  楼主 | 2009-9-28 18:54 | 只看该作者
哦,那个我改过就是为了时时监控按键的,
应该是这样的
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
                RTNI
                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
                        
;************************************
;上电程序
;************************************
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
              EORIM TEMP,0001B                                                                  
              BA0 PORT_INT_SET            
                                   
KEY_CK_2:              
              ORIM PORTE,0001B
              CALL DELAY_1;PE0输出

              NOP
KEY_CK_3:
              EORIM PORTE,0011B
              CALL DELAY_1;PE1输出

              NOP
KEY_CK_4:
              EORIM PORTE,0110B
              CALL DELAY_1;PE3输出

              NOP
KEY_CK_5:
              EORIM PORTE,0011B
              CALL DELAY_1;PE0,1,3同时输出

              NOP
KEY_CK_6:
              EORIM PORTE,0111B
              CALL DELAY_1;关闭所有PE口输出

              NOP
KEY_CK_7:
              EORIM PORTE,0111B;打开所有PE口输出
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1

              NOP
KEY_CK_8:
              EORIM PORTE,0111B;关闭所有PE口输出
              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                                                                                      
不过改来改去还是没有改成功的啊?所以求帮助给改一下

使用特权

评论回复
地板
warm_ice| | 2009-9-29 09:48 | 只看该作者
你这个程序我之前已经给你说的很详细了,就差一条一条语句写出来了,你还不清楚么??
你只需要将按键检测的程序放到口中断程序中去,根据按键的状态(按下或未按下)设置一个标志寄存器,待中断程序执行完成后,在你PE输出的过程中读取那个标志寄存器,进行处理即可.

使用特权

评论回复
5
mugangzhu|  楼主 | 2009-9-29 22:04 | 只看该作者
本帖最后由 mugangzhu 于 2009-9-29 22:11 编辑

成功了!为什么这样就可以啊???
;************************************
ORT_IST中断服务子程序
;************************************
PORT_IST:               
               STA  AC_BACK,00H
               LDI  IRQ,00H
               ORIM IE,0001B
               LDA PORTC,00H;取PORTC按键值
          STA TEMP,00H;把按键值存放在临时寄存器当中
          CALL DELAY
              LDA PORTC,00H
              SUB TEMP,00H
              BNZ PORT_INT_SET            
              LDA TEMP, 00H
              EORIM TEMP,0001B                                                                  
              BA0 PORT_INT_SET            
PORT_IST_END:
               LDA  AC_BACK,00H
               RTNI
这样和以前那个程序区别在哪里?

使用特权

评论回复
6
mugangzhu|  楼主 | 2009-9-30 06:59 | 只看该作者
本帖最后由 mugangzhu 于 2009-9-30 07:03 编辑

还有一个问题就是如果在这个程序里沃采用TIMER定时的话是不是采用中断的形式??
可不可以子程序中断形式的延时???

使用特权

评论回复
7
mugangzhu|  楼主 | 2009-9-30 07:12 | 只看该作者
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_0_IST
                RTNI
                JMP  PORT_IST
;************************************
;PORT_IST中断服务子程序
;************************************
PORT_IST:               
               STA  AC_BACK,00H
               EORIM  IRQ,0001B
               ORIM IE,0001B
               LDA PORTC,00H;取PORTC按键值
               STA TEMP,00H;把按键值存放在临时寄存器当中
               CALL DELAY
               LDA PORTC,00H
               SUB TEMP,00H
               BNZ PORT_INT_SET         
               LDA TEMP, 00H
               EORIM TEMP,0001B                                                                  
               BA0 PORT_INT_SET
PORT_IST_END:
               LDA  AC_BACK,00H
               RTNI
;**********************************
;TIMER0中断服务程序
;*********************************
TIMER_0_IST:
             STA AC_BACK,00H
             EORIM IRQ,0100B
             ORIM IE,0100B
TIMER_0_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 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_2:              
              ORIM PORTE,0001B
              CALL DELAY_2;PE0输出

              NOP
KEY_CK_3:
              EORIM PORTE,0011B
              CALL DELAY_1;PE1输出

              NOP
KEY_CK_4:
              EORIM PORTE,0110B
              CALL DELAY_1;PE3输出

              NOP
KEY_CK_5:
              EORIM PORTE,0011B
              CALL DELAY_1;PE0,1,3同时输出

              NOP
KEY_CK_6:
              EORIM PORTE,0111B
              CALL DELAY_1;关闭所有PE口输出

              NOP
KEY_CK_7:
              EORIM PORTE,0111B;打开所有PE口输出
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1

              NOP
KEY_CK_8:
              EORIM PORTE,0111B;关闭所有PE口输出
              NOP
              CALL DELAY_1
              CALL DELAY_1                          
              JMP  KEY_CK_2                     
;延时去抖动              
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
DELAY_2:
              LDI T0L,00H??????????????
              LDI T0H,00H???????????
              LDI T0M,00H?????????
              LDI IE,0101B               ???????????????                    
;********************************************
              END                                                                                
上面这个延时怎么不能实现功能?

使用特权

评论回复
8
warm_ice| | 2009-9-30 10:13 | 只看该作者
本帖最后由 warm_ice 于 2009-10-15 09:44 编辑
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 1AHORTC输入/输出控制寄存器
PECR EQU 1CHORTE输入/输出控制寄存器
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
KEY_STATE EQU 3CH ;记录按键状态,00H为无按键,0AH为取消键,05H为确认键
;**********************************
;程序
;**********************************
ORG 0000H
JMP RESET
RTNI
RTNI
RTNI
JMP PORT_IST
;************************************
ORT_IST中断服务子程序
;************************************
PORT_IST:
STA AC_BACK,00H
LDI IRQ,00H
;检测按键状态
KEY_CK:
LDA PORTC,00H;取PORTC按键值
STA TEMP,00H;把按键值存放在临时寄存器当中
CALL DELAY
LDA PORTC,00H
SUB TEMP,00H
BNZ KEY_CK99
LDA TEMP, 00H
EORIM TEMP,0001B
BA0 KEY_CK99
LDI KEY_STATE,0AH;取消键
BA1 KEY_CK99
LDI KEY_STATE,05H;确认键
JMP PORT_IST_END
KEY_CK99:
LDI KEY_STATE,00H ;无按键状态
PORT_IST_END:
ORIM IE,0001B
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:
ORT_IST中断
PORT_INT_SET:
LDI PORTE,00H
LDI PORTA,0FH
LDI PORTB,0CH
LDI PORTC,0FH
LDI PORTD,0FH;打开上拉电阻使用下降沿中断
NOP
NOP ;等待程序稳定
LDI IE,0001B;允许PORT中断
NOP
HALT
NOP
NOP
;*********************************************
KEY_CHECK:
LDA KEY_STATE,00H ;判断有无按键按下,无按键,返回等待状态
BAZ PORT_INT_SET
SBI KEY_STATE,0AH ;判断取消键是否按下,按下取消键返回
BAZ PORT_INT_SET
SBI KEY_STATE,05H ;判断确认键是否按下,按下进行输出,否则返回
BNZ PORT_INT_SET
KEY_CK_2:
LDI PORTE,0001B
CALL DELAY_1E0输出

NOP
KEY_CK_3:
SBI KEY_STATE,0AH ;判断取消键是否按下,按下取消键返回
BAZ PORT_INT_SET
LDI PORTE,0010B
CALL DELAY_1E1输出

NOP
KEY_CK_4:
SBI KEY_STATE,0AH ;判断取消键是否按下,按下取消键返回
BAZ PORT_INT_SET
LDI PORTE,1000B
CALL DELAY_1E3输出

NOP
KEY_CK_5:
SBI KEY_STATE,0AH ;判断取消键是否按下,按下取消键返回
BAZ PORT_INT_SET
LDI PORTE,1011B
CALL DELAY_1E0,1,3同时输出

NOP
KEY_CK_6:
SBI KEY_STATE,0AH ;判断取消键是否按下,按下取消键返回
BAZ PORT_INT_SET
LDI PORTE,0000B
CALL DELAY_1;关闭所有PE口输出

NOP
KEY_CK_7:
SBI KEY_STATE,0AH ;判断取消键是否按下,按下取消键返回
BAZ PORT_INT_SET
LDI PORTE,0111B;打开所有PE口输出
CALL DELAY_1
CALL DELAY_1
CALL DELAY_1
CALL DELAY_1
CALL DELAY_1
CALL DELAY_1

NOP
KEY_CK_8:
SBI KEY_STATE,0AH ;判断取消键是否按下,按下取消键返回
BAZ PORT_INT_SET
LDI PORTE,0000B;关闭所有PE口输出
NOP
CALL DELAY_1
CALL DELAY_1
JMP PORT_INT_SET

;延时去抖动
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
初步帮你改造成这样,可以实现确认键,取消键的功能,但取消键还不是实时确认的,只有在一个输出段输出完成后才会响应,要实现这时的响应取消键,还要进行改造,主要从定时器的应用入手.

使用特权

评论回复
9
hbchengbo| | 2009-9-30 10:15 | 只看该作者
打扰下各位。推荐一款适用的单片机学习板。本学习板是利用低功耗MSP430F149单片机为核心,充分利用其资源。利用并口下载,USB供电,集成了8个LED,8个数码管,4*4按键,三个独立按键,SD卡,SIM卡,IR接口,485总线,RS232总线,CAN总线,USB总线,继电器,蜂鸣器,温度传感器(DS18B20),,时钟芯片(DS1302),FLASH(29C020),EEPROM(24CO2),LCD(LCD1602,LCD12864接口)和扩展接口。配有USB线及全面完整的学习光盘。售价200元,包邮寄。如有意向,请联系:13162302305.程波。谢谢

使用特权

评论回复
10
刘夯| | 2009-10-13 17:13 | 只看该作者
路过!!
厉害!!!!
我使用c的;
感觉你们好厉害!】
能说一下写汇编程序的经验吗?、
我在学汇编

使用特权

评论回复
11
warm_ice| | 2009-10-13 17:18 | 只看该作者
路过!!
厉害!!!!
我使用c的;
感觉你们好厉害!】
能说一下写汇编程序的经验吗?、
我在学汇编
刘夯 发表于 2009-10-13 17:13

网上很多这方面的书,您可以找一本来看看.
不过,做程序员是个辛苦活,呵呵.

使用特权

评论回复
12
mugangzhu|  楼主 | 2009-10-14 20:38 | 只看该作者
你改的这个程序不能实现这个功能了,按开启键连输出都没有,还有我想咨询一下这个程序中如何采用TIMER0做延时呢?我试了好几次都不行?可不可以以上面这个程序给举个例子呢。

使用特权

评论回复
13
warm_ice| | 2009-10-15 09:46 | 只看该作者
你改的这个程序不能实现这个功能了,按开启键连输出都没有,还有我想咨询一下这个程序中如何采用TIMER0做延时呢?我试了好几次都不行?可不可以以上面这个程序给举个例子呢。 ...
mugangzhu 发表于 2009-10-14 20:38

不会吧,你外围的按键是怎么接的??
TIMER0定延时,先给它设置一个定时的时间,比如100MS,这样要延时1秒,只需要10次TIMER0中断时间即可.

使用特权

评论回复
14
mugangzhu|  楼主 | 2009-10-16 21:07 | 只看该作者
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_0_IST
                RTNI
                JMP  PORT_IST
;************************************
;PORT_IST中断服务子程序
;************************************
PORT_IST:               
               STA  AC_BACK,00H
               LDI  IRQ,00H
               ORIM IE,0001B
               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
PORT_IST_END:
               LDA  AC_BACK,00H
               RTNI
;**********************************
;TIMER0中断服务程序
;*********************************
TIMER_0_IST:
             STA AC_BACK,00H
             LDI IRQ,0000B
             ORIM IE,0100B
TIMER_0_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 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_2:              
              ORIM PORTE,0001B
              CALL DELAY_2;PE0输出??????????

              NOP
KEY_CK_3:
              EORIM PORTE,0011B
              CALL DELAY_1;PE1输出

              NOP
KEY_CK_4:
              EORIM PORTE,0110B
              CALL DELAY_1;PE3输出

              NOP
KEY_CK_5:
              EORIM PORTE,0011B
              CALL DELAY_1;PE0,1,3同时输出

              NOP
KEY_CK_6:
              EORIM PORTE,0111B
              CALL DELAY_1;关闭所有PE口输出

              NOP
KEY_CK_7:
              EORIM PORTE,0111B;打开所有PE口输出
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1
              CALL DELAY_1

              NOP
KEY_CK_8:
              EORIM PORTE,0111B;关闭所有PE口输出
              NOP
              CALL DELAY_1
              CALL DELAY_1                          
              JMP  KEY_CK_2                     
;延时去抖动              
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
DELAY_2:                         ???????????????
              LDI T0L,00H
              LDI T0H,00H
              LDI T0M,00H
              LDI IRQ,00H
              LDI IE,0100B                                   
;********************************************
              END                                                                  
上面这个怎么不能延时,请指教一下该如何修改啊

使用特权

评论回复
15
warm_ice| | 2009-10-19 10:55 | 只看该作者
LIST P=69P42
ROMSIZE=3072
;**********************************
;系统寄存器
;**********************************
IE   EQU  00H;中断使能标志寄存器
IRQ  EQU  01H;中断请求寄存器
T0M  EQU  02H;定时器0
T0L  E ...
mugangzhu 发表于 2009-10-16 21:07


假设现在是8点,你有事要忙,但9点钟要准时出门,所以用闹钟订了一下时间,在8点到9点间您在做事,当时间到了9点,闹钟会响铃提醒您时间到了,这时,您就必需放下手上的事外出.

请您仔细体会一下上面的例子,其实TIMER定时也是一个道理.
我提醒一下您的程序中DELAY_2为什么不能实现:
1.您在DELAY_2中初始化TIMER寄存器,然后打开TIMER计时,但是您知道什么时候计时时间到了么?(就像我举的例子中如果闹钟不响铃,您定时了但是有用么?)
2.您在处理各个中断时,对于IRQ及IE,请只清除本中断对应的IRQ的位置,而不能全部清除.

使用特权

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

本版积分规则

70

主题

358

帖子

1

粉丝