智能终端定制开发 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单片机操作 LCD12864 4bit方式
[电子技术] 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_ON&_HS_OSC

;
ERRORLEVEL -302
;
BAK_W_TEMP    EQU   20H
BAK_STATUS_TEMP   EQU   21H
BAK_PCLATH_TEMP   EQU   22H
;
IDERUN_FLAG    EQU   23H
IDERUN_FLAGB   EQU   00H
;
KEYSCAN_VALUE   EQU   24h  ;暂存按键列码和位置码
;
#DEFINE  KEYBOARD_TRIS  TRISB
#DEFINE  KEYBOARD_PORT  PORTB
#DEFINE  SOUND_OUT PORTC,2
#DEFINE  CLR_WDT_COM CLRWDT
#DEFINE      LCD12864_RS  PORTA,5           ;命令/数据选择   ;H=DATA,L=COM
#DEFINE      LCD12864_RW  PORTA,4           ;读/写选择   ;H=READ,L=WRITE
#DEFINE      LCD12864_E   PORTA,3           ;使能信号
#DEFINE      LCD12864_PSB PORTA,2           ;并口/串口选择(H/L)
#DEFINE      LCD12864_RST PORTA,0           ;复位信号
;

#DEFINE  SPI_CS  PORTC,2       
#DEFINE  SPI_CLK PORTC,3       
#DEFINE  SPI_DI  PORTC,5       
#DEFINE  SPI_D0  PORTC,4       
;
LCD12864_COM    EQU   25H ;控制字暂存单元
LCD12864_DAT    EQU   26H ;显示数据暂存单元
LCD12864_CODER   EQU   27H ;字符代码暂存单元
DELAY_VAR_M    EQU   28H
DELAY_VAR_N    EQU   29H
NUM2ASCII_INBYTE  EQU   2AH

BIN2BCD_LSD       EQU      2BH
BIN2BCD_MSD       EQU      2CH

BIN2ASCII_INBYTE  EQU  2DH 
BIN2ASCII_LSD      EQU     2EH
BIN2ASCII_MSD      EQU     2FH
;
EEPROM_WRITE_ADDR  EQU  30H
EEPROM_WRITE_DATA  EQU  31H
TEMP_VAR_A    EQU  32H
KEYSCAN_CON_COUNTER  EQU  33H
KEYSCAN_CON_KEYVALUE EQU  34H
KEYSCAN_CON_FLAG  EQU  35H
TIMER_MSSAVE_TEMPVAR EQU  36H
BCDTOBIN_X    EQU  37H
BCDTOBIN_TEMP   EQU  38H
;
BIN2BCD_BYINT_LSD      EQU     39H
BIN2BCD_BYINT_MSD      EQU     3AH
;
FLASH_READ_ADDRL  EQU  3BH
FLASH_READ_ADDRH  EQU  3CH
FLASH_READ_DATAL  EQU  3DH
FLASH_READ_DATAH  EQU  3EH
;
LCD12864_LINE_LEN  EQU  3FH
LCD12864_LINE_SHOWADDR EQU  40H
LCD12864_LINE_ADDRL  EQU  41H
LCD12864_LINE_ADDRH  EQU  42H 
MAIN_STATICSHOW_COUNTER EQU  43H
;
KEYSCAN_CON_COUNTER_LIMIT EQU  44H
;
SPI_ADDR    EQU  45H
SPI_READ_DATAH   equ  46h
SPI_READ_DATAL   EQU  47H
SPI_WRITE_DATAH   equ  48h
SPI_WRITE_DATAL   EQU  49H
;
; *********** 复位矢量和中断矢量 ************* ******************
   ORG   0000H
   GOTO  MAIN
