智能终端定制开发 ad
MTK/瑞芯微/高通-Android,智能模块/智能终端方案商

深度定制各类智能终端和智能硬件产品,提供硬件选型咨询、参考设计、元器件推荐、驱动开发、行业模块集成、操作系统定制与算法集成等软硬件定制服务。
contact.aspx

Android核心板产品覆盖2G、3G、4G通讯,双核、四核、八核CPU,可选的平台有MTK6580、MTK6737、MTK6750等,Android版本有5.1 6.0 7.0等。
contact.aspx

可广泛应用于低端智能POS、安防监控、车载设备、低端智能机器人、智能家居、智能硬件、工业智能手持设备、低端智能对讲设备、低端警务或执法设备、智能穿戴、贩卖机、物流柜、智能门禁系统等行业和设备。
contact.aspx

可提供以太网转串口透传,WIFI转串口透传,蓝牙转串口透传,CAN总线模拟量控制输出模块等。
contact.aspx

带3G或4G通讯功能,运行android系统,有多个串口,可以外挂各种模块:条码扫描、RFID、指纹识别、身份证识别、磁条卡、ID卡、GPS/北斗模块等。
contact.aspx

具有4G通讯功能,多个RS232或RS485接口,以太网接口,USB接口,CAN接口,多个AD输入。基于Android系统智能平台,方便APP应用开发。器件严格选型,运行稳定,质量可靠。
contact.aspx

PIC单片机操作 LCD1602 8bit方式
[电子技术] 2008-02-15

LIST  p=16f877
INCLUDE  "P16f877.inc"
__CONFIG _CP_ALL&_DEBUG_OFF&_WRT_ENABLE_OFF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC

#DEFINE      LCD1602_RS   PORTA,1         ;LCD寄存器选择信号脚定义在RA.1脚
#DEFINE      LCD1602_RW   PORTA,2         ;LCD读/写信号脚定义在RA.2脚
#DEFINE      LCD1602_E    PORTA,3         ;LCD片选信号脚定义在RA.3脚
;
#DEFINE DS1302_IO PORTE,0                 ;1302I_O
#DEFINE DS1302_TRISIO TRISE,0              ; TRIS 1302I_O
#DEFINE DS1302_SCLK PORTE,1                ;1302时钟
#DEFINE DS1302_RST PORTE,2                 ;1302使能位
;
BAK_W_TEMP    EQU   21H
BAK_STATUS_TEMP   EQU   22H
BAK_PCLATH_TEMP   EQU   23H
;
KEYSCAN_VALUE   EQU   24h  ;暂存按键列码和位置码
;
DELAY_VAR_M    EQU   25H
DELAY_VAR_N    EQU   26H
NUM2ASCII_INBYTE  EQU   27H

BIN2BCD_LSD       EQU      28H
BIN2BCD_MSD       EQU      29H

BIN2ASCII_INBYTE  EQU  2AH 
BIN2ASCII_LSD      EQU     2BH
BIN2ASCII_MSD      EQU     2CH
;
EEPROM_WRITE_ADDR  EQU  2DH
EEPROM_WRITE_DATA  EQU  2EH
TEMP_VAR_A    EQU  2FH
;
KEYSCAN_CON_COUNTER  EQU  30H
KEYSCAN_CON_KEYVALUE EQU  31H
KEYSCAN_CON_FLAG  EQU  32H
TIMER_MSSAVE_TEMPVAR EQU  33H
BCDTOBIN_X    EQU  34H
BCDTOBIN_TEMP   EQU  35H
;
BIN2BCD_BYINT_LSD      EQU     36H
BIN2BCD_BYINT_MSD      EQU     37H
;
FLASH_READ_ADDRL  EQU  38H
FLASH_READ_ADDRH  EQU  39H
FLASH_READ_DATAL  EQU  3AH
FLASH_READ_DATAH  EQU  3BH
;
KEYSCAN_CON_COUNTER_LIMIT EQU  3CH
;
IDERUN_FLAG    EQU   3DH
IDERUN_FLAGB   EQU   00H
;
LCD1602_COM    EQU   3EH ;控制字暂存单元
LCD1602_CODER   EQU   3FH ;字符代码暂存单元
LCD1602_NEED_CHKBUSY EQU   40H;
LCD1602_LINE_LEN  EQU  41H
LCD1602_LINE_SHOWADDR EQU  42H
LCD1602_LINE_ADDRL  EQU  43H
LCD1602_LINE_ADDRH  EQU  44H 
;
DS1302_BYTE_BITCOUNT EQU  45H
DS1302_TIME_TX   EQU  46H
DS1302_TIME_RX   EQU  47H
DS1302_TIME_RX_ADDR     EQU   48H            ;连续接收7个数据起始地址
DS1302_TIME_TX_ADDR     EQU   48H            ; 7个数据起始地址
DS1302_BUFFER_COUNT  EQU  4FH
;ERRORLEVEL -302
CBLOCK 48H
 DS1302_SEC         ;秒  48H
 DS1302_MIN         ;分  49H
 DS1302_HOU         ;小时 4AH
 DS1302_DATE        ;日期 4BH
 DS1302_MON         ;月  4CH
 DS1302_DAY         ;日   4DH
 DS1302_YERR        ;年  4EH
ENDC

