PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Hiện thị số dùng ic 74HC595 + pc 16f877a (http://www.picvietnam.com/forum/showthread.php?t=14006)

mrsin 07-04-2012 12:58 AM

Hiện thị số dùng ic 74HC595 + pc 16f877a
 
1 Attachment(s)
Em chỉ muốn hiện thị số lên thôi mà không được, dưới đây là code và mạch mô phỏng = protues, mong anh chị sửa giúp em. thanks

bnthang 07-04-2012 10:25 AM

1 Attachment(s)
Chương trình này chạy rồi, nhưng bảng mã giải mã led 7 đoạn còn sai nên hiển thị chưa đúng, bạn sửa lại cho đúng nhé

mrsin 07-04-2012 11:24 AM

Trích:

Nguyên văn bởi bnthang (Post 55738)
Chương trình này chạy rồi, nhưng bảng mã giải mã led 7 đoạn còn sai nên hiển thị chưa đúng, bạn sửa lại cho đúng nhé

cám ơn bnthang nhưng em muốn biết code của em sai chổ nào thôi để biết đường lần sau còn sửa nữa, em mới học lập trình ah mong anh chị trong diễn dàn giúp em
tks!!1

bnthang 07-04-2012 03:00 PM

Code của bạn thiếu lệnh dịch bit. Sau khi bạn dịch bit 7 ra chân DS thì bạn dịch bit 6 lên vị trí bit 7 "shift_left(data,1,1);" Dịch số 1 xang bên trái vào biến data. Hoặc dùng lệng data<<=1;

tdm 07-04-2012 03:49 PM

Trích:

Nguyên văn bởi mrsin (Post 55734)
Em chỉ muốn hiện thị số lên thôi mà không được, dưới đây là code và mạch mô phỏng = protues, mong anh chị sửa giúp em. thanks

#include <16F877A.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
//#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bi ts=9) //Baud_min=4800 Baud_max=115200
//#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)


// Dinh nghia cac chan cho ket noi 74595
//#bit SCL=0x08.7
//#bit DATA=0x08.6
//#bit SCK=0x08.5
#define SCL RD5//đổi lại cho phù hợp phần cứng
#define DATA RD6
#define SCK RD7//đổi lại cho phù hợp phần cứng
#byte TRISD =0x88
void quet(unsigned char x);
unsigned int num=1;

unsigned char ma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};//ma led 7
void quet(unsigned char x)
{
int i,temp;
for(i=0;i<8;i++)
{
temp=x;//gan bien
temp=temp&0x80;//lay ra bit dau tien (bit 7)
if(temp==0x80)//so sanh bit
DATA=1; //bang 1 thi xuat vao chip =1
else
DATA=0; //nguoc lai bang 0
x*=2; //dich bit lay bit trong so thap
SCK=0; //tao xung tren chan 11
SCK=1; //1 xung dua vào 1 bít
}
SCL=0; //xuat du lieu ra output
SCL=1;
}

void main()
{
TRISD=0x00;//thiếu dòng này
num=5;
while(1)
{
quet(~ma[num]);//đảo lại mã cho phù hợp phần cứng
}
}

mrsin 08-04-2012 09:57 PM

1 Attachment(s)
cám ơn anh tdm nha em sửa theo anh va chạy được rồi
Tiện đây em mở rộng thêm 1 tý là hiển thị 4 số VD:1234
em cũng viết rùi cũng không chạy mong anh sửa giúp em :)

hoc_picpicpic 09-04-2012 12:13 AM

1 Attachment(s)
code chạy ok này

tdm 09-04-2012 04:14 PM

Trích:

Nguyên văn bởi mrsin (Post 55844)
cám ơn anh tdm nha em sửa theo anh va chạy được rồi
Tiện đây em mở rộng thêm 1 tý là hiển thị 4 số VD:1234
em cũng viết rùi cũng không chạy mong anh sửa giúp em :)

viết gì mà phức tạp thế.
chỉ thế này thôi:
Code:


#include <16F877A.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
//#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=9) //Baud_min=4800 Baud_max=115200
//#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)


// Dinh nghia cac chan cho ket noi 74595
//#bit SCL=0x08.7
//#bit DATA=0x08.6
//#bit SCK=0x08.5
#define SCL RD5
#define DATA RD6
#define SCK RD7
#byte TRISD =0x88
void quet(unsigned char x);
void DCB(void);
unsigned int donvi,chuc,tram,nghin;
 int16 num;
unsigned char ma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//ma led 7
void quet(unsigned char x)
{
int i,j,k,u,temp1,temp2,temp3,temp4;
  for(i=0;i<8;i++)
  {
  temp1=x;//gan bien
  temp1=temp1&0x80;//lay ra bit dau tien (bit 7)
  if(temp1==0x80)//so sanh bit
  DATA=1;    //bang 1 thi xuat vao chip =1
  else
  DATA=0;    //nguoc lai bang 0
  x*=2;  //dich bit lay bit trong so thap
  SCK=0;  //tao xung tren chan 11
  SCK=1;  //1 xung dua vào 1 bít
  }
}
void chot()
{
SCL=0;  //xuat du lieu ra output
SCL=1;
}
void DCB(void)
{
nghin=num/1000;
tram=(num%1000)/100;
chuc=(num%100)/10;
donvi=num%10;
}

void main()
{
trisd=0x00;
num=9875;
DCB();
quet(ma[donvi]);
quet(ma[chuc]);
quet(ma[tram]);
quet(ma[nghin]);
chot();
while(1)
{
}
}


mrsin 09-04-2012 09:28 PM

Cách anh tdm ngắn gọn nhỉ cám ơn anh nhiều :)
Và giờ nếu em mở rộng lên 8 hay 16 con số thì thuật toán của cái code đó như thế nào vậy anh

thuong_123 21-05-2012 10:46 PM

Chào anh"tdm". Anh giải thích cho em 2 dòng lệnh này nhé, em chưa hiểu lắm. thank anh.
temp=temp&0x80;
x*=2;


Múi giờ GMT. Hiện tại là 03:24 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam