Ðăng Nhập

View Full Version : Các cao thủ cho em hỏi cái này


pk178
01-11-2009, 01:00 AM
Chào các bác, chương trình của em là nhập giá trị từ bàn phím, rồi hiển thị giá trị đó lên LCD, em dùng hàm lcd_getc() để đọc kí tự trên lcd, sau đó em dùng hàm atoi() để convert từ kiểu string sang kiểu int, sau đó em cho hiển thị số đã được chuyển đổi lên LCD thì chỉ thấy số 0, em ko hiểu sao lại như vậy. Mong các cao thủ chỉ giáo giúp em !

Nếu ai đã từng làm cái tương tự thế này, có thể cho em xem code được không ạ ? Em xin cám ơn rất nhiều !

nhamdtk4
01-11-2009, 10:05 AM
Ko hiểu ý đồ "thâm độc" của bạn là j. Post code của bạn lên để mọi người xem giúp cho.

pk178
01-11-2009, 11:40 PM
Ko hiểu ý đồ "thâm độc" của bạn là j. Post code của bạn lên để mọi người xem giúp cho.

Vâng, đây là code của em !

// Scan key 2 program ( Improve from Scan Key)
// Author : pk
// Date : 01/11/2009
/* Description :
- User use keypad to put numberic data on LCD
- Press "*" to clear screen
- Press "#" to finish input process
*/
/* Functions :
- int read_key() : scan key and return which key is pressed
- void lcd_put_int(int num) : dispplay interger number on LCD
- int input_key() : input the key which is pressed and display on LCD, return a number which
was converted if finish, and 0 if not
*/

#include <16F887.h>
#device *=16

#include <math.h>
#use delay(clock = 4000000)
#include <lcd.c>
#use fast_io(c)
#use fast_io(a)
#use fast_io(b)

#define K1 PIN_C0
#define K2 PIN_C1
#define K3 PIN_C2
#define KA PIN_C3
#define KB PIN_C4
#define KC PIN_C5
#define KD PIN_C6

int read_key();
void lcd_put_int(int16 num);
int16 input_key();
int convert(int num[]);
lcd_disp(char c[],int row);

void main(){
int i;
int16 num;

set_tris_C(0x07);
set_tris_A(0x00);
set_tris_B(0x00);
output_a(0);
output_b(0x00);

lcd_init();
lcd_putc("STARTING");
for(i = 1; i < 9; i++){
lcd_putc(".");
delay_ms(100);
}
lcd_putc("\f");

num = input_key();
while(!num){
lcd_putc("\f");
num = input_key();
}
lcd_putc("\f");
lcd_putc("GIA TRI VUA NHAP : ");
lcd_putc("\n");
lcd_put_int(num);
}


int read_key(){
output_low(KA);output_high(KB);output_high(KC);out put_high(KD);
if(input(K1) == 0) return 1;
if(input(K2) == 0) return 2;
if(input(K3) == 0) return 3;

output_high(KA);output_low(KB);output_high(KC);out put_high(KD);
if(input(K1) == 0) return 4;
if(input(K2) == 0) return 5;
if(input(K3) == 0) return 6;

output_high(KA);output_high(KB);output_low(KC);out put_high(KD);
if(input(K1) == 0) return 7;
if(input(K2) == 0) return 8;
if(input(K3) == 0) return 9;

output_high(KA);output_high(KB);output_high(KC);ou tput_low(KD);
if(input(K1) == 0) return 10;
if(input(K2) == 0) return 0;
if(input(K3) == 0) return 11;

return 15;
}

// display interger number on LCD
void lcd_put_int(int16 num){
int16 temp;
unsigned char i = 0, c[5];
temp = num;
if (temp != 0) {
while(temp){
c[i++] = temp%10;
temp /= 10;
}
while(i) lcd_putc(c[--i] + '0');
}
else lcd_putc('0');
}

int16 input_key(){
int a,b[16],i = 0;
int16 c = 0;

for(a = 0; a < 20; a++) b[a] = 0;
lcd_putc("NHAP GIA TRI DAT : ");
lcd_putc("\n");
while(1){
delay_ms(180);
a = read_key();
if(a == 10){
return 0;
}
if((a != 10) && (a != 15) && (a != 11)){
lcd_put_int(a);
b[i++] = a;
}
if(a == 11){
a = i - 1;
while(1){
i--;
c = c + b[i]*pow(10,a-i);
if(i == 0) break;
}
return c;
}
}
}