WAITING_WDT GOTO  $
;************ 中断服务子程序 ************* ******************
   ORG   0004H
   MOVWF  BAK_W_TEMP
   SWAPF  STATUS,W
   CLRF  STATUS
   MOVWF  BAK_STATUS_TEMP
   MOVF  PCLATH,W
   MOVWF  BAK_PCLATH_TEMP
   CLRF  PCLATH
   ;______________________ //////////////////////
   BCF   STATUS,RP1
   BCF   STATUS,RP0
   BTFSS  PIR1,TMR1IF
   GOTO  INT_CHK_A
   GOTO  INT_P_TMR1
INT_CHK_A BTFSS  PIR1,TMR2IF
   GOTO  INT_P_RET
   GOTO  INT_P_TMR2
   ;--------------///////////////
INT_P_TMR1 
   GOTO  INT_P_RET
   ;
INT_P_TMR2 
   GOTO  INT_P_RET
   ;______________________  ////////////////////
INT_P_RET MOVF  BAK_PCLATH_TEMP,W
   MOVWF  PCLATH
   SWAPF  BAK_STATUS_TEMP,W
   MOVWF  STATUS
   SWAPF  BAK_W_TEMP,F
   SWAPF  BAK_W_TEMP,W
   RETFIE   
;

;************** 主程序 *************** ******************
MAIN  BCF   STATUS,RP1
   BCF   STATUS,RP0
   ;
   MOVLW  IDERUN_FLAGB ;设置是否调试运行的标志
   MOVWF  IDERUN_FLAG
   CLR_WDT_COM
   ; -------------------------------  全局的初始化 -------------
   ;CLRF  STATUS
   MOVLW  B00010000
   ANDWF  STATUS,F
   ;
   CLRF  PORTA
   CLRF  PORTB
   CLRF  PORTC
   CLRF  PORTD
   CLRF  PORTE
   BSF   STATUS,RP0
   MOVLW  00H
   MOVWF  TRISA
   MOVWF  TRISC
   BSF   TRISC,7  ;RC7设置为输入状态 RS232
   BSF   TRISC,6  ;RC6设置为输入状态 RS232
   BSF   TRISC,4  ;RC4设置为输入状态 
   MOVWF  TRISD
   MOVWF  TRISE
   MOVLW  0FFH
   MOVWF  TRISB
   BCF   TRISE,4
   BCF   ADCON1,3
   BSF   ADCON1,2
   BSF   ADCON1,1
   ;BSF  ADCON1,0
   ;
   BCF   STATUS,RP0
   CLRF  INTCON
   CLRF  PIR1 
   CLRF  PIR2  
   BSF   STATUS,RP0
   CLRF  PIE1
   CLRF  PIE2
   BCF   STATUS,RP0
   BSF   INTCON,PEIE
   BSF   INTCON,GIE
   ; -------------------------------  各模块的初始化 -------------
   ;看门狗参数设置
   BSF   STATUS,RP0
   MOVLW  B00001111 ;分频器分配给 WDT ,分频比为 128
   MOVWF  OPTION_REG
   BCF   STATUS,RP0
   ;RS232 串口初始化
   BSF   STATUS,RP0
   BSF   TRISC,7  ;RC7设置为输入状态
   BSF   TRISC,6  ;RC6设置为输入状态
   MOVLW  D25 
   MOVWF  SPBRG
   MOVLW  B00100100 ;设定 8bit发送 发送器使能 异步方式 高速率方式
   MOVWF  TXSTA 
   BCF   PIE1,TXIE
   BCF   PIE1,RCIE
   BCF   STATUS,RP0
   MOVLW  B10000000  ;设置 8bit接收 接收器关掉 串行端口使能
   MOVWF  RCSTA
   ;
   ;MOVLW  0F6H
   ;MOVWF  BIN2ASCII_INBYTE
   ;CALL  BIN2ASCII
   ; SPI 端口的初始化
   ;BSF  STATUS,RP0
   ;MOVLW   B10000000      
     ;MOVWF   SSPSTAT  
   ;BCF  STATUS,RP0            
     ;BCF     SPI_CS              
     ;MOVLW   B00110001    
     ;MOVWF   SSPCON  
   ;BCF      PIR1,SSPIF
   ;NOP
   ;CALL SPI_EWEN
   ;
   ;KEY BOARD INIT
   BCF   STATUS,RP0
   CLRF  KEYSCAN_CON_COUNTER
   CLRF  KEYSCAN_CON_COUNTER_LIMIT
   MOVLW  0FFH
   MOVWF  KEYSCAN_CON_KEYVALUE
   CLRF  KEYSCAN_CON_FLAG
   ;OTHERS INIT
   BCF   STATUS,RP0
   
   ;LCD DISPLAY INIT
   CALL  LCD12864_INI
   MOVLW  D55
   MOVWF  MAIN_STATICSHOW_COUNTER
   ; BEEP SOUND
   CALL  SOUND_1000HZ
   CALL  DELAY_100MS
   CALL  DELAY_50MS
   ; RESET REASON CHECK
   BCF   STATUS,RP0
   BTFSC  STATUS,NOT_TO
   GOTO  MAIN_STEP2
   CLRWDT  ;BSF   STATUS,NOT_TO
   ;
   GOTO  MAIN_LOOP  ; @@@@@!!!!  RESET BY WDT
   ;
   ; -------------------------------------------------------------------
