谢谢大家帮忙修改一下

[复制链接]
 楼主| 发表于 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模式,谢谢大家帮忙修改一下
发表于 2009-9-27 11:51 | 显示全部楼层
你这个程序自己编译过没有??
PORT_DUAN在什么地方?
 楼主| 发表于 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                                                                                      
不过改来改去还是没有改成功的啊?所以求帮助给改一下
发表于 2009-9-29 09:48 | 显示全部楼层
你这个程序我之前已经给你说的很详细了,就差一条一条语句写出来了,你还不清楚么??
你只需要将按键检测的程序放到口中断程序中去,根据按键的状态(按下或未按下)设置一个标志寄存器,待中断程序执行完成后,在你PE输出的过程中读取那个标志寄存器,进行处理即可.
 楼主| 发表于 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
这样和以前那个程序区别在哪里?
 楼主| 发表于 2009-9-30 06:59 | 显示全部楼层
本帖最后由 mugangzhu 于 2009-9-30 07:03 编辑

还有一个问题就是如果在这个程序里沃采用TIMER定时的话是不是采用中断的形式??
可不可以子程序中断形式的延时???
 楼主| 发表于 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                                                                                
上面这个延时怎么不能实现功能?
发表于 2009-9-30 10:13 | 显示全部楼层
本帖最后由 warm_ice 于 2009-10-15 09:44 编辑
  1. LIST P=69P42
  2. ROMSIZE=3072
  3. ;**********************************
  4. ;系统寄存器
  5. ;**********************************
  6. IE EQU 00H;中断使能标志寄存器
  7. IRQ EQU 01H;中断请求寄存器
  8. T0M EQU 02H;定时器0
  9. T0L EQU 04H;定时器0低4位
  10. T0H EQU 05H;定时器0高4位
  11. PORTA EQU 08H
  12. PORTB EQU 09H
  13. PORTC EQU 0AH;按键PORTC.0取消,PORTC.1打开输出
  14. PORTD EQU 0BH
  15. PORTE EQU 0CH;输出PORT
  16. TBR EQU 0EH;查表寄存器
  17. INX EQU 0FH;索引寄存器
  18. DPL EQU 10H;查表指针低4位
  19. DPM EQU 11H;查表指针中3位
  20. DPH EQU 12H;查表指针高3位
  21. PCCR EQU 1AHORTC输入/输出控制寄存器
  22. PECR EQU 1CHORTE输入/输出控制寄存器
  23. WDT EQU 1FH;看门狗定时器
  24. ;***********************************
  25. ;用户寄存器
  26. ;**********************************
  27. AC_BACK EQU 30H;A备份寄存器
  28. TEMP EQU 31H;临时寄存器
  29. TEMERL_0 EQU 32H;定时时间低4位
  30. TEMERH_0 EQU 33H;定时时间高4位
  31. CT0 EQU 34H
  32. CT1 EQU 35H;延时用
  33. KEY_ST EQU 36H;键状态寄存器
  34. CT2 EQU 37H
  35. CT3 EQU 38H
  36. CT4 EQU 39H
  37. CT5 EQU 3AH
  38. CT6 EQU 3BH
  39. KEY_STATE EQU 3CH ;记录按键状态,00H为无按键,0AH为取消键,05H为确认键
  40. ;**********************************
  41. ;程序
  42. ;**********************************
  43. ORG 0000H
  44. JMP RESET
  45. RTNI
  46. RTNI
  47. RTNI
  48. JMP PORT_IST
  49. ;************************************
  50. ORT_IST中断服务子程序
  51. ;************************************
  52. PORT_IST:
  53. STA AC_BACK,00H
  54. LDI IRQ,00H
  55. ;检测按键状态
  56. KEY_CK:
  57. LDA PORTC,00H;取PORTC按键值
  58. STA TEMP,00H;把按键值存放在临时寄存器当中
  59. CALL DELAY
  60. LDA PORTC,00H
  61. SUB TEMP,00H
  62. BNZ KEY_CK99
  63. LDA TEMP, 00H
  64. EORIM TEMP,0001B
  65. BA0 KEY_CK99
  66. LDI KEY_STATE,0AH;取消键
  67. BA1 KEY_CK99
  68. LDI KEY_STATE,05H;确认键
  69. JMP PORT_IST_END
  70. KEY_CK99:
  71. LDI KEY_STATE,00H ;无按键状态
  72. PORT_IST_END:
  73. ORIM IE,0001B
  74. LDA AC_BACK,00H
  75. RTNI

  76. ;************************************
  77. ;上电程序
  78. ;************************************
  79. RESET:
  80. NOP
  81. ;-------------------------------------
  82. ;清用户寄存器
  83. POWER_RESET:
  84. LDI DPL,00H
  85. LDI DPM,03H
  86. LDI DPH,00H;从30H开始
  87. POWER_RESET_1:
  88. LDI INX,00H
  89. ADIM DPL,01H
  90. LDI TEMP,00H
  91. ADCM DPM,00H
  92. BA3 POWER_RESET_2
  93. JMP POWER_RESET_3
  94. POWER_RESET_2:
  95. ADIM DPH,01H
  96. POWER_RESET_3:
  97. SBI DPH,01H
  98. BNZ POWER_RESET_1
  99. SBI DPM,04H
  100. BNZ POWER_RESET_1;到0BFH结束
  101. ;----------------------------------------
  102. ;初始化系统寄存器
  103. LDI T0L,0FH
  104. LDI T0H,0EH
  105. LDI T0M,00H
  106. LDI PORTC,00H
  107. LDI PCCR,00H;输入口
  108. LDI PORTE,00H
  109. LDI PECR,0FH;输出口
  110. ;主程序
  111. MAIN:
  112. ORT_IST中断
  113. PORT_INT_SET:
  114. LDI PORTE,00H
  115. LDI PORTA,0FH
  116. LDI PORTB,0CH
  117. LDI PORTC,0FH
  118. LDI PORTD,0FH;打开上拉电阻使用下降沿中断
  119. NOP
  120. NOP ;等待程序稳定
  121. LDI IE,0001B;允许PORT中断
  122. NOP
  123. HALT
  124. NOP
  125. NOP
  126. ;*********************************************
  127. KEY_CHECK:
  128. LDA KEY_STATE,00H ;判断有无按键按下,无按键,返回等待状态
  129. BAZ PORT_INT_SET
  130. SBI KEY_STATE,0AH ;判断取消键是否按下,按下取消键返回
  131. BAZ PORT_INT_SET
  132. SBI KEY_STATE,05H ;判断确认键是否按下,按下进行输出,否则返回
  133. BNZ PORT_INT_SET
  134. KEY_CK_2:
  135. LDI PORTE,0001B
  136. CALL DELAY_1E0输出

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

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

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

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

  161. NOP
  162. KEY_CK_7:
  163. SBI KEY_STATE,0AH ;判断取消键是否按下,按下取消键返回
  164. BAZ PORT_INT_SET
  165. LDI PORTE,0111B;打开所有PE口输出
  166. CALL DELAY_1
  167. CALL DELAY_1
  168. CALL DELAY_1
  169. CALL DELAY_1
  170. CALL DELAY_1
  171. CALL DELAY_1

  172. NOP
  173. KEY_CK_8:
  174. SBI KEY_STATE,0AH ;判断取消键是否按下,按下取消键返回
  175. BAZ PORT_INT_SET
  176. LDI PORTE,0000B;关闭所有PE口输出
  177. NOP
  178. CALL DELAY_1
  179. CALL DELAY_1
  180. JMP PORT_INT_SET

  181. ;延时去抖动
  182. DELAY:

  183. LDI CT0,01H
  184. SBIM CT0,01H
  185. BC $-1


  186. RTNI
  187. DELAY_1:
  188. LDI CT2,02H
  189. LDI CT3,0FH
  190. LDI CT4,0FH
  191. LDI CT5,0FH
  192. LDI CT6,0FH
  193. SBIM CT6,01H
  194. BC $-1
  195. SBIM CT5,01H
  196. BC $-4
  197. SBIM CT4,01H
  198. BC $-7
  199. SBIM CT3,01H
  200. BC $-0AH
  201. SBIM CT2,01H
  202. BC $-0DH
  203. RTNI
  204. ;********************************************
  205. END
