Lập trình hiển thị lên LCD 16x2

Chị cho em hỏi là em copy cái Souce code (lcd_1_main.c) và build chương trình thì nó báo lỗi này:

Error [1098] E:\PIC project\LCD\lcd_1_main.c; 90. conflicting declarations for variable "_lcd_clear" (E:\PIC project\LCD\lcd.c:73)

********** Build failed! **********

vậy em phải sửa lại như thế nào?
 

2death

Cố Vấn CLB
Staff member
Chị cho em hỏi là em copy cái Souce code (lcd_1_main.c) và build chương trình thì nó báo lỗi này:

Error [1098] E:\PIC project\LCD\lcd_1_main.c; 90. conflicting declarations for variable "_lcd_clear" (E:\PIC project\LCD\lcd.c:73)

********** Build failed! **********

vậy em phải sửa lại như thế nào?
Em download lại 2 file lcd.h và lcd.c ở link bài học trên, copy vào thư mục em tạo project (xoá file cũ đi), add lại vào project rồi build lại xem.
Có thể file lcd.c cũ của em thiếu mất hàm lcd_clear()
 

marukuchibi

Trứng gà
e cũng bị lỗi tương tự...Error [499] ; 0. undefined symbol:
_lcd_int(bai1.obj)
e lấy 2 file trên link copy vào rồi mà vẫn vậy...
 

2death

Cố Vấn CLB
Staff member
e cũng bị lỗi tương tự...Error [499] ; 0. undefined symbol:
_lcd_int(bai1.obj)
e lấy 2 file trên link copy vào rồi mà vẫn vậy...
lcd_init() chứ nhỉ, hình như em viết sai dòng này.
 

marukuchibi

Trứng gà
hix! e viết đúng như cái code sẵn của CLB mà nó ra lỗi thế thì e cũng bó tay....chịu!!
 

Rebirth

Cố Vấn CLB
Staff member
Em đã viết sai chỗ lcd_init() như chị 2death nói đấy.
 

tronghaj

Trứng gà
máy bác giúp em khắc phục lỗi này với:

Build D:\Documents\Dien tu\PIC16F887\Tu hoc\Project LCD\lcd for device 16F887
Using driver C:\Program Files\HI-TECH Software\PICC\9.82\bin\picc.exe

Make: The target "D:\Documents\Dien tu\PIC16F887\Tu hoc\Project LCD\lcd.p1" is up to date.
Make: The target "D:\Documents\Dien tu\PIC16F887\Tu hoc\Project LCD\lcd_1_main.p1" is up to date.
Executing: "C:\Program Files\HI-TECH Software\PICC\9.82\bin\picc.exe" -olcd.cof -mlcd.map --summary=default --output=default lcd.p1 lcd_1_main.p1 --chip=16F887 -P --runtime=default --opt=default -D__DEBUG=1 --rom=default --ram=default -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode) V9.82
Copyright (C) 2011 Microchip Technology Inc.
(1273) Omniscient Code Generation not available in Lite mode (warning)
Error [800] lcd.as; 45. undefined symbol "DEBUGDIS"
Error [800] lcd.as; 45. undefined symbol "LVPDIS"
Error [800] lcd.as; 45. undefined symbol "FCMDIS"
Error [800] lcd.as; 45. undefined symbol "IESODIS"
Error [800] lcd.as; 45. undefined symbol "SWBOREN"
Error [800] lcd.as; 45. undefined symbol "UNPROTECT"
Error [800] lcd.as; 45. undefined symbol "MCLREN"
Error [800] lcd.as; 45. undefined symbol "PWRTEN"
Error [800] lcd.as; 45. undefined symbol "WDTDIS"
Error [800] lcd.as; 45. undefined symbol "XT"
Error [800] lcd.as; 49. undefined symbol "BORV21"

********** Build failed! **********
 
không biết bạn có thể upload code lên được không. chứ mình cái đó sao biết đâu mà lần.
LƯU Ý: khi các bạn có thắc mắc hay bị lỗi gì thì phải upload code của các bạn và nêu lỗi các bạn gặp phải có thế thì mọi người mới giúp được.
 