MAIN_STEP2  ;
    ; BEEP SOUND
    CALL  SOUND_1000HZ
    CALL  LCD12864_WRITE_LINE1
    ;
MAIN_LOOP  CLR_WDT_COM 
    INCF  MAIN_STATICSHOW_COUNTER ,1
    BTFSS  STATUS,Z
    GOTO  MAIN_LOOPNEXT
    MOVLW  D55
    MOVWF  MAIN_STATICSHOW_COUNTER
     
MAIN_LOOPNEXT CALL  KEYCHECK
    GOTO  MAIN_LOOP
;

; ********* LCD12864_WRITE_LINE1************
LCD12864_WRITE_LINE1 NOP
      MOVLW #81H
      MOVWF LCD12864_LINE_SHOWADDR
      ;MOVLW D4
      ;MOVWF LCD12864_LINE_LEN
      MOVLW LOW(TABLE_LCD12864_LINE1)
      MOVWF LCD12864_LINE_ADDRL
      MOVLW HIGH(TABLE_LCD12864_LINE1)
      MOVWF LCD12864_LINE_ADDRH
      CALL LCD12864_WRITE_LINE_EX
      RETURN
    
 
;******************** 擦写禁止使能操作 SPI_EWDS  *************************
;
SPI_EWDS   BSF     SPI_CS                 
     ;NOP
     ;NOP            
     ;           
     MOVLW   B00000001  
     CALL    SPI_COMM    
     MOVLW   B00000000     
     CALL    SPI_COMM  
     ;      
     BCF     SPI_CS               
     NOP
     NOP                      
     ;
     RETURN

;******************** 擦写使能操作 SPI_EWEN  *************************
;
SPI_EWEN   BSF     SPI_CS                 
     ;NOP
     ;NOP            
     ;           
      MOVLW   B00000001  
      CALL    SPI_COMM    
      MOVLW   B00110000     
      CALL    SPI_COMM  
      ;      
     BCF     SPI_CS               
     NOP
     NOP                      
     ;
     RETURN

; ****************** 写入操作 SPI_WRITE **************
;input:SPI_ADDR,    SPI_WRITE_DATAH, SPI_WRITE_DATAL  
;output:
SPI_WRITE   ;BSF  SSPCON,CKP
     BSF     SPI_CS  
     NOP
     NOP           
      MOVLW   B00000001     
      CALL    SPI_COMM     
      ;   
      MOVF   SPI_ADDR ,W    
      IORLW   B01000000
      CALL    SPI_COMM
      ;
      MOVF   SPI_WRITE_DATAH,W
      CALL    SPI_COMM
      MOVF   SPI_WRITE_DATAL,W
      CALL    SPI_COMM  
      ;      
     BCF     SPI_CS     ; 锁存命令
     NOP
     NOP
     NOP   
      ;                  
     BSF     SPI_CS     ; 启动写操作          
     NOP
     NOP
     BTFSS    SPI_D0
     GOTO     $-1             
     BCF      SPI_CS             ; 写操作完成后,恢复CS低电平
     NOP
     NOP                     
     RETURN