;***********************************************
   ORG   0000H
   NOP
   GOTO  MAIN
;************** INT **********************
   ORG   0004H
   NOP
   RETFIE
;************************ MAIN ************
MAIN  ;CLRF  TESTAND
   ;BSF   TESTAND,4
   ;MOVLW  B00010000
   ;ANDWF  TESTAND,F
   ;GOTO $
   NOP
   MOVLW  IDERUN_FLAGB
   MOVWF  IDERUN_FLAG
   BCF   STATUS,RP0
   BCF   STATUS,RP1
   ;
   BSF STATUS,RP0          ;转体1
   MOVLW 07H
   MOVWF ADCON1            ;设置RA口全部为普通数字IO口
   MOVLW 0FFH
   MOVWF TRISB ;PORTB IN
   ;
   CLRF TRISA             ;定义A口为输出
   CLRF TRISC             ;定义C口为输出
   CLRF TRISD             ;定义D口为输出
   CLRF TRISE             ;定义E口为输出
   BCF STATUS,RP0          ;回体0
   CALL  LCD1602_INIT
   ;
   MOVLW  80H
   MOVWF  LCD1602_COM
   CALL  LCD1602_WRITECOM
   MOVLW  D64
   MOVWF  LCD1602_CODER
   CALL  LCD1602_WRITECODE
   ;
MAINLOP  NOP
   CALL  KEYCHECK
   goto  MAINLOP


;************** LCD显示第一行的字 *************************
LCD1602_SHOW_L1  MOVLW 80H
     MOVWF LCD1602_LINE_SHOWADDR
     ;MOVLW D8
     ;MOVWF LCD1602_LINE_LEN
     MOVLW LOW(TABLE_LCD1602_LINE1)
     MOVWF LCD1602_LINE_ADDRL
     MOVLW HIGH(TABLE_LCD1602_LINE1)
     MOVWF LCD1602_LINE_ADDRH
     CALL LCD1602_WRITE_LINE_EX
     RETURN

;************** LCD显示第二行的字 *************************
LCD1602_SHOW_L2  MOVLW 0C0H
     MOVWF LCD1602_LINE_SHOWADDR
     ;MOVLW D8
     ;MOVWF LCD1602_LINE_LEN
     MOVLW LOW(TABLE_LCD1602_LINE2)
     MOVWF LCD1602_LINE_ADDRL
     MOVLW HIGH(TABLE_LCD1602_LINE2)
     MOVWF LCD1602_LINE_ADDRH
     CALL LCD1602_WRITE_LINE_EX
     RETURN


;************************送数据到LCD***********************
;写数据子程序 LCD1602_CODER
;RS=1,RW=0,E=高脉冲,D0-D7=数据
;**********************************************************
LCD1602_WRITECODE  MOVLW 0FFH
     MOVWF PORTD
     ;
     CALL   LCD1602_CHKBUSY                     ;判断总线是否忙
     BSF    LCD1602_RS
     BCF    LCD1602_RW
     MOVF   LCD1602_CODER , 0
     MOVWF  PORTD                        ;送出数据
     BSF    LCD1602_E
     NOP
     NOP
     BCF    LCD1602_E
     RETURN
;************************送命令到LCD***********************
;写指令子程序 LCD1602_COM
;RS=0,RW=0,E=高脉冲,D0-D7=指令码
;**********************************************************
LCD1602_WRITECOM MOVLW 0FFH
     MOVWF PORTD
     ;
     BTFSC LCD1602_NEED_CHKBUSY,0
     CALL   LCD1602_CHKBUSY                    ;判断总线是否忙
     BCF    LCD1602_RS
     BCF    LCD1602_RW
     MOVF  LCD1602_COM ,0
     MOVWF  PORTD                       ;送命令
     BSF    LCD1602_E
     NOP
     NOP
     BCF    LCD1602_E
     RETURN

;************************判断LCD总线是否忙********************
;测忙碌子程序
;RS=0,RW=1,E=H,D0-D7=状态字
;**********************************************************
LCD1602_CHKBUSY   BTFSC IDERUN_FLAG,0
     RETURN
     ;NOP
     ;BANKSEL  TRISD
     BSF  STATUS,RP0
     MOVLW    0FFH
     MOVWF    TRISD                     ;D口设置为输入
     BCF  STATUS,RP0
     CLRF     STATUS
     MOVLW    0FFH
     MOVWF    PORTD
     BCF      LCD1602_RS
     BSF      LCD1602_RW
LCD1602_CHKBUSY_A  CLRWDT;NOP
     NOP
     NOP
     BSF      LCD1602_E
     NOP
     NOP
     NOP
     BTFSS    PORTD,7                  ;D7为高表示总线忙,为低表示总线空闲
     GOTO     LCD1602_CHKBUSY_B;$+6    
     NOP
     NOP
     NOP
     BCF      LCD1602_E
     GOTO     LCD1602_CHKBUSY_A
LCD1602_CHKBUSY_B  BCF      LCD1602_E
     ;BANKSEL  TRISD
     BSF  STATUS,RP0
     CLRF     TRISD                     ;恢复D口为输出
     BCF  STATUS,RP0
     CLRF     STATUS
     RETURN
     ;

