yan 发表于 2006-4-6 21:38:00

知道的能否告知?

litianzzk 发表于 2006-4-6 23:15:00

我只知道在nc3000中的一些串口调用的子程序,具体3B,3C,3D,3E,3F的用法不是很清楚,不知对你有没有用.

;打开串口通讯

OpenPort
LDA $0436
ORA #$08
STA $18
STA $0436
LDA #$FF
STA $60
LDA $3D
AND #$FC
ORA #$02
STA $3D
LDA #$20
STA $3C
LDA #$02
STA $3D
LDA $3D
AND #$FC
ORA #$01
STA $3D
LDA #$00
STA $3B
LDA $3D
AND #$FC
ORA #$00
STA $3D
LDA $3D
ORA #$04
STA $3D
PHP
PHA
LDA $3D
AND #$FC
ORA #$01
STA $3D
PLA
PLP
LDA #$30
STA $3D
NOP
NOP
NOP
LDA $3D
AND #$FC
ORA #$00
STA $3D
LDA $3B
CMP #$60
BEQ e308B
LDA $3D
AND #$FB
STA $3D
NOP
NOP
NOP
NOP
LDA $3D
ORA #$04
STA $3D
LDY #$04
e3075:
LDX #$C8
e3077:
JSR $E0BA   ;延时
LDA $3B
CMP #$60
BEQ e308B
DEX
BNE e3077
DEY
BNE e3075
e308B:
LDA $3D
AND #$FC
ORA #$00
STA $3D
LDA #$23
STA $3B
LDA $3D
AND #$FC
ORA #$01
STA $3D
LDA #$01 ;等于01时以波特率115200打开,等于00时以波特率230400打开,等于0f时以波特率921600打开
STA $3A
LDA $3D
AND #$FC
ORA #$00
STA $3D
LDA #$02
STA $3C
LDA #$80
STA $17
rts

;关闭串口通讯
ClosePort
         LDA $3D
         AND #$FC
         ORA #$00
         STA $3D
         LDA $3D
         AND #$FB
         STA $3D
         LDA $3D
         AND #$FC
         ORA #$02
         STA $3D
         LDA #$00
         STA $3C
         RTS

;发送一个字节

SendOneByte
             PHA
             LDA $3D
             AND #$FC
             ORA #$00
             STA $3D
            
SendOneByteL1
             LDA $3B
             AND #$60
             CMP #$60
             BNE SendOneByteL1
             PLA
             STA $3A
             RTS

;接收一个字节
ReceiveOneByte
LDA $3D
AND #$FC
ORA #$00
STA $3D
ReceiveOneBytel1
LDA $3C
AND #$10
BEQ ReceiveOneBytel1
LDA $3A
RTS


yan 发表于 2006-4-7 08:33:00

多谢楼上的回复.汇编代码我也有,但是就是看不懂它的含义..

yan 发表于 2006-4-7 08:34:00

这断代码用于以115200bps打开串口:
.include "f:\fishyuxuan\6502simulator\GGV\NC2600_head.65s"
open_port:
         enable_pll
         switch_bank 0
         LDA #$01
         STA LCReg
         Disable_irda
         clear_FIFO
         JSR wait_io_ok
         switch_BK 1
         LDA #$01
         STA BSReg
         switch_BK 0
         LDA #$00
         STA MSReg
         enable_UART
         RTS

wait_io_ok:
         JSR int_count
         LDA #$00
         STA $0FAA

local1:    enable_UCE
         switch_BK 0
         LDA LCReg
         CMP #$60
         BEQ local2
         JSR dec_count
         BNE local1
         LDA #$01
         STA $0FAA
local2   RTS

int_count:
         LDA #$00
         STA $0FC9
         LDA #$10
         STA $0FCA
         RTS
         
dec_count:
         LDA $0FC9
         BNE dec_local1
         DEC $0FCA
dec_local1:
         DEC $0FC9
         LDA $0FCA
         CMP #$00
         BNE end_count
         LDA $0FC9
         CMP #$00
end_count: RTS

;---------------UART & GPIO------------------------
bruiequ 3ah
uart_BKequ brui+3
RHRegequ brui
THRegequ brui
LSRegequ brui+1
LCRegequ brui+1
MCRegequ brui+2
IVRegequ brui+3

BSRegequ brui
IRCRegequ brui+1
MSRegequ brui+2
FCRegequ brui+3

CStopequ brui
CStartequ brui+1
TMRegequ brui+2
IERegequ brui+3

GPCRegequ brui
P05equ brui+2

;-----------------------------------------------;
P06equ brui+2
P07equ brui+3
P08equ brui+4
P08Direqu brui+4
P08ICequ brui+5

;---------------RTC SIF-------------------------

IndexAddrReg equ 3eh
RIRegequ IndexAddrReg

IndexDataReg equ 3fh
RTCValequ IndexDataReg
RCReg0equ IndexDataReg
RCReg1equ IndexDataReg
;---------------常用I/O控制或状态位-------------------------

io_hiie_bit equ 10000000b ;ptype1
io_dir42_bit equ 10000000b ;ptype0
io_hoie_bit equ 01000000b ;ptype1
io_dir43_bit equ 01000000b ;ptype0
io_dir316_bit equ 00100000b
io_nmioff_bit equ 00010000b
io_exie0_bit equ 00001000b
io_exie1_bit equ 00000100b
io_tmBie_bit equ 00000010b
io_tmAie_bit equ 00000001b
io_dir423_bit equ 11000000b ;write protect

io_int_ibf_bit equ 10000000b
io_int_obf_bit equ 01000000b
io_int_tm1_bit equ 00100000b
io_int_tm0_bit equ 00010000b
io_int_tb_bit equ 00001000b
io_int_eint_bit equ 00000100b
io_int_tmB_bit equ 00000010b
io_int_tmA_bit equ 00000001b

io_lcd_diction equ 00010000b
io_lcd_enb_bit equ 00001000b ;mask DI

io_p4_4_7_dir equ 11010000b ;for port44-port47 out(io_port_config) wyj 2001.10.17
io_p407_dir_bit equ 10000000b ;for port47 out
io_p406_dir_bit equ 01000000b ;for port46 out
io_p405_dir_bit equ 00100000b ;for port45 out
io_p404_dir_bit equ 00010000b ;for port44 out
io_onen_bit equ 00000100b

io_ROA_bit equ 10000000b ;RAM/ROM (io_bios_bsw)
io_btd_bit equ 00100000b ;
io_p401_dir_bit equ 00010000b ;for port41 out (io_bios_bsw)

io_onoff_pad_bit equ 00000001b ;use p30, no dir set, as input

io_adi_bit equ 10000000b
io_rtcoff_bit equ 01000000b
io_bout_bit equ 00100000b
io_shdnz_bit equ 00001000b

io_save_bit equ 00000100b
io_vsl1_bit equ 00000010b
io_vsl0_bit equ 00000001b
io_sh_bit equ 00001000b
io_rec_bit equ 00001000b ;1 for rec 0 for speak

io_bcp_bit equ 00100000b ;1 generate NMI 低电压 (io_general_status)
io_lcdir0_bit equ 00000000b ;b4 (io_clock_ctrl)
io_lcdir1_bit equ 00000000b ;b0 (io_lcd_ctrl)

io_xtype_bit equ 00000111b ;XTYPE=7 (io_port_config)

io_xm0cf_bit equ 00001011b ;Vol=0,ROA=0,80h--0ffh
;io_xm1cf_bit equ 00011001b ;Vol=1,ROA=0,80h--0ffh nc880
io_xm1cf_bit equ 00000011b ;Vol=0,ROA=1,80h--0ffh nc2000
;---------------Uart 状态常量-------------------------

RxRDY   equ 1
OE   equ 2
PE   equ 4
FE   equ 8
TxRDY   equ 32
TxEMT   equ 64

switch_BK macro val
php
pha
lda uart_BK
and #0fch
ora #val
sta uart_BK
pla
plp
endm
;------------------------------------IrDA macro----------------
DISABLE_TBASE macro
pha
lda zp_general_ctrl
and #11110000b
sta io_general_ctrl
pla
endm
ENABLE_TBASE macro
pha
lda zp_general_ctrl
sta io_general_ctrl
pla
endm

as_primary macro
lda IrdaModeMark
and #0cfh
ora #10h
sta IrdaModeMark
endm

as_secondary macro
lda IrdaModeMark
and #0cfh
ora #20h
sta IrdaModeMark
endm

not_assign macro
lda IrdaModeMark
and #0cfh
sta IrdaModeMark
endm

set_simulation macro
lda FoundDevice
sta SimuMark
endm

set_PorF macro
ora #10h
endm

set_cmdmacro
ora #1
endm

reset_watchdogmacro
lda #0
sta watch_dog_timer_flag
endm

clear_idlesec macro
lda #0
sta idlesec
endm

check_key macro local,local1
lda key
and #80h
beq local
lda key
and #7fh
sta key
jmp local1
local:lda #0
local1:
endm

clear_length macro
lda #0
sta RecvLength
sta RecvLength+1
endm

set_recv_status macro
lda IrdaComStatus
and #0fh
ora #1
sta IrdaComStatus
endm

set_send_status macro
lda IrdaComStatus
and #0fh
ora #2
sta IrdaComStatus
endm

set_retry1 macro
lda #1
sta RetryCount
endm

set_retry macro
lda #5
sta RetryCount
reset_watchdog
endm

set_callmark macro val
lda #val
sta IrdaCallMark
endm

switch_bank macro val
lda uart_BK
and #0fch
ora #val
sta uart_BK
endm

Enable_Irdamacro
lm IndexAddrReg,#P6DInx;P64 output 0
lda zp_port6_dir
ora #10h
sta IndexDataReg
sta zp_port6_dir
lda zp_io_port6
and #11101111b
sta io_port6
sta zp_io_port6
endm

