📄 i2ceeprom.asm
字号:
; This file was generated by C2C-plus compiler version 4.00.3e
include "p16F873.inc"
;Variables *****************************************
_code_tmp_0000 equ 0x20
_code_tmp_0001 equ 0x21
param00_delay_ms equ 0x22
param00_delay_us equ 0x24
_Tecla equ 0x25
_Temp equ 0x26
_Temp1 equ 0x27
_Temp2 equ 0x28
_Pulsada equ 0x29
_dir equ 0x2a
param00_LCD_Dato equ 0x2b
param00_LCD_Comando equ 0x2c
param00_I2C_Envia equ 0x2d
param00_I2C_Ack equ 0x2e
_PIE1 equ 0x8c
_PIR1 equ 0x0c
_SSPBUF equ 0x13
_SSPCON equ 0x14
_SSPCON2 equ 0x91
_SSPADD equ 0x93
_SSPSTAT equ 0x94
_ADCON0 equ 0x1f
_ADCON1 equ 0x9f
_ADRESL equ 0x9e
_ADRESH equ 0x1e
ORG 0
clrf PCLATH
goto start__code
_LCD_Prepara
goto _LCD_Prepara__code
_LCD_Busy
goto _LCD_Busy__code
_LCD_Dato
goto _LCD_Dato__code
_delay_us
goto _delay_us__code
_LCD_Comando
goto _LCD_Comando__code
_LCD_Ini
goto _LCD_Ini__code
_delay_ms
goto _delay_ms__code
_Lee_Tecla
goto _Lee_Tecla__code
_I2C_Start
goto _I2C_Start__code
_I2C_Stop
goto _I2C_Stop__code
_I2C_Envia
goto _I2C_Envia__code
_I2C_Recibe
goto _I2C_Recibe__code
_I2C_Ack
goto _I2C_Ack__code
start__code
;;;;;;;;// Ejemplo simple que muestra el funcionamiento del puerto I2C.
;;;;;;;;// Envia la entrada del teclado a la eeprom (PCF8582) y al pulsar la tecla 0xF los lee.
;;;;;;;;// Fernando Pardo 2001
;;;;;;;;
;;;;;;;;#define ESCLAVO 10100000b
;;;;;;;;
;;;;;;;;char PIE1@0x8C;
;;;;;;;;char PIR1@0x0C;
;;;;;;;;char SSPBUF@0x13;
;;;;;;;;char SSPCON@0x14;
;;;;;;;;char SSPCON2@0x91;
;;;;;;;;char SSPADD@0x93;
;;;;;;;;char SSPSTAT@0x94;
;;;;;;;;
;;;;;;;;char ADCON0@0x1F; // Registro ADCON0
;;;;;;;;char ADCON1@0x9F; // Direccion del registro ADCON1
;;;;;;;;char ADRESL@0x9E;
;;;;;;;;char ADRESH@0x1E;
;;;;;;;;
;;;;;;;;char Tecla;
;;;;;;;;char Temp,Temp1,Temp2;
;;;;;;;;char Pulsada;
;;;;;;;;char dir;
;;;;;;;;
;;;;;;;;
;;;;;;;;
;;;;;;;;
;;;;;;;;main()
_main__code
;;;;;;;;{
;;;;;;;; LCD_Prepara();
call _LCD_Prepara
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; LCD_Ini();
call _LCD_Ini
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; LCD_Comando(00111100b); // 8 bits, 2 lineas, 5x10 font
movlw D'60'
bcf STATUS, RP0
movwf param00_LCD_Comando
call _LCD_Comando
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; LCD_Comando(00001111b); // Disp On, Cursor On, Blink On
movlw D'15'
bcf STATUS, RP0
movwf param00_LCD_Comando
call _LCD_Comando
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;;
;;;;;;;; output_port_c(0);
bcf STATUS, RP0
clrf PORTC
;;;;;;;; set_tris_c(0x11111111b); // Todo inputs
movlw D'27'
bsf STATUS, RP0
movwf TRISC
;;;;;;;; SSPSTAT=10000000b; // Slew rate disables (100 KHz)
movlw D'128'
movwf _SSPSTAT
;;;;;;;; SSPADD=9; // divisor del reloj en master mode (9 para 100 KHz)
movlw D'9'
movwf _SSPADD
;;;;;;;; SSPCON=00101000b; // I2C enabled, 7 bits direc, master
movlw D'40'
bcf STATUS, RP0
movwf _SSPCON
;;;;;;;; Pulsada=0;
clrf _Pulsada
;;;;;;;;
;;;;;;;; while (1)
label_0023
;;;;;;;; {
;;;;;;;; dir=0;
bcf STATUS, RP0
clrf _dir
;;;;;;;; Tecla=0;
clrf _Tecla
;;;;;;;; while (Tecla!=0xF)
label_0025
bcf STATUS, RP0
movf _Tecla, W
sublw D'15'
movlw 1
btfsc STATUS, Z
clrw
sublw 0
btfsc STATUS, Z
goto label_0026
;;;;;;;; {
;;;;;;;; Lee_Tecla();
call _Lee_Tecla
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; if (Tecla<16)
movlw D'16'
bcf STATUS, RP0
subwf _Tecla, W
movlw 1
btfsc STATUS, C
clrw
sublw 0
btfsc STATUS, Z
goto label_0027
;;;;;;;; {
;;;;;;;; if (!Pulsada)
movf _Pulsada, F
movlw 1
btfss STATUS, Z
clrw
label_0030
sublw 0
btfsc STATUS, Z
goto label_0028
;;;;;;;; {
;;;;;;;; Pulsada=1;
movlw D'1'
bcf STATUS, RP0
movwf _Pulsada
;;;;;;;; if (Tecla<10) LCD_Dato(Tecla+'0');
movlw D'10'
subwf _Tecla, W
movlw 1
btfsc STATUS, C
clrw
sublw 0
btfsc STATUS, Z
goto label_0031
clrf _code_tmp_0000
movf _Tecla, W
addlw D'48'
btfsc STATUS, C
incf _code_tmp_0000 , F
movwf param00_LCD_Dato
call _LCD_Dato
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; else LCD_Dato(Tecla+55); // 55='A'-10
goto label_0032
label_0031
bcf STATUS, RP0
clrf _code_tmp_0000
movf _Tecla, W
addlw D'55'
btfsc STATUS, C
incf _code_tmp_0000 , F
movwf param00_LCD_Dato
call _LCD_Dato
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;;
;;;;;;;; I2C_Start();
label_0032
call _I2C_Start
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; I2C_Envia(ESCLAVO); // Envia la direccion del esclavo
movlw D'160'
bcf STATUS, RP0
movwf param00_I2C_Envia
call _I2C_Envia
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; I2C_Envia(dir); // Envia Direccion
bcf STATUS, RP0
movf _dir, W
movwf param00_I2C_Envia
call _I2C_Envia
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; I2C_Envia(Tecla); // Envia Tecla
bcf STATUS, RP0
movf _Tecla, W
movwf param00_I2C_Envia
call _I2C_Envia
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; I2C_Stop();
call _I2C_Stop
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; dir++;
bcf STATUS, RP0
incf _dir, F
;;;;;;;; }
;;;;;;;; }
label_0028
;;;;;;;; else
goto label_0033
label_0027
;;;;;;;; {
;;;;;;;; if (Pulsada)
bcf STATUS, RP0
movf _Pulsada, W
btfsc STATUS, Z
goto label_0034
;;;;;;;; {
;;;;;;;; Pulsada=0;
clrf _Pulsada
;;;;;;;; }
;;;;;;;; }
label_0034
;;;;;;;; delay_ms(10); // Para evitar rebotes
label_0033
movlw D'10'
bcf STATUS, RP0
movwf param00_delay_ms
call _delay_ms
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; }
;;;;;;;; LCD_Comando(11000000b); // Segunda linea del LCD
goto label_0025
label_0026
movlw D'192'
bcf STATUS, RP0
movwf param00_LCD_Comando
call _LCD_Comando
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; dir=0; // ahora se dispone a leer lo escrito
bcf STATUS, RP0
clrf _dir
;;;;;;;; I2C_Start();
call _I2C_Start
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; I2C_Envia(ESCLAVO); // Envia la direccion del esclavo
movlw D'160'
bcf STATUS, RP0
movwf param00_I2C_Envia
call _I2C_Envia
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; I2C_Envia(dir); // Envia Direccion a la eeprom
bcf STATUS, RP0
movf _dir, W
movwf param00_I2C_Envia
call _I2C_Envia
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; I2C_Stop();
call _I2C_Stop
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;;
;;;;;;;; I2C_Start();
call _I2C_Start
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; I2C_Envia(ESCLAVO | 1); // Envia la direccion del esclavo para LEER
movlw D'161'
bcf STATUS, RP0
movwf param00_I2C_Envia
call _I2C_Envia
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; Tecla=0;
bcf STATUS, RP0
clrf _Tecla
;;;;;;;; while (Tecla!=0xF)
label_0035
bcf STATUS, RP0
movf _Tecla, W
sublw D'15'
movlw 1
btfsc STATUS, Z
clrw
sublw 0
btfsc STATUS, Z
goto label_0036
;;;;;;;; {
;;;;;;;; Tecla=I2C_Recibe(); // Lee Tecla
call _I2C_Recibe
bcf PCLATH, 3
bcf PCLATH, 4
bcf STATUS, RP0
movwf _Tecla
;;;;;;;; if (Tecla<10) LCD_Dato(Tecla+'0');
movlw D'10'
subwf _Tecla, W
movlw 1
btfsc STATUS, C
clrw
sublw 0
btfsc STATUS, Z
goto label_0037
clrf _code_tmp_0000
movf _Tecla, W
addlw D'48'
btfsc STATUS, C
incf _code_tmp_0000 , F
movwf param00_LCD_Dato
call _LCD_Dato
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; else LCD_Dato(Tecla+55); // 55='A'-10
goto label_0038
label_0037
bcf STATUS, RP0
clrf _code_tmp_0000
movf _Tecla, W
addlw D'55'
btfsc STATUS, C
incf _code_tmp_0000 , F
movwf param00_LCD_Dato
call _LCD_Dato
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; if (Tecla==0xF) I2C_Ack(1); // _reconocimiento=1
label_0038
bcf STATUS, RP0
movf _Tecla, W
sublw D'15'
movlw 1
btfss STATUS, Z
clrw
sublw 0
btfsc STATUS, Z
goto label_0039
movlw D'1'
movwf param00_I2C_Ack
call _I2C_Ack
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; else I2C_Ack(0); // _reconocimiento=0
goto label_0040
label_0039
bcf STATUS, RP0
clrf param00_I2C_Ack
call _I2C_Ack
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; }
label_0040
;;;;;;;; I2C_Stop();
goto label_0035
label_0036
call _I2C_Stop
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; LCD_Comando(00000010b); // A home sin borrar
movlw D'2'
bcf STATUS, RP0
movwf param00_LCD_Comando
call _LCD_Comando
bcf PCLATH, 3
bcf PCLATH, 4
;;;;;;;; }
;;;;;;;;}
goto label_0023
label_0024
_main__end
;;;;;;;;
;;;;;;;;#include "lcd.h"
_LCD_Prepara__code
bcf STATUS, RP0
clrf PORTA
movlw D'248'
bsf STATUS, RP0
movwf TRISA
movlw D'6'
movwf _ADCON1
bcf STATUS, RP0
bcf PORTA, 0
bcf PORTA, 2
bcf PORTA, 1
bsf STATUS, RP0
clrf TRISB
return
_LCD_Prepara__end
_LCD_Busy__code
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -