⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2ceeprom.asm

📁 pic系列单片机得控制程序 主要进行温度采集和转换控制
💻 ASM
📖 第 1 页 / 共 2 页
字号:
; 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 + -