Disable_Irdamacro
lm IndexAddrReg,#P6DInx
lda zp_port6_dir
ora #10h   ;p64 output 1
sta IndexDataReg
sta zp_port6_dir
lda zp_io_port6
ora #10h
sta io_port6
sta zp_io_port6

switch_BK 3
lda #80h
sta GPCReg
sta P05
endm

enable_UART macro
switch_BK 2
lda #00100000b
sta TMReg
endm

disable_UART macro
switch_BK 2
lda #0
sta TMReg
endm

CLEAR_BRUI      macro
      switch_BK       0
      lda   IVReg
      and   #0fbh
      sta   IVReg                           ;enable uart clock
      endm

;;;;;;;;;;;;;;;;;;
enable_UCE macro
switch_BK 0
lda #04h
sta IVReg
endm

disable_UCE macro
switch_BK 0
lda #00h
sta IVReg
endm

clear_FIFO macro
switch_BK 1
lda #30h
sta FCReg
endm
;;;;;;;;;;;;;;;;;;
enable_PLL macro
lda uart_BK
and #0fch
sta uart_BK
lda #4
sta uart_BK
endm

disable_PLL macro
lda uart_BK
and #0fch
sta uart_BK
lda #1
sta uart_BK
         lda   #23h
         sta   IRCReg
endm

enable_2Hz macro
lda #10
sta RIReg
lda RTC_IER_map
ora #1
sta RCReg0
sta RTC_IER_map
endm

enable_Alarm macro
lda #10
sta RIReg
lda RTC_IER_map
ora #2
sta RCReg0
sta RTC_IER_map
endm

enable_Samp64 macro
lda #10
sta RIReg
lda RTC_IER_map
ora #70h   ; 15.6 ms sample interruption
sta RCReg0
sta RTC_IER_map
endm

enable_Samp1k macro
lda #10
sta RIReg
lda RTC_IER_map
ora #0b0h   ; 15.6 ms sample interruption
sta RCReg0
sta RTC_IER_map
endm

disable_2Hz macro
lda #10
sta RIReg
lda RTC_IER_map
and #0feh
sta RCReg0
sta RTC_IER_map
endm
disable_Alarm macro
lda #10
sta RIReg
lda RTC_IER_map
and #0fdh
sta RCReg0
sta RTC_IER_map
endm
disable_Sample macro
lda #10
sta RIReg
lda RTC_IER_map
and #0fh
sta RCReg0
sta RTC_IER_map
endm

clear_2Hz macro
lda #11
sta RIReg
lda #1
sta RCReg1
endm
clear_Alarm macro
lda #11
sta RIReg
lda #2
sta RCReg1
endm
clear_Sample macro
lda #11
sta RIReg
lda #4
sta RCReg1
endm

get_Random macro
lda #4
sta RIReg
lda RTCVal
endm

set_TempByte macro val
lda #val
sta TempByte
endm

sendmacro local
pha
local:nop
lda LSReg
and #TxRDY
beq local
pla
sta THReg
endm

receivemacro local,local1
local:lda LSReg
and #RxRDY
bne local1
lda TimerMark
bne local
local1:lda RHReg
endm

start_flash macro
lda #1
sta IconFlashFlag
endm

stop_flash macro
lda #0
sta IconFlashFlag
endm

;----------------------------------end IrDA macro--------------

;---------------UART & GPIO------------------------

bruiequ 3ah

uart_BKequ brui+3

RHRegequ brui
THRegequ brui
LSRegequ brui+1
LCRegequ brui+1
MCRegequ brui+2
IVRegequ brui+3

BSRegequ brui
IRCRegequ brui+1
MSRegequ brui+2
FCRegequ brui+3

CStopequ brui
CStartequ brui+1
TMRegequ brui+2
IERegequ brui+3

GPCRegequ brui
P05equ brui+2

yan 发表于 2006-4-7 08:38:00

上面的代码是在论坛上搜的,可是我看不懂.

比如:IRCRegequ brui+1是不是IRCReg的值为brui+1??

还有IRCReg是什么意思??

我学51单片机的串口好象没那么复杂的.

希望大家讲解一下,谢谢.

leesoft 发表于 2006-4-7 14:11:00

代码能用就行了,没必要追究每个register的用法。

yan 发表于 2006-4-7 16:58:00

知道单片机的工作方式可以加深对编程的了解.

yan 发表于 2006-4-7 17:00:00

知道每个register的用法和每一位的作用,就可以灵活应用与程序上了.

杰出威风 发表于 2006-4-15 09:30:00

打开红外传输的中断是???nc3k

yan 发表于 2006-4-6 21:36:25

疑问,WQX 串口使用

3A,3B,3C,3D,3E,3F

其中$3A是数据缓冲

那么$3B的7位分别控制什么?

3C,3D,3E,3F呢??
页: [1]
查看完整版本: 疑问,WQX 串口使用