; ********* LCD1602 INIT *********************
LCD1602_INIT CLRF  LCD1602_NEED_CHKBUSY
    NOP
    CALL  DELAY_5MS
    CALL  DELAY_10MS
    MOVLW  38H
    MOVWF  LCD1602_COM
    CALL  LCD1602_WRITECOM
    CALL  DELAY_5MS
    MOVLW  38H
    MOVWF  LCD1602_COM
    CALL  LCD1602_WRITECOM
    CALL  DELAY_5MS
    MOVLW  38H
    MOVWF  LCD1602_COM
    CALL  LCD1602_WRITECOM
    BSF   LCD1602_NEED_CHKBUSY,0
    ;
    MOVLW  38H
    MOVWF  LCD1602_COM
    CALL  LCD1602_WRITECOM
    MOVLW  08H
    MOVWF  LCD1602_COM
    CALL  LCD1602_WRITECOM
    MOVLW  01H
    MOVWF  LCD1602_COM
    CALL  LCD1602_WRITECOM
    MOVLW  06H
    MOVWF  LCD1602_COM
    CALL  LCD1602_WRITECOM
    MOVLW  0CH
    MOVWF  LCD1602_COM
    CALL  LCD1602_WRITECOM
    RETURN
;************* KEY键盘动作检查子程序 **********
KEYCHECK      BTFSS KEYSCAN_CON_FLAG,0 
     GOTO KEYCHECKA
     INCF KEYSCAN_CON_COUNTER,F
     ;MOVLW D12
     MOVF KEYSCAN_CON_COUNTER_LIMIT,W
     SUBWF KEYSCAN_CON_COUNTER,W
     BTFSS STATUS,C
     GOTO KEYCHECKA
     CLRF KEYSCAN_CON_KEYVALUE
     CLRF KEYSCAN_CON_COUNTER
     CLRF KEYSCAN_CON_FLAG
     ;
KEYCHECKA   CALL  KEYSCAN   ;调用键盘扫描子程序
     COMF  KEYSCAN_VALUE,0   ;位置码取反送W
     BTFSC  STATUS,Z  ;测试右键按下否?有! 跳过下条指令
     RETURN     ;无
     ;
     CALL  DELAY_20MS
     ;CALL  DELAY_10MS
     CALL  KEYSCAN  ;再次调用键盘扫描子程序
     COMF  KEYSCAN_VALUE,0  ;位置码取反送W
     BTFSC  STATUS,Z ;测试有键按下否?有!跳过下条指令
     RETURN     ;无
     ;
     MOVF  KEYSCAN_VALUE,0  ;键值全是0则不做处理
     XORLW  00H
     BTFSC  STATUS,Z
     RETURN  
     MOVF  KEYSCAN_VALUE,0  ;键值全是1则不做处理
     XORLW  0FFH
     BTFSC  STATUS,Z
     RETURN   
     ;
     ;判断 KEYSCAN_CON_COUNTER ,只有 (KEYSCAN_CON_COUNTER==0 ) OR ( KEYSCAN_CON_COUNTER>0 AND KEYSCAN_CON_KEYVALUE<>KEYSCAN_VALUE )的时候才处理这次按键
     ; 也就是说不处理按键的条件为 KEYSCAN_CON_COUNTER>0 AND KEYSCAN_CON_KEYVALUE==KEYSCAN_VALUE
     MOVLW  00H
     SUBWF  KEYSCAN_CON_COUNTER,0
     BTFSC  STATUS,Z
     GOTO  KEYACTIONRISE
     MOVF  KEYSCAN_VALUE,0
     SUBWF  KEYSCAN_CON_KEYVALUE,0
     BTFSC  STATUS,Z
     RETURN
     ;
KEYACTIONRISE   MOVLW  D12  
     MOVWF  KEYSCAN_CON_COUNTER_LIMIT ;赋值必须要放到处理函数调用的前面
     ;
     CALL  KEYACTION_PROCESS ;调用按键处理子程序 键值位置码保存在  KEYSCAN_VALUE
     MOVF  KEYSCAN_VALUE,W
     MOVWF  KEYSCAN_CON_KEYVALUE
     BSF   KEYSCAN_CON_FLAG,0
     CLRF  KEYSCAN_CON_COUNTER   
     RETURN
     ;
; ********* 键盘扫描子程序 ************ ******************
KEYSCAN  BCF   STATUS,RP1  ;设置文件寄存器的体1
   BSF   STATUS,RP0
   BCF   OPTION_REG,NOT_RBPU ;启用B口上拉电阻
   MOVLW  0FH    ;将端口B的方向控制码0FH先送W
   MOVWF  TRISB   ;将其设为高四位输出,低四位输入
   BCF   STATUS,RP0  ;恢复到文件寄存器体0
   MOVLW  00H    ;4条行线全部输出0
   MOVWF  PORTB
   NOP       ;等待状态稳定下来
   NOP       
   MOVF  PORTB,0   ;读取列线状态
   ANDLW  0FH    ;屏蔽掉高四位
   MOVWF  KEYSCAN_VALUE  ;得到的列码暂存到VALUE寄存器中
   XORLW  0FH    ;于0FH值对比
   BTFSC  STATUS,Z  ;列码全部位1吗?否! 有键按下
   GOTO  KEYNO   ;是!无键按下
   BSF   STATUS ,RP0  ;设置文件寄存器的体1
   MOVLW  0F0H   ;将端口B的方向 控制码0F0H先送W
   MOVWF  TRISB   ;改变位低四位输出 高四位输入
   BCF   STATUS,RP0  ;恢复为文件寄存器体0
   MOVF  KEYSCAN_VALUE,0  ;读取列码
   MOVWF  PORTB   ;在经过列线输出
   NOP       ;等待输出状态稳定下来
   NOP
   MOVF  PORTB,0   ;读取行线状态
   ANDLW  0F0H   ;屏蔽掉低四位
   IORWF  KEYSCAN_VALUE,1  ;将行码和列码组合起来放入VALUE
   RETURN      ;子程序返回
   ;
