View Full Version : Hiện thị số dùng ic 74HC595 + pc 16f877a
mrsin
07-04-2012, 12:58 AM
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
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
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;
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
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
code chạy ok này
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:
#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
#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,0x9 0};//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;
vBulletin® v3.8.11, Copyright ©2000-2026, vBulletin Solutions Inc.