;****************** 读出操作 SPI_READ **************************** 
;input:SPI_ADDR
;ooutput:SPI_READ_DATAH, SPI_READ_DATAL 
SPI_READ   BSF      SPI_CS
     NOP
     NOP                     
      ;BSF  SSPCON,CKP
       MOVLW    B00000001    
       CALL     SPI_COMM
       ;
       MOVF    SPI_ADDR  , W
       IORLW    B10000000
       CALL     SPI_COMM
       ;
      ;BCF  SSPCON,CKP
      ;
      MOVLW    00H
      CALL     SPI_COMM 
      MOVWF    SPI_READ_DATAH  
      MOVLW    00H
      CALL     SPI_COMM   
      MOVWF    SPI_READ_DATAL
      NOP
     ;
     BCF      SPI_CS                ; 锁存命令
     NOP
     NOP
    
     RETURN 

;***************** SPI_COMM ****************************
; INOUT : W
; OUTPUT: W
SPI_COMM2  MOVWF    SSPBUF         
    BTFSS    PIR1,SSPIF     
    GOTO     $-1            
    BCF      PIR1,SSPIF      
    MOVF     SSPBUF,W  
    NOP   
    RETURN              

;***************** SPI_COMM ****************************
SPI_COMM  MOVWF    SSPBUF         
SPI_COMM_LP1 BCF    STATUS,RP1
    BSF    STATUS,RP0
    BTFSS     SSPSTAT,BF  
    GOTO      SPI_COMM_LP1          
    BCF       STATUS,RP0
    MOVF      SSPBUF,W 
    NOP    
    RETURN 

;***************  等待RS232发送完成上一个字节  ********
RS232_CHK_TXFREE BTFSS  PIR1,TXIF
     GOTO  RS232_CHK_TXFREE
     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  KEYBOARD_TRIS   ;将其设为高四位输出,低四位输入
   BCF   STATUS,RP0  ;恢复到文件寄存器体0
   MOVLW  00H    ;4条行线全部输出0
   MOVWF  KEYBOARD_PORT
   NOP       ;等待状态稳定下来
   NOP       
   MOVF  KEYBOARD_PORT,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  KEYBOARD_TRIS   ;改变位低四位输出 高四位输入
   BCF   STATUS,RP0  ;恢复为文件寄存器体0
   MOVF  KEYSCAN_VALUE,0  ;读取列码
   MOVWF  KEYBOARD_PORT   ;在经过列线输出
   NOP       ;等待输出状态稳定下来
   NOP
   MOVF  KEYBOARD_PORT,0   ;读取行线状态
   ANDLW  0F0H   ;屏蔽掉低四位
   IORWF  KEYSCAN_VALUE,1  ;将行码和列码组合起来放入VALUE
   RETURN      ;子程序返回
   ;
KEYNO  MOVLW  0FFH   ;建立一个标志值, 表明无键按下
   MOVWF  KEYSCAN_VALUE   ;
   RETURN      ;子程序返回
;
;********************* 按键动作处理子程序 *********
;入口参数:键值位置码保存在  KEYSCAN_VALUE
;**************************************************
KEYACTION_PROCESS ; 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  15H
   MOVWF  SPI_ADDR
   MOVLW  D90
   MOVWF  SPI_WRITE_DATAH
   MOVLW  D12
   MOVWF  SPI_WRITE_DATAL
   CALL  SPI_WRITE
   CALL  SOUND_1000HZ
   RETURN
   ;
KEYB7  CALL  DISPLAY_EEPROM
   RETURN
   ;