KEYNO  MOVLW  0FFH   ;建立一个标志值, 表明无键按下
   MOVWF  KEYSCAN_VALUE   ;
   RETURN      ;子程序返回
;
;********************* 按键动作处理子程序 *********
;入口参数:键值位置码保存在  KEYSCAN_VALUE
;**************************************************
KEYACTION_PROCESS NOP
    CALL SOUND_1000HZ
    ; REAL KEY ACTION
   MOVF  KEYSCAN_VALUE,0
   XORLW  77H
   BTFSC  STATUS,Z
   GOTO  KEY77 
   MOVF  KEYSCAN_VALUE,0
   XORLW  0B7H
   BTFSC  STATUS,Z
   GOTO  KEYB7
   MOVF  KEYSCAN_VALUE,0
   XORLW  0D7H
   BTFSC  STATUS,Z
   GOTO  KEYD7
   MOVF  KEYSCAN_VALUE,0
   XORLW  0E7H
   BTFSC  STATUS,Z
   GOTO  KEYE7
   ;
   MOVF  KEYSCAN_VALUE,0
   XORLW  7BH
   BTFSC  STATUS,Z
   GOTO  KEY7B
   MOVF  KEYSCAN_VALUE,0
   XORLW  0BBH
   BTFSC  STATUS,Z
   GOTO  KEYBB
   MOVF  KEYSCAN_VALUE,0
   XORLW  0DBH
   BTFSC  STATUS,Z
   GOTO  KEYDB
   MOVF  KEYSCAN_VALUE,0
   XORLW  0EBH
   BTFSC  STATUS,Z
   GOTO  KEYEB
   ;
   MOVF  KEYSCAN_VALUE,0
   XORLW  7DH
   BTFSC  STATUS,Z
   GOTO  KEY7D  
   MOVF  KEYSCAN_VALUE,0
   XORLW  0BDH
   BTFSC  STATUS,Z
   GOTO  KEYBD
   MOVF  KEYSCAN_VALUE,0
   XORLW  0DDH
   BTFSC  STATUS,Z
   GOTO  KEYDD
   MOVF  KEYSCAN_VALUE,0
   XORLW  0EDH
   BTFSC  STATUS,Z
   GOTO  KEYED
   ;
   MOVF  KEYSCAN_VALUE,0
   XORLW  7EH
   BTFSC  STATUS,Z
   GOTO  KEY7E
   MOVF  KEYSCAN_VALUE,0
   XORLW  0BEH
   BTFSC  STATUS,Z
   GOTO  KEYBE
   MOVF  KEYSCAN_VALUE,0
   XORLW  0DEH
   BTFSC  STATUS,Z
   GOTO  KEYDE
   MOVF  KEYSCAN_VALUE,0
   XORLW  0EEH
   BTFSC  STATUS,Z
   GOTO  KEYEE
   RETURN
   ; ------------------------------
KEY77  
    MOVLW  80H
    MOVWF  LCD1602_COM
    CALL  LCD1602_WRITECOM
    MOVLW  D80
    MOVWF  LCD1602_CODER
    CALL  LCD1602_WRITECODE
    RETURN
   ;
KEYB7  CALL  LCD1602_SHOW_L1
   RETURN
   ;
KEYD7  CALL  LCD1602_SHOW_L2
   RETURN
KEYE7   RETURN
   ; ---------------------
KEY7B  RETURN
KEYBB  RETURN
KEYDB  RETURN
KEYEB  RETURN
   ; ----------------------------------
KEY7D  RETURN
KEYBD  RETURN
KEYDD  RETURN
KEYED  RETURN

KEY7E  RETURN
KEYBE  RETURN
KEYDE  RETURN
KEYEE  RETURN
   ; -----------------
   RETURN

