钻石会员 
 
主题
回帖0
积分26473
阅读权限50
注册时间2009-2-7
最后登录1970-1-1
在线时间 小时
 
 
 
 
 | 
 
 本帖最后由 老弹弓 于 2011-2-27 17:25 编辑  
 
MOSI            EQU P1.5                         ; spi  
               MISO            EQU P1.6                         ; SPI             
               SCLK            EQU P1.7                         ; 时钟 
               F_CS            EQU P1.0                         ; DATAFLASH片选 
               TP_CS           EQU P1.2                        ; 触摸芯片片选 
               SD_CS          EQU P1.1                        ; SD卡片选                           
               TP_X_DATA   EQU  50H                        ; 8位x值 
               TP_Y_DATA   EQU  51H                        ; 8位y值 
               TP_CONTOR   EQU  52H                        ; 放tp 的控制字  
 
               ORG     0058H 
MAIN:      
               LCALL  TP_Take_X                              ; 获取x通道的值 
               LCALL  TP_Take_Y                              ; 获取y通道的值 
               jmp     $   
;*************************************************************************************** 
;子程序名称:TP_Take_X 
;功能:  读取X  通道的值 
;入口: , 
;出口:  读到的数放在 TP_X_DATA  中 
;*************************************************************************************** 
TP_Take_X:      
               MOV       TP_CONTOR, #98H               ;  送x通道的控制字   1001 0100  差分 x    8位模式   
               LCALL     TP_SEND                            ;  发送x通道的控制字 
               LCALL     DELAY1US                          ;  延时或检测忙信号   实际是0.5us            
               LCALL     TP_TAKE                            ;  获取x通道的值 
               MOV       TP_X_DATA ,A                     ;  保存x通道的值 
               ret 
;*************************************************************************************** 
;子程序名称:TP_Take_Y 
;功能:  读取X  通道的值 
;入口: , 
;出口:  读到的数放在 TP_X_DATA  中 
;*************************************************************************************** 
TP_Take_Y:      
               MOV       TP_CONTOR, #0d8H              ; 送Y通道的控制字   1101 0100  差分 Y    8位 
               LCALL     TP_SEND                             ; 发送Y通道的控制字 
               LCALL     DELAY1US                           ; 延时或检测忙信号  实际是0.5us 
               LCALL     TP_TAKE                             ; 获取Y通道的值 
               MOV       TP_Y_DATA ,A                     ; 保存Y通道的值 
               ret 
;*************************************************************************************** 
;子程序名称:?TP_SEND 
;功能:  发送获取 通道的控制字 
;入口:  R1 放发送次数 8 ,TP_CONTOR 放发送控制字 用到 A 
;*************************************************************************************** 
TP_SEND:        
               CLR       TP_CS                           ; 片选 
               CLR       SCLK 
               MOV       R1,#8                          ; 发送次数 
               MOV       A,TP_CONTOR              ; 通道的控制字 
TP_SEND8:      MOV       C,ACC.7                ; 控制字的第七位送到 c 
               MOV       MOSI,  C                      ; 第一位送到 数据输出 
               NOP 
               NOP 
               NOP 
               NOP 
               SETB      SCLK                          ; 上升沿数据被读入 
               NOP 
               NOP 
               NOP 
               NOP 
               CLR      SCLK 
               RL       A                                   ; 左移A 
               DJNZ     R1 , TP_SEND8 
               RET     
;*************************************************************************************** 
;子程序名称:TP_Take           7843 在下降沿移出数据,可利用上升沿读取。  脉冲宽度 要大于 200ns 
;功能:  读取X 或Y 通道的值 
;入口:  R1 放发送次数 8 , 
;出口:  读到的数放在 A 中 
;*************************************************************************************** 
TP_Take:        
               MOV      R1,#8                          ; 放入读取次数,这里是8位所以放8 如果是12位就放12 
               SETB     MISO                           ; 置高,准备读取 
               SETB     SCLK                           ; CLK =1 
               NOP 
               NOP 
               NOP 
               NOP 
               NOP 
               CLR       SCLK                          ; CLK=0  7843 在下降沿移出数据  第一位可以在这里读取 也可以在下一个时钟的上升沿后 
               NOP 
               NOP 
               NOP  
               NOP                                        ; 额外增加的时钟,让第一个数据先发送的DOUT 上。 
               NOP 
TP_TAKE8:       
               SETB      SCLK                          ; CLK=1 
               MOV       C, MISO                       ; 读取 3时钟 
               RLC       A                                ; 左移一位 到A 中   1 时钟 
               NOP                                         ; 1时钟 
               NOP                                        ; 共计 6 时钟延时  0.045*6= 270ns 大于 200ns          
               CLR       SCLK                          ; CLK=0   数据被送到数据线上 
               NOP 
               NOP 
               NOP                                                        
               DJNZ     R1,TP_TAKE8                ; 读取8次               
               SETB     TP_CS                          ; 禁止片选 
               RET 
delay1us:   
               nop   
               nop                  
               nop 
               nop                  
               nop 
               nop                  
               nop 
               nop 
               nop 
               nop            ;22m 晶振 
               ret 
               end 
 
 
为什么代码以发上来就乱了? |   
 
 
 
 |