KEYD7  MOVLW  15H
   MOVWF  SPI_ADDR
   MOVLW  D12
   MOVWF  SPI_WRITE_DATAH
   MOVLW  D34
   MOVWF  SPI_WRITE_DATAL
   CALL  SPI_WRITE
   CALL  SOUND_1000HZ
   RETURN
   ;
KEYE7  MOVLW  15H
   MOVWF  SPI_ADDR
   MOVLW  D56
   MOVWF  SPI_WRITE_DATAH
   MOVLW  D78
   MOVWF  SPI_WRITE_DATAL
   CALL  SPI_WRITE
   CALL  SOUND_1000HZ
   RETURN
   ; ---------------------
KEY7B  
   RETURN
   ;
KEYBB  
   RETURN
   ;
KEYDB 
   RETURN
   ;
KEYEB  
   RETURN
   ; ----------------------------------
KEY7D  
   RETURN
   ;
KEYBD  
   RETURN
   ;
KEYDD  
   RETURN
   ;
KEYED  
   RETURN
   ; -----------------
KEY7E  CALL  LCD12864_CLEAR_P
   CALL  SOUND_1000HZ
   NOP
   MOVLW  #80H
   MOVWF  LCD12864_LINE_SHOWADDR
   MOVLW  LOW(TABLE_LCD12864_LINEDAY)
   MOVWF  LCD12864_LINE_ADDRL
   MOVLW  HIGH(TABLE_LCD12864_LINEDAY)
   MOVWF  LCD12864_LINE_ADDRH
   CALL  LCD12864_WRITE_LINE_EX
   ;
   MOVLW  #90H
   MOVWF  LCD12864_LINE_SHOWADDR
   MOVLW  LOW(TABLE_LCD12864_LINESEA)
   MOVWF  LCD12864_LINE_ADDRL
   MOVLW  HIGH(TABLE_LCD12864_LINESEA)
   MOVWF  LCD12864_LINE_ADDRH
   CALL  LCD12864_WRITE_LINE_EX
   ;
   MOVLW  #88H
   MOVWF  LCD12864_LINE_SHOWADDR
   MOVLW  LOW(TABLE_LCD12864_LINEEYE)
   MOVWF  LCD12864_LINE_ADDRL
   MOVLW  HIGH(TABLE_LCD12864_LINEEYE)
   MOVWF  LCD12864_LINE_ADDRH
   CALL  LCD12864_WRITE_LINE_EX
   ;
   MOVLW  #98H
   MOVWF  LCD12864_LINE_SHOWADDR
   MOVLW  LOW(TABLE_LCD12864_LINEUP)
   MOVWF  LCD12864_LINE_ADDRL
   MOVLW  HIGH(TABLE_LCD12864_LINEUP)
   MOVWF  LCD12864_LINE_ADDRH
   CALL  LCD12864_WRITE_LINE_EX
   ;
   RETURN
   ;
KEYBE  RETURN
KEYDE  RETURN
KEYEE  RETURN
   ; -----------------
   RETURN

; ************************ DISPLAY_EEPROM **********************************
;
DISPLAY_EEPROM MOVLW  15H
    MOVWF  SPI_ADDR
    CLRF  SPI_READ_DATAH
    CLRF  SPI_READ_DATAL
    CALL  SPI_READ
    ;
    CALL   RS232_CHK_TXFREE
    MOVF  SPI_READ_DATAH ,0
    MOVWF  TXREG
    CALL   RS232_CHK_TXFREE
    MOVF  SPI_READ_DATAL ,0
    MOVWF  TXREG
    ;
    CALL  LCD12864_CLEAR_P
    MOVLW   92H
    MOVWF  LCD12864_COM
    CALL  LCD12864_WRITECOM
    ;
    MOVF  SPI_READ_DATAH ,W
    MOVWF  BIN2ASCII_INBYTE
    CALL  BIN2ASCII
    MOVF  BIN2ASCII_MSD,0   
    MOVWF  LCD12864_CODER
    CALL  LCD12864_WRITECODE
    MOVF  BIN2ASCII_LSD,0   
    MOVWF  LCD12864_CODER
    CALL  LCD12864_WRITECODE
    ;
    MOVF  SPI_READ_DATAL ,W
    MOVWF  BIN2ASCII_INBYTE
    CALL  BIN2ASCII
    MOVF  BIN2ASCII_MSD,0   
    MOVWF  LCD12864_CODER
    CALL  LCD12864_WRITECODE
    MOVF  BIN2ASCII_LSD,0   
    MOVWF  LCD12864_CODER
    CALL  LCD12864_WRITECODE
    ;
    CALL  SOUND_1000HZ