; ************* LCD1602 DISPLAY DS1302 **********************
; DS1302_SEC         ;秒  48H
; DS1302_MIN         ;分  49H
; DS1302_HOU         ;小时 4AH
; DS1302_DATE        ;日期 4BH
; DS1302_MON         ;月  4CH
; DS1302_DAY         ;日   4DH
; DS1302_YERR        ;年  4EH
;
LCD1602_DISPLAY_DS1302 MOVLW  80H
      MOVWF  LCD1602_COM
      CALL  LCD1602_WRITECOM
      ;
      ;NUM2ASCII  NUM2ASCII_INBYTE
      MOVF  DS1302_HOU,W
      MOVWF  NUM2ASCII_INBYTE
      CALL  NUM2ASCII
      MOVF  NUM2ASCII_INBYTE,W
      MOVWF  LCD1602_CODER
      CALL  LCD1602_WRITECODE
      ;
      MOVF  DS1302_HOU,W
      MOVWF  NUM2ASCII_INBYTE
      SWAPF  NUM2ASCII_INBYTE
      CALL  NUM2ASCII
      MOVF  NUM2ASCII_INBYTE,W
      MOVWF  LCD1602_CODER
      CALL  LCD1602_WRITECODE
      ;
        MOVLW  3AH ; (:)
        MOVWF  LCD1602_CODER
        CALL  LCD1602_WRITECODE
      ;
      MOVF  DS1302_MIN,W
      MOVWF  NUM2ASCII_INBYTE
      CALL  NUM2ASCII
      MOVF  NUM2ASCII_INBYTE,W
      MOVWF  LCD1602_CODER
      CALL  LCD1602_WRITECODE
      ;
      MOVF  DS1302_MIN,W
      MOVWF  NUM2ASCII_INBYTE
      SWAPF  NUM2ASCII_INBYTE
      CALL  NUM2ASCII
      MOVF  NUM2ASCII_INBYTE,W
      MOVWF  LCD1602_CODER
      CALL  LCD1602_WRITECODE
      ;
        MOVLW  3AH ; (:)
        MOVWF  LCD1602_CODER
        CALL  LCD1602_WRITECODE
      ;
      MOVF  DS1302_SEC,W
      MOVWF  NUM2ASCII_INBYTE
      CALL  NUM2ASCII
      MOVF  NUM2ASCII_INBYTE,W
      MOVWF  LCD1602_CODER
      CALL  LCD1602_WRITECODE
      ;
      MOVF  DS1302_SEC,W
      MOVWF  NUM2ASCII_INBYTE
      SWAPF  NUM2ASCII_INBYTE
      CALL  NUM2ASCII
      MOVF  NUM2ASCII_INBYTE,W
      MOVWF  LCD1602_CODER
      CALL  LCD1602_WRITECODE
      ;
        MOVLW  20H ; ( )
        MOVWF  LCD1602_CODER
        CALL  LCD1602_WRITECODE
      RETURN


; ************** LCD1602_WRTITE_LINE **************************
;
LCD1602_WRITE_LINE  MOVF  LCD1602_LINE_SHOWADDR,0
      MOVWF LCD1602_COM
      CALL LCD1602_WRITECOM
      ;
      MOVF  LCD1602_LINE_ADDRL ,0
      MOVWF  FLASH_READ_ADDRL
      MOVF  LCD1602_LINE_ADDRH ,0
      MOVWF  FLASH_READ_ADDRH
      ;
LCD1602_WRITE_LINE_LOOP CALL  FLASH_READ
      MOVF  FLASH_READ_DATAL,0   
      MOVWF  LCD1602_CODER
      CALL  LCD1602_WRITECODE
        DECF  LCD1602_LINE_LEN 
      BTFSC  STATUS,Z
      RETURN
      MOVLW  01H
      ADDWF  FLASH_READ_ADDRL,1
      BTFSC  STATUS,C
      INCF  FLASH_READ_ADDRH
      GOTO  LCD1602_WRITE_LINE_LOOP      
      RETURN

 

; ************** LCD1602_WRTITE_LINE_EX **************************
;
LCD1602_WRITE_LINE_EX  MOVF  LCD1602_LINE_SHOWADDR,0
       MOVWF LCD1602_COM
       CALL LCD1602_WRITECOM
       ;
       MOVF  LCD1602_LINE_ADDRL ,0
       MOVWF  FLASH_READ_ADDRL
       MOVF  LCD1602_LINE_ADDRH ,0
       MOVWF  FLASH_READ_ADDRH
       ;
LCD1602_WRITE_LINE_EX_LOOP CALL  FLASH_READ
       MOVLW  00H
       ADDWF  FLASH_READ_DATAL,W
       BTFSC  STATUS,Z
       RETURN
       ;
       MOVF  FLASH_READ_DATAL,0
       MOVWF  LCD1602_CODER
       CALL  LCD1602_WRITECODE
       ;
       MOVLW  01H
       ADDWF  FLASH_READ_ADDRL,1
       BTFSC  STATUS,C
       INCF  FLASH_READ_ADDRH
       GOTO  LCD1602_WRITE_LINE_EX_LOOP     
       RETURN


; ***************  读取 EEPROM 数据 ******************
; 入口参数: 把地址放入w
; 出口参数:  把读取的数据放入w
;
EEPROM_READ  BSF   STATUS,RP1  ;用两条指令
    BCF   STATUS,RP0  ;选定体2为当前体
    ;MOVF  ADDR,W
    MOVWF  EEADR
    BSF   STATUS,RP0  ; RAM PAGE 3
    BCF   EECON1,EEPGD
    BSF   EECON1,RD
    BCF   STATUS,RP0  ;RAM PAGE 2
    MOVF  EEDATA,W  ;
    NOP
    BCF   STATUS,RP0
    BCF   STATUS,RP1
    RETURN

; ***************  写入 EEPROM 数据 ******************
; 入口参数:  EEPROM_WRITE_ ADDR  EEPROM_WRITE_DATA
;
EEPROM_WRITE BSF   STATUS,RP1  ;SET RAM PAGE 3
    BSF   STATUS,RP0
    BTFSC  EECON1,WR
    GOTO  $-1
    ;
    BCF   STATUS,RP1  
    BCF   STATUS,RP0
    MOVF  EEPROM_WRITE_ADDR,0
    ;
    BSF   STATUS,RP1
    BCF   STATUS,RP0  ;SET RAM PAGE 2 
    MOVWF  EEADR
    ;
    BCF   STATUS,RP1  
    BCF   STATUS,RP0
    MOVF  EEPROM_WRITE_DATA,0
    ;
    BSF   STATUS,RP1
    BCF   STATUS,RP0  ;SET RAM PAGE 2 
    MOVWF  EEDATA 
    ;
    BSF   STATUS,RP1
    BSF   STATUS,RP0  ;SET RAM PAGE 3
    BCF   EECON1,EEPGD
    BSF   EECON1,WREN
    BCF   INTCON,GIE
    ;
    MOVLW  0x55
    MOVWF  EECON2
    MOVLW  0xAA
    MOVWF  EECON2
    BSF   EECON1,WR
    ;
    BSF   INTCON,GIE
    BCF   EECON1,WREN
    ;
    BTFSC  EECON1,WR
    GOTO  $-1
    BCF   STATUS,RP1  ;SET RAM PAGE 0
    BCF   STATUS,RP0
    RETURN

; ***************  读取 FLASH 数据 ******************
; 入口参数: 把地址 FLASH_READ_ADDRL ,  FLASH_READ_ADDRH
; 出口参数:   FLASH_READ_DATAL ,  FLASH_READ_DATAH
;
FLASH_READ  BCF   STATUS,RP0
    BCF   STATUS,RP1
    MOVF   FLASH_READ_ADDRL, 0  ;Write the  address bytes
    ;
    BSF   STATUS, RP1    ;
    BCF   STATUS, RP0    ;Bank 2
    MOVWF   EEADR
    ;
    BCF   STATUS,RP0
    BCF   STATUS,RP1
    MOVF   FLASH_READ_ADDRH,0   ;for the desired
    ;
    BSF   STATUS, RP1    ;
    BCF   STATUS, RP0    ;Bank 2
    MOVWF   EEADRH      ;address to read
    ;
    BSF   STATUS, RP1    ;Bank 3
    BSF   STATUS, RP0    ;Bank 3
    BSF   EECON1, EEPGD    ;Point to Program memory
    BSF   EECON1, RD     ;Start read operation
    NOP         ;Required two NOPs
    NOP   ;
    NOP
    BSF   STATUS, RP1
    BCF   STATUS, RP0    ;Bank 2
    MOVF   EEDATA, W     ;DATAL = EEDATA
    ;
    BCF   STATUS,RP0
    BCF   STATUS,RP1
    MOVWF   FLASH_READ_DATAL   ;
    ;
    BSF   STATUS, RP1
    BCF   STATUS, RP0    ;Bank 2
    MOVF   EEDATH,W     ;DATAH = EEDATH
    ;
    BCF   STATUS,RP0
    BCF   STATUS,RP1
    MOVWF   FLASH_READ_DATAH ;
     ;
    BCF   STATUS,RP0
    BCF   STATUS,RP1
    RETURN


;***************** SOUND_1000HZ 100MS子函数 *****************
SOUND_1000HZ  CLRWDT
     NOP
     MOVLW  D100
     MOVWF  DELAY_VAR_M
     BCF   PORTC,2
SOUND_1000HZ_1  ; 1 during 500 um
     BSF   PORTC,2
     MOVLW  D165
     MOVWF  DELAY_VAR_N
     DECFSZ  DELAY_VAR_N,1
     GOTO  $-1
     ; 0 during 500 um
     BCF   PORTC,2
     MOVLW  D165
     MOVWF  DELAY_VAR_N
     DECFSZ  DELAY_VAR_N,1
     GOTO  $-1
     ;
     DECFSZ  DELAY_VAR_M,1
     GOTO  SOUND_1000HZ_1
     RETURN

;***************** 延时5ms子函数 *****************
DELAY_5MS CLRWDT
   NOP
   MOVLW  D6
   MOVWF  DELAY_VAR_M
DEL5_1  MOVLW  0FFH
   MOVWF  DELAY_VAR_N
   DECFSZ  DELAY_VAR_N,1
   GOTO  $-1
   DECFSZ  DELAY_VAR_M,1
   GOTO  DEL5_1
   NOP
   NOP
   RETURN


;***************** 延时10ms子函数 *****************
DELAY_10MS CLRWDT
   NOP
   MOVLW  D13
   MOVWF  DELAY_VAR_M
DEL10_1  MOVLW  0FFH
   MOVWF  DELAY_VAR_N
   DECFSZ  DELAY_VAR_N,1
   GOTO  $-1
   DECFSZ  DELAY_VAR_M,1
   GOTO  DEL10_1
   NOP
   NOP
   RETURN

;***************** 延时20ms子函数 *****************
DELAY_20MS  CLRWDT
   NOP
   MOVLW  D26
   MOVWF  DELAY_VAR_M
DEL20_1  MOVLW  0FFH
   MOVWF  DELAY_VAR_N
   DECFSZ  DELAY_VAR_N,1
   GOTO  $-1
   DECFSZ  DELAY_VAR_M,1
   GOTO  DEL20_1
   NOP
   NOP
   RETURN