初步帮你改造成这样,可以实现确认键,取消键的功能,但取消键还不是实时确认的,只有在一个输出段输出完成后才会响应,要实现这时的响应取消键,还要进行改造,主要从定时器的应用入手.
发表于 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.程波。谢谢
发表于 2009-10-13 17:13 | 显示全部楼层
路过!!
厉害!!!!
我使用c的;
感觉你们好厉害!】
能说一下写汇编程序的经验吗?、
我在学汇编
发表于 2009-10-13 17:18 | 显示全部楼层
路过!!
厉害!!!!
我使用c的;
感觉你们好厉害!】
能说一下写汇编程序的经验吗?、
我在学汇编
刘夯 发表于 2009-10-13 17:13

网上很多这方面的书,您可以找一本来看看.
不过,做程序员是个辛苦活,呵呵.
 楼主| 发表于 2009-10-14 20:38 | 显示全部楼层
你改的这个程序不能实现这个功能了,按开启键连输出都没有,还有我想咨询一下这个程序中如何采用TIMER0做延时呢?我试了好几次都不行?可不可以以上面这个程序给举个例子呢。
发表于 2009-10-15 09:46 | 显示全部楼层
你改的这个程序不能实现这个功能了,按开启键连输出都没有,还有我想咨询一下这个程序中如何采用TIMER0做延时呢?我试了好几次都不行?可不可以以上面这个程序给举个例子呢。 ...
mugangzhu 发表于 2009-10-14 20:38

不会吧,你外围的按键是怎么接的??
TIMER0定延时,先给它设置一个定时的时间,比如100MS,这样要延时1秒,只需要10次TIMER0中断时间即可.
 楼主| 发表于 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                                                                  
上面这个怎么不能延时,请指教一下该如何修改啊
发表于 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

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