; ***************  读取 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

; ************** LCD12864_WRTITE_LINE **************************
;
LCD12864_WRITE_LINE  MOVF  LCD12864_LINE_SHOWADDR,0
      MOVWF LCD12864_COM
      CALL LCD12864_WRITECOM
      ;
      MOVF  LCD12864_LINE_ADDRL ,0
      MOVWF  FLASH_READ_ADDRL
      MOVF  LCD12864_LINE_ADDRH ,0
      MOVWF  FLASH_READ_ADDRH
      ;
LCD12864_WRITE_LINE_LOOP CALL  FLASH_READ
      MOVF  FLASH_READ_DATAL,0   
      MOVWF  LCD12864_CODER
      CALL  LCD12864_WRITECODE
        DECF  LCD12864_LINE_LEN 
      BTFSC  STATUS,Z
      RETURN
      MOVLW  01H
      ADDWF  FLASH_READ_ADDRL,1
      BTFSC  STATUS,C
      INCF  FLASH_READ_ADDRH
      GOTO  LCD12864_WRITE_LINE_LOOP      
      RETURN

 

; ************** LCD12864_WRTITE_LINE_EX **************************
;
LCD12864_WRITE_LINE_EX  MOVF  LCD12864_LINE_SHOWADDR,0
       MOVWF LCD12864_COM
       CALL LCD12864_WRITECOM
       ;
       MOVF  LCD12864_LINE_ADDRL ,0
       MOVWF  FLASH_READ_ADDRL
       MOVF  LCD12864_LINE_ADDRH ,0
       MOVWF  FLASH_READ_ADDRH
       ;
LCD12864_WRITE_LINE_EX_LOOP CALL  FLASH_READ
       MOVLW  00H
       ADDWF  FLASH_READ_DATAL,W
       BTFSC  STATUS,Z
       RETURN
       ;
       MOVF  FLASH_READ_DATAL,0
       MOVWF  LCD12864_CODER
       CALL  LCD12864_WRITECODE
       ;
       MOVLW  01H
       ADDWF  FLASH_READ_ADDRL,1
       BTFSC  STATUS,C
       INCF  FLASH_READ_ADDRH
       GOTO  LCD12864_WRITE_LINE_EX_LOOP     
       RETURN

 

;***************  LCD初始化子程序 ****************
LCD12864_INI BCF       LCD12864_RST                       ;复位LCD
     CALL      DELAY_100MS                    ;延时一段时间
    CALL      DELAY_100MS
     BSF       LCD12864_RST                       ;清除复位信号
    CALL      DELAY_100MS
     NOP
     BSF       LCD12864_PSB                       ;并口通讯
    ;
    BCF   LCD12864_RS
    BCF   LCD12864_RW
    BCF   LCD12864_E
    CALL      DELAY_100MS
    ;
    ;MOVLW   #30H     ;基本指令,8-bit 模式,基本指令
    MOVLW   #20H     ;基本指令,4-bit 模式,基本指令
    MOVWF  LCD12864_COM
    CALL   LCD12864_WRITECOM_48
    CALL      DELAY_5MS
    ;
    MOVLW   #20H    
    MOVWF  LCD12864_COM
    CALL   LCD12864_WRITECOM
    ;   ;
    MOVlw  #0CH     ;显示开,游标关,反白关
    MOVWF  LCD12864_COM
    CALL   LCD12864_WRITECOM
    MOVLW  #01H    ;清除显示
    MOVWF  LCD12864_COM
    CALL   LCD12864_WRITECOM
    MOVLW  #06H ;进入设定点,游标7 右移,画面不移动
    MOVWF  LCD12864_COM
    CALL   LCD12864_WRITECOM
    RETURN