máy bác giúp em khắc phục lỗi này với:

Build D:\Documents\Dien tu\PIC16F887\Tu hoc\Project LCD\lcd for device 16F887
Using driver C:\Program Files\HI-TECH Software\PICC\9.82\bin\picc.exe

Make: The target "D:\Documents\Dien tu\PIC16F887\Tu hoc\Project LCD\lcd.p1" is up to date.
Make: The target "D:\Documents\Dien tu\PIC16F887\Tu hoc\Project LCD\lcd_1_main.p1" is up to date.
Executing: "C:\Program Files\HI-TECH Software\PICC\9.82\bin\picc.exe" -olcd.cof -mlcd.map --summary=default --output=default lcd.p1 lcd_1_main.p1 --chip=16F887 -P --runtime=default --opt=default -D__DEBUG=1 --rom=default --ram=default -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode) V9.82
Copyright (C) 2011 Microchip Technology Inc.
(1273) Omniscient Code Generation not available in Lite mode (warning)
Error [800] lcd.as; 45. undefined symbol "DEBUGDIS"
Error [800] lcd.as; 45. undefined symbol "LVPDIS"
Error [800] lcd.as; 45. undefined symbol "FCMDIS"
Error [800] lcd.as; 45. undefined symbol "IESODIS"
Error [800] lcd.as; 45. undefined symbol "SWBOREN"
Error [800] lcd.as; 45. undefined symbol "UNPROTECT"
Error [800] lcd.as; 45. undefined symbol "MCLREN"
Error [800] lcd.as; 45. undefined symbol "PWRTEN"
Error [800] lcd.as; 45. undefined symbol "WDTDIS"
Error [800] lcd.as; 45. undefined symbol "XT"
Error [800] lcd.as; 49. undefined symbol "BORV21"

********** Build failed! **********
add đầy đủ file ko ? có thể do bạn xài bản lite mode nó ko cho phép , bạn có thể crack thử. Ngoài ra bản này HITECH PICC 9.82 nên khai báo config khác các bản trước nên nó báo sai các ký tự VD: XT ... , bạn cài bản 9.7 là xài dc rùi:)
 
Để sử dụng được Source code của câu lạc bộ thì bạn hãy dùng Hi-Tech C V9.65, bản của bạn là V9.82.
 

thienminh_npn

Thành Viên PIF
Đổi mấy dòng config lại thành cái này bạn ơi.
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_OFF); //1st config. Word

__CONFIG(BOR4V_BOR21V); //2st config. Word
 

ongBacLoc

Trứng gà
bổ sung:
Trước khi code cho 1 con Pic nào đó với HT-PIC bạn nên đọc qua file header của con chip đó ở thư mục \include của bộ cài, cụ thể ở đay là file pic16f887.h, file này định nghĩa tất cả các thanh ghi của con chip. Ở các version khác nhau HTPIC định nghĩa các thanh ghi này có đôi chỗ khác nhau có thể gây ra lỗi như của bạn( chẳng hạn ở bài về ADC có thể sẽ gặp lỗi ở lệnh set GODONE, phải là GO_DONE mới đúng ..v.v.)
Thân
 

voiconvuive

Trứng gà
bổ sung:
Trước khi code cho 1 con Pic nào đó với HT-PIC bạn nên đọc qua file header của con chip đó ở thư mục \include của bộ cài, cụ thể ở đay là file pic16f887.h, file này định nghĩa tất cả các thanh ghi của con chip. Ở các version khác nhau HTPIC định nghĩa các thanh ghi này có đôi chỗ khác nhau có thể gây ra lỗi như của bạn( chẳng hạn ở bài về ADC có thể sẽ gặp lỗi ở lệnh set GODONE, phải là GO_DONE mới đúng ..v.v.)
Thân
bạn ơi tiện thể cho mình hỏi ,làm thế nào để biết mình config bao gồm những gì vậy bạn , đồng thời có thể giải thik cái dòng CONFIG trên kia được k ? cảm ơn bạn nhiều :p
 

tungbk

Cố Vấn CLB
Staff member
Configuration bits PIC16F887