;***************** 延时50ms子函数 *****************
DELAY_50MS  CLRWDT
   NOP
   MOVLW  D65
   MOVWF  DELAY_VAR_M
DEL50_1  MOVLW  0FFH
   MOVWF  DELAY_VAR_N
   DECFSZ  DELAY_VAR_N,1
   GOTO  $-1
   DECFSZ  DELAY_VAR_M,1
   GOTO  DEL50_1
   NOP
   NOP
   RETURN

;***************** 延时100ms子函数 *****************
DELAY_100MS CLRWDT
   NOP
   MOVLW  D130
   MOVWF  DELAY_VAR_M
DEL100_1 MOVLW  0FFH
   MOVWF  DELAY_VAR_N
   DECFSZ  DELAY_VAR_N,1
   GOTO  $-1
   DECFSZ  DELAY_VAR_M,1
   GOTO  DEL100_1
   NOP
   NOP
   RETURN
;***************** 延时500ms子函数 *****************
DELAY_500MS CALL DELAY_100MS
   CALL DELAY_100MS
   CALL DELAY_100MS
   CALL DELAY_100MS
   CALL DELAY_100MS
   RETURN

;*************************** BIN2BCD *************************************
;入口: w
;出口: BIN2BCD_MSD  BIN2BCD_LSD
;*******************************************************************

BIN2BCD    CLRF    BIN2BCD_MSD
    MOVWF   BIN2BCD_LSD
BIN2BCD_GTENTH  MOVLW   .10
    SUBWF   BIN2BCD_LSD,W
    BTFSS   STATUS, C    ;CARRY
    RETURN
    MOVWF   BIN2BCD_LSD
    INCF    BIN2BCD_MSD
    GOTO    BIN2BCD_GTENTH
     RETURN


; *********************** BIN2ASCII ************************************
;BIN2ASCII
;BIN2ASCII_INBYTE    入口参数
;BIN2ASCII_LSD      出口参数低字节
;BIN2ASCII_MSD      出口参数高字节
;
BIN2ASCII  MOVF BIN2ASCII_INBYTE ,0
    CALL BIN2BCD
    ;
    MOVF BIN2BCD_LSD,0
    MOVWF NUM2ASCII_INBYTE
    CALL NUM2ASCII
    MOVF NUM2ASCII_INBYTE,0
    MOVWF BIN2ASCII_LSD
    ;
    MOVF BIN2BCD_MSD,0
    MOVWF NUM2ASCII_INBYTE
    CALL NUM2ASCII
    MOVF NUM2ASCII_INBYTE,0
    MOVWF BIN2ASCII_MSD
    ;
    RETURN
;
; *******  NUM2ASCII (0-9)单个十六进制数字转ASCII码值 **************************
; 入口参数  NUM2ASCII  NUM2ASCII_INBYTE  只运算低四位
; 出口参数  NUM2ASCII  NUM2ASCII_INBYTE
;********************************************
NUM2ASCII BCF  NUM2ASCII_INBYTE,7
   BCF  NUM2ASCII_INBYTE,6
   BCF  NUM2ASCII_INBYTE,5
   BCF  NUM2ASCII_INBYTE,4
   MOVLW D48
   ADDWF NUM2ASCII_INBYTE,1   
   RETURN
;**************************************
;入口:   BCDTOBIN_X * W -->  BCDTOBIN_X
BCDTOBIN  MOVWF  BCDTOBIN_TEMP;
    ;
    XORLW  D00
    BTFSC  STATUS,Z
    GOTO  BCDTOBINZERO
    MOVF  BCDTOBIN_TEMP,0  ;检查 是否已经等于00
    XORLW  D00
    BTFSC  STATUS,Z
    GOTO  BCDTOBINZERO
    ;
    DECF  BCDTOBIN_TEMP ,1
    MOVF  BCDTOBIN_TEMP,0  ;检查 是否已经等于00
    XORLW  D00
    BTFSC  STATUS,Z
    RETURN
    ;
    MOVF  BCDTOBIN_X, 0
BCDTOBINLOOP ADDWF  BCDTOBIN_X, 1
    DECFSZ  BCDTOBIN_TEMP,1
    GOTO  BCDTOBINLOOP
    RETURN
BCDTOBINZERO CLRF   BCDTOBIN_X
    RETURN


;********************** DS1302_WRITE_BYTE 写一个字节程序*****************
; 作用:一次发送一个字节的数据,用于发送1302的
; 控制字或者发送一个数据
;************************************************
;入口参数:DS1302_TIME_TX
;出口参数:无
DS1302_WRITE_BYTE  MOVLW  D8                      ;8位
      MOVWF  DS1302_BYTE_BITCOUNT
DS1302_WRITE_BYTE_TLOP BCF  DS1302_IO                         ;初始值是低电平
      BCF  DS1302_SCLK
      BTFSC  DS1302_TIME_TX,0
      BSF  DS1302_IO
      RRF  DS1302_TIME_TX,F
      BSF  DS1302_SCLK                        ;上升沿发送数据
      DECFSZ  DS1302_BYTE_BITCOUNT,F
      GOTO  DS1302_WRITE_BYTE_TLOP
      BCF  DS1302_SCLK                        ;恢复
      RETURN