;************************送数据到LCD***********************
;写数据子程序 LCD12864_CODER
;RS=1,RW=0,E=高脉冲,D0-D7=数据
;**********************************************************
LCD12864_WRITECODE  MOVLW 0FFH
     MOVWF PORTD
     ;
     CALL   LCD12864_CHKBUSY                     ;判断总线是否忙
     BSF    LCD12864_RS
     BCF    LCD12864_RW
     MOVF   LCD12864_CODER , 0
     MOVWF  PORTD                        ;送出数据
     BSF    LCD12864_E
     NOP
     NOP
     NOP
     NOP
     BCF    LCD12864_E
     NOP
     NOP
     NOP
     NOP
     SWAPF PORTD,F
     BSF      LCD12864_E  
     NOP
     NOP
     NOP
     NOP
     BCF      LCD12864_E
     NOP
     NOP
     NOP
     NOP
     SWAPF PORTD,F
     RETURN
;************************送命令到LCD***********************
;写指令子程序 LCD12864_COM
;RS=0,RW=0,E=高脉冲,D0-D7=指令码
;**********************************************************
LCD12864_WRITECOM MOVLW 0FFH
     MOVWF PORTD
     ;
     CALL   LCD12864_CHKBUSY                    ;判断总线是否忙
     BCF    LCD12864_RS
     BCF    LCD12864_RW
     MOVF  LCD12864_COM ,0
     MOVWF  PORTD                       ;送命令
     BSF    LCD12864_E
     NOP
     NOP
     NOP
     NOP
     BCF    LCD12864_E
     NOP
     NOP
     NOP
     NOP
     SWAPF PORTD,F
     BSF      LCD12864_E  
     NOP
     NOP
     NOP
     NOP
     BCF      LCD12864_E
     NOP
     NOP
     NOP
     NOP
     SWAPF PORTD,F
     RETURN


;************************送4线或8线选择命令到LCD***********************
;写指令子程序 LCD12864_WRITECOM_48
;RS=0,RW=0,E=高脉冲,D0-D7=指令码
;**********************************************************
LCD12864_WRITECOM_48 MOVLW 0FFH
     MOVWF PORTD
     ;
     BCF    LCD12864_RS
     BCF    LCD12864_RW
     MOVF  LCD12864_COM ,0
     MOVWF  PORTD                       ;送命令
     BSF    LCD12864_E
     NOP
     NOP
     NOP
     NOP
     BCF    LCD12864_E
     NOP
     NOP
     RETURN

;************************判断LCD总线是否忙********************
;测忙碌子程序
;RS=0,RW=1,E=H,D0-D7=状态字
;**********************************************************
LCD12864_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      LCD12864_RS
     BSF      LCD12864_RW
LCD12864_CHKBUSY_A  CLR_WDT_COM;NOP
     NOP
     NOP
     BSF      LCD12864_E
     NOP
     NOP
     NOP
     BTFSS    PORTD,7                  ;D7为高表示总线忙,为低表示总线空闲
     GOTO     LCD12864_CHKBUSY_B;$+6    
     NOP
     NOP
     NOP
     BCF      LCD12864_E
     NOP
     NOP
     NOP
     BSF      LCD12864_E  
     NOP
     NOP
     NOP
     BCF      LCD12864_E
     GOTO     LCD12864_CHKBUSY_A
LCD12864_CHKBUSY_B  BCF      LCD12864_E
     NOP
     NOP
     NOP
     BSF      LCD12864_E  
     NOP
     NOP
     NOP
     BCF      LCD12864_E
     ;BANKSEL  TRISD
     BSF  STATUS,RP0
     CLRF     TRISD                     ;恢复D口为输出
     BCF  STATUS,RP0
     CLRF     STATUS
     RETURN
     ;