PIC16F887 có 2 word config xem trong datasheet tại ">>14.0 Special Features of the CPU>>14.1 Configuration Bits ". Trong này có nêu chi tiết nội dung các bit config này
Có nhiềubạn cũng thắc mắc cái này nay tóm tắt lại để dành sau này tra cứu nhanh:

+ Word1 : bit 15, bit 14 không dùng. Bit 13->bit0 là các bit cài đặt
Vd : bit [2:0] chọn clock sẽ dùng cho mạch
PHP:
FOSC<2:0>: Oscillator Selection bits
111 = RC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, RC on RA7/OSC1/CLKIN
110 = RCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, RC on RA7/OSC1/CLKIN
101 = INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
100 = INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
011 = EC: I/O function on RA6/OSC2/CLKOUT pin, CLKIN on RA7/OSC1/CLKIN
010 = HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
001 = XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
000 = LP oscillator: Low-power crystal on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
+Word 2: bit[15:11] và bit[7:0] bỏ qua ; chỉ config bit[10:8]
Vd: bit 8 chọn ngưỡng reset
PHP:
bit 8 BOR4V: Brown-out Reset Selection bit
0 = Brown-out Reset set to 2.1V
1 = Brown-out Reset set to 4.0V
Trong Hitech-C có định nghĩa sẵn các word config như sau (xem cuối file pic16f887.h trong thư viện Hitech-C tại: C:\Program Files\HI-TECH Software\PICC\9.80\include)
PHP:
// Oscillator 
#define EXTCLK		0x3FFF	// External RC Clockout
#define EXTIO		0x3FFE	// External RC No Clock
#define INTCLK		0x3FFD	// Internal RC Clockout
#define INTIO		0x3FFC	// Internal RC No Clock
#define EC		0x3FFB	// EC
#define HS		0x3FFA	// HS
#define XT		0x3FF9	// XT
#define LP		0x3FF8	// LP
// Watchdog Timer 
#define WDTEN		0x3FFF	// On
#define WDTDIS		0x3FF7	// Disabled / SWDTEN control
// Power Up Timer 
#define PWRTDIS		0x3FFF	// Off
#define PWRTEN		0x3FEF	// On
// Master Clear Enable 
#define MCLREN		0x3FFF	// MCLR function is enabled
#define MCLRDIS		0x3FDF	// MCLR functions as IO
// Code Protect 
#define UNPROTECT	0x3FFF	// Code is not protected
#define CP		0x3FBF	// Code is protected
#define PROTECT		CP	//alternate
// Data EE Read Protect 
#define DUNPROTECT	0x3FFF	// Do not read protect EEPROM data
#define CPD		0x3F7F	// Read protect EEPROM data
// Brown Out Detect 
#define BORDIS		0x3CFF	// BOD and SBOREN disabled
#define SWBOREN		0x3DFF	// SBOREN controls BOR function (Software control)
#define BORXSLP		0x3EFF	// BOD enabled in run, disabled in sleep, SBOREN disabled
#define BOREN		0x3FFF	// BOD Enabled, SBOREN Disabled
// Internal External Switch Over Mode 
#define IESOEN		0x3FFF	// Enabled
#define IESODIS		0x3BFF	// Disabled
// Monitor Clock Fail-safe 
#define FCMEN		0x3FFF	// Enabled
#define FCMDIS		0x37FF	// Disabled
// Low Voltage Programming 
#define LVPDIS		0x2FFF	// Disabled
#define LVPEN		0x3FFF	// Enabled
// In-Circuit Debugger Mode 
#define DEBUGEN		0x1FFF	// Enable ICD2 debugging
#define DEBUGDIS	0x3FFF	// Disable ICD2 debugging
#define CONFIG_ADDR2	0x2008
// Brown-out Reset Voltage 
#define BORV21		0x3EFF	// 2.1 Volts
#define BORV40		0x3FFF	// 4.0 Volts
Do đó ta thấy ban đầu code thường có 2 dòng config :
PHP:
__CONFIG(XT & WDTDIS & PWRTEN & MCLREN & UNPROTECT & DUNPROTECT & BORDIS & IESODIS & FCMDIS & LVPDIS); //1st config. word
__CONFIG(BORV21);    //2st config. word
Như trên sẽ thấy ý nghĩa của 2 dòng config như sau:
+Word 1:
-XT : khai báo dùng thạch anh ngoài gắn tại RA6,RA7
-WDTDIS : tắt bộ Watchdog timer ( nhưng có thể enable trong code bằng cách bật SWDTEN bit trong thanh ghi)
-PWRTEN : bật nguồn cho Timer
-MCLREN : chọn chân RE3 chức năng MCLR, không dùng chức năng digital
-UNPROTECT : chế độ không khóa code (code có thể bị xóa )
-DUNPROTECT: chế độ không khóa EEPROM (eeprom có thể bị xóa )
-BORDIS : không dùng Brown-out reset ( áp Pic dưới 1 ngưỡng nào đó sẽ bị reset)
-IESODIS: tắt chế độ có thể chuyển mode dùng code trong hay ngoài (cái này không chắc lắm)
-FCMDIS : Monitor Clock Fail-safe disable (nếu được cho phép khi clock bị sai thì sẽ chuyển sang dùng clock nội. Xem thêm section 4.8 Fail-Safe Clock Monitor)
-LVPDIS : Low Voltage Programming disable ( dùng high-volt cho chân RE3 khi nạp)

+Word 2:
- BORV21 : chọn Brown-out reset là 2.1 V
 

NAME_LESS

Trứng gà
LCD cho port B

Chào các bạn, mình làm theo hướng dẫn của CLB, nhưng code chỉ chạy được trên 2 port C và D, còn port B không biết thiếu lệnh gì mà không chạy, các bạn chỉ giúp mình nhé :D


Code:
/*--------------Includes-----------------------------------------------------*/
#include <htc.h>
#include <pic.h>
#include "lcd.h"

/*--------------Defines------------------------------------------------------*/
#define 	_XTAL_FREQ		12000000 

/*--------------Configuration Settings---------------------------------------*/
__CONFIG(FOSC_HS &			// External Crystal at High Speed
	 	 WDTE_OFF &			// Disable Watchdog Timer
	 	 PWRTE_ON  &		//Enable Power Up Timer
	 	 BOREN_OFF &		//Disable Brown Out Reset
	 	 MCLRE_ON &			//MCLR function is enabled
	 	 LVP_OFF);			//Disable Low Voltage Programming
		 
/*--------------Global Variables---------------------------------------------*/

/*--------------Functions----------------------------------------------------*/
/*-----------------------------------------------------------------------------
 * Function Name  : pic_init
 * Description    : Setup the peripherals, we intend to use
 * Parameter   	  : None
 * Return         : None
 */
void pic_init(void) {	
	ANSEL = 0b00000000;		// 0=Digital; 1=Analog Input
	ANSELH = 0b00000000;	// 0=Digital; 1=Analog Input
	
	//TRISC = 0b00000000;
    TRISB = 0b00000000;
   // TRISC5=0;
}

/* -- void delay_1s() --------------------------------------------
 * 
 * Description	: delay 1s 
 * Parameters	: none
 * Return		: don't care
 */
void delay_1s()
{
	char i;
	for (i=0; i<10; i++)
		__delay_ms(100);
}


 /****************************************************************
 * MAIN
 ****************************************************************/	
 
/* -- void main (void)	-----------------------------------------
 * 
 * Description	: Display my name & my Student ID on LCD,
 *                and make them "blinky" 
 * Parameters	: none
 * Return		: don't care
 * Notes		: 
 */
 
void main(void)
{		
	lcd_init();
	__delay_ms(100);
	
	while (1)
	{
		lcd_clear();
		delay_1s();
		lcd_puts("Name"); 		//Put "Name" on row 0
		lcd_gotoxy(0,1); 		//Go to column 0, row 1
		lcd_puts("4050xxxx");	//Put Student ID on row 1
		delay_1s();
	};
	
}

/****************************************************************
 * END OF lcd_1_main.c
 ****************************************************************/
 
Top