;****************** DS1302_READ_BYTE 读取一字节程序*********************
; 作用:读取1302一个字节的数据
; 原理:在SCLK下降沿接收数据,低字节在前,根据I_O的
; 的电平的高低,采取带进位和不带进位右移.
;***********************************************
;入口参数:无
;出口参数:DS1302_TIME_RX
DS1302_READ_BYTE  BSF  STATUS,RP0
      BSF  DS1302_TRISIO   ; I_O 设置为输入
      BCF  STATUS,RP0
      MOVLW  D8
      MOVWF  DS1302_BYTE_BITCOUNT           ;读取8位
DS1302_READ_BYTE_TR1 BCF  DS1302_SCLK                 ;下降沿读取
      BCF  STATUS,C
      BTFSC  DS1302_IO
      BSF  STATUS,C
      RRF  DS1302_TIME_RX,F
      BSF  DS1302_SCLK                  ;恢复高电平
      DECFSZ  DS1302_BYTE_BITCOUNT,F
      GOTO  DS1302_READ_BYTE_TR1
      BSF  STATUS,RP0
      BCF  DS1302_TRISIO           ;I_O恢复为输出
      BCF  STATUS,RP0
      BCF  DS1302_SCLK
      NOP
      RETURN

;********************** DS1302_INIT 初始化程序******************
; DS1302_INIT
; 作用:初始化1302,写使能寄存器
;********************************************************
;入口参数:无
;出口参数:DS1302_TIME_TX
DS1302_INIT   BCF  DS1302_SCLK
     BCF  DS1302_RST                            ;先禁止
     MOVLW  B10001110                  ;写使能寄存器
     MOVWF  DS1302_TIME_TX
     BSF  DS1302_RST                            ;允许1302工作
     CALL  DS1302_WRITE_BYTE                  ;调用写一个数据程序
     MOVLW  00H                           ;允许写使能
     MOVWF  DS1302_TIME_TX
     CALL  DS1302_WRITE_BYTE                  ;发送一个字节的数据
     BCF  DS1302_RST
     RETURN

;********************** DS1302_GET_TIME 读时间程序*************************
; DS1302_GET_TIME
; 作用:一次接受7个字节的时间数据,突发模式读取
; INPUT:NONE
; OUTPUT:把7个时间数据保存在TIME_RX_ADDR开始的7个寄存器里面
;*********************************************************
;入口参数:无
;出口参数:在TIME_RX_ADDR开始的7个寄存器里面
DS1302_GET_TIME   MOVLW   B10111111                ;多字接读取方式
      MOVWF   DS1302_TIME_TX
      BSF   DS1302_RST
      CALL   DS1302_WRITE_BYTE
      MOVLW   DS1302_TIME_RX_ADDR                ;保存数据的起始地址
      MOVWF   FSR
      MOVLW   D7                       ;连续读取7个数据
      MOVWF   DS1302_BUFFER_COUNT
DS1302_GET_TIME_TR2  CALL   DS1302_READ_BYTE
      MOVF   DS1302_TIME_RX,W
      MOVWF   INDF
      INCF   FSR,F
      DECFSZ   DS1302_BUFFER_COUNT,F
      GOTO   DS1302_GET_TIME_TR2
      BCF   DS1302_RST
      RETURN

;*********************** DS1302_SET_TIME 写时间程序 *************************
; DS1302_SET_TIME
; 作用:一次输入7个数据来一次性的设定时间,同时使能写寄存器
; 突发模式写入,必须写入8个数据,不是7个
; INPUT:要设定的8个数据已经写入到 DS1302_TIME_TX_ADDR 开始的8个字节里面
;********************************************************
;入口参数:20H--27H的8个RAM单元
DS1302_SET_TIME   MOVLW   B10111110                 ;多字节写方式
      MOVWF   DS1302_TIME_TX
      BSF   DS1302_RST
      CALL   DS1302_WRITE_BYTE               
      MOVLW   DS1302_TIME_TX_ADDR            ;发送数据的起始地址
      MOVWF   FSR
      MOVLW   D7                        ;一起发送8个数据
      MOVWF   DS1302_BUFFER_COUNT
DS1302_SET_TIME_TW1  MOVF   INDF,W
      MOVWF   DS1302_TIME_TX
      CALL   DS1302_WRITE_BYTE
      INCF   FSR,F
      DECFSZ   DS1302_BUFFER_COUNT,F
      GOTO   DS1302_SET_TIME_TW1
      ;
      MOVLW   00H
      MOVWF   DS1302_TIME_TX
      CALL   DS1302_WRITE_BYTE
      BCF   DS1302_RST
      RETURN

; ****************************************

TABLE_LCD1602_LINE1 DE "    09:22:59",0x00
TABLE_LCD1602_LINE2 DE "WWW.YULEMAO.COM",0x00
TABLE_LCD1602_LINEHZ DE "WWW.蚂蚁.COM",0x00
TABLE_LCD1602_TEST DE "蚂蚁"
    END

[电子技术添加评论 | 评论/阅读(0/694)
评论
昵称
主页
内容
递交


Copyright @ 我的开发笔记     2008 - 2017         粤ICP备19155526号-1