;***********************LCD清屏*******************************
LCD12864_CLEAR_P   MOVLW  #01H              ;清除显示
      MOVWF LCD12864_COM
      CALL   LCD12864_WRITECOM
      RETURN

;***************** SOUND_1000HZ 100MS子函数 *****************
SOUND_1000HZ  CLR_WDT_COM
     NOP
     MOVLW  D100
     MOVWF  DELAY_VAR_M
     BCF   SOUND_OUT
SOUND_1000HZ_1  ; 1 during 500 um
     BSF   SOUND_OUT
     MOVLW  D165
     MOVWF  DELAY_VAR_N
     DECFSZ  DELAY_VAR_N,1
     GOTO  $-1
     ; 0 during 500 um
     BCF   SOUND_OUT
     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 CLR_WDT_COM
   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 CLR_WDT_COM
   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  CLR_WDT_COM
   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  CLR_WDT_COM
   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 CLR_WDT_COM
   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

;****************  专门给中断程序调用的处理子程序  BIN2BCD_BYINT ******************
;目的是减少中断保护现场的处理时间,以减少引起定时误差的环节
;
BIN2BCD_BYINT     CLRF    BIN2BCD_BYINT_MSD
      MOVWF   BIN2BCD_BYINT_LSD
BIN2BCD_BYINT_GTENTH   MOVLW   .10
      SUBWF   BIN2BCD_BYINT_LSD,W
      BTFSS   STATUS, C    ;CARRY
      RETURN
      MOVWF   BIN2BCD_BYINT_LSD
      INCF    BIN2BCD_BYINT_MSD
      GOTO    BIN2BCD_BYINT_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
;
; *******  (0-9)单个十六进制数字转ASCII码值 **************************
; 入口参数  NUM2ASCII_INBYTE  只运算低四位
; 出口参数  NUM2ASCII_INBYTE
;********************************************
NUM2ASCII  ;BCF  NUM2ASCII_INBYTE,7
    ;BCF  NUM2ASCII_INBYTE,6
    ;BCF  NUM2ASCII_INBYTE,5
    ;BCF  NUM2ASCII_INBYTE,4
    MOVLW  B00001111
    ANDWF  NUM2ASCII_INBYTE,F
    ;
    MOVLW  D10
    SUBWF  NUM2ASCII_INBYTE,W
    BTFSS  STATUS,C
    GOTO  NUM2ASCII_A48
    MOVLW  D55
    ADDWF  NUM2ASCII_INBYTE,1  
    RETURN
NUM2ASCII_A48 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
; ***************************************
;
TABLE_LCD12864_LINE1 DE "EEPROM TEST",0x00
TABLE_LCD12864_LINEOK DE "写入完成6789",0x00
TABLE_LCD12864_LINETEST DE "哈哈测试LCD 显示",0x00
TABLE_LCD12864_LINEDAY DE "白日依山尽,",0x00
TABLE_LCD12864_LINESEA DE "黄河入海流。",0x00
TABLE_LCD12864_LINEEYE DE "欲穷千里目,",0x00
TABLE_LCD12864_LINEUP DE "更上一层楼。",0x00
;*************************************
    ;ORG  0D00H  ; PAGE 1
    ;BCF  PCLATH,4
    ;BCF  PCLATH,3
    ;GOTO WAITING_WDT
    ;
    ;ORG  1300H  ; PAGE 2
    ;BCF  PCLATH,4
    ;BCF  PCLATH,3
    ;GOTO WAITING_WDT
    ;
    ;ORG  1D00H  ; PAGE 3
    ;BCF  PCLATH,4
    ;BCF  PCLATH,3
    ;GOTO WAITING_WDT
    ;
    ;ORG  1FF0H  ; END
    ;BCF  PCLATH,4  
    ;BCF  PCLATH,3  
    ;GOTO WAITING_WDT
    END 

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


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