Em ko dùng hàm atoi() nữa, thay vào đó, em lấy giá trị của các lần nhập, rồi hiển thịi thành 1 số, ví dụ : em nhập 3 lần, tương ứng là các chữ số : 1,2,3, thì em phải chuyển thành 1 số duy nhất là 123, em có dùng hàm pow(), nhưng ko hiểu sao nó lại hâm hâm kiểu gì ấy. Giả sử em nhập là 1,2,3 thì sau khi đổi, nó lại hiện lên là 122, hầu như đều bị giảm 1 đơn vị, nếu số chỉ có 2 chữ số thì ok, ko vấn đề gì, nhưng từ 3 chữ số trở lên là nó lại bị như vậy.

Mục đích chương trình này của em chỉ là dùng bàn phím đề giao tiếp với vđk thôi, em đã nghĩ mấy ngày trời mà chưa đâu vào đâu cả. Bác nào có code về cái này cho em xin với nhé !

Em nghĩ đây là vấn đề về thuật toán, nên cũng hơi khó xem. Rất mong các cao thủ xem giúp rồi chỉ bảo cho em với. Em xin cảm ơn rất nhìu !

pk178
01-11-2009, 11:44 PM
À mà các bác cho em hỏi, em thấy anh falleaf giới thiệu con 16f887 hoành tráng lắm, nên cũng muốn dùng thử, nhưng hôm nay em ra chợ trời, đi hỏi mấy cửa hàng họ đều lắc đầu bảo ko có. Bác nào biết chỗ mua và giá cả xin mách giúp em.

0509592
02-11-2009, 09:47 AM
bạn đến địa chỉ này!
đây là đại lý của R&P!
http://dientu.rpc.vn/content/view/61/41/

vidieukhiencdn
02-11-2009, 11:05 PM
À mà các bác cho em hỏi, em thấy anh falleaf giới thiệu con 16f887 hoành tráng lắm, nên cũng muốn dùng thử, nhưng hôm nay em ra chợ trời, đi hỏi mấy cửa hàng họ đều lắc đầu bảo ko có. Bác nào biết chỗ mua và giá cả xin mách giúp em.

Nghe từ chợ trời là biết ở HN rùi, chứ HCM bán đầy giá tầm 35k đổ lại

pk178
03-11-2009, 07:51 AM
Cám ơn các bác đã giúp đỡ !

to @ bbaacc01 : Cám ơn những gợi ý của bác, em sẽ thử xem sao, đúng là chương trình em viết có nhiều thiếu xót, em xin ghi nhận những ý kiến của bác, em cũng hơi sơ xuất, (vì đây chỉ là chương trình thử nên em viết tạm tạm như vậy :d). Em cũng thấy là khi biên dịch xong, ccs báo dung lượng chương trình lên tới 35%, hic, có lẽ là do sử dụng hàm pow(), để em thử lại xem sao !

Hôm qua em có gọi cho bên R&P (đại diện là công ty Techpal ấy ạ), họ bảo con 16f887 giá 47.5k, em hỏi có mạch nạp ko, họ bảo mạch nạp 700k, nạp được cho tất cả các loại PIC. Hic, 700k thì quả thực em ko thể mua được, vì mắc quá.

Em định chỉ mua con vđk ở đó thôi rồi ra chỗ khác mua mạch nạp, nhưng em ko biết các mạch nạp trước (có hỗ trợ cho con 16f877) có nạp được cho con 16f887 không ?

Các bác biết chỗ nào bán mạch nạp và vđk này (giá rẻ rẻ 1 chút ạ !) thì chỉ cho em với, em đang cần gấp vì cuối tuần này phải xong cái mạch rồi. Em xin cảm ơn các bác nhiều ạ !

pk178
03-11-2009, 08:09 AM
to @ bbaacc01 : Được rồi bác ạ ! Em đã thử bỏ hàm pow() đi và dùng thuật toán của bác, LCD hiển thị tốt bác ạ, quả thật từ trước đến nay em chỉ biết dùng hàm pow() để chuyển, thuật toán của bác quả là đơn giản và hiệu quả :).

Tiếc là chỉ được bấm vào nút thanks 1 lần, chứ nếu được bấm vào nhiều lần, em xin bấm cho bác cả chục lần luôn :D

tantienvinhkim
17-11-2009, 09:57 AM
chào các bác em mới học pic, kiến thức nông cạn, mạo mụi xin được hỏi các vị tiền bối một câu là pic nói chung 16f877a nói riêng có chức năng tự nhận ra lỗi và xuất tín hiệu cảnh báo như PLC không vậy các bác...trẻ sơ sinh chưa biết chuyện xin các bác đừng trách...