Trích:
Nguyên văn bởi thanhtb_89
vâng
đây là code của em
#include <16F886.h>
#device adc=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES PROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOIESO //No Internal External Switch Over mode enabled
#FUSES NOFCMEN //No Fail-safe clock monitor enabled
#FUSES NOLVP //No Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NODEBUG //No Debug mode for ICD
#FUSES WRT //Program memory write protected
#FUSES BORV40 //Brownout reset at 4v
#use delay(clock=4000000)
#byte PORTB = 0x06
#byte TRISB = 0x86
//===============================
//define com
//mant
//===============================
//#define data PIN_B5
//#define
//#define SHIFT_CLK_1 PORTB |= 0b00010000
//#define SHIFT_CLK_0 PORTB &= ~0b00010000
#define SHIFT_DTA_1 PORTB |= 0b00100000
#define SHIFT_DTA_0 PORTB &= ~0b00100000
#define MASK_LED_0 0b00101000
#define MASK_LED_1 0b10101111
#define MASK_LED_2 0b10011000
#define MASK_LED_3 0b10001010
#define MASK_LED_4 0b00001111
#define MASK_LED_5 0b01001010
#define MASK_LED_6 0b01001000
#define MASK_LED_7 0b10101110
#define MASK_LED_8 0b00001000
#define MASK_LED_9 0b00001010
//int16 n;
const unsigned char dta[10] =
{MASK_LED_0,MASK_LED_1,MASK_LED_2,MASK_LED_3,MASK_ LED_4,
MASK_LED_5,MASK_LED_6,MASK_LED_7,MASK_LED_8,MASK_L ED_9};
//===============================
//dinh nghia cac ham
//===============================
void sckc();
void lat();
void dichbit();
//===============================
//tao xung clock
//===============================
void sckc()
{ //PORTB=0b11110111
output_high(PIN_B4);
delay_us(200);
output_low(PIN_B4);
delay_us(200);
}
//===============================
//tao xung latch va hien thi
//===============================
void lat()
{ //PORTB=0b11101111
output_high(PIN_B3);
delay_us(200);
output_low(PIN_B3);
delay_us(200);
}
//===============================
//DICH BIT
//n la so phan tu mang
//i so lan lap dich bit
//===============================
void main()
{
unsigned char mask,i,n;
int8 dk;
mask = 0x80;
for(n=0;n<10;n++)
{ for(i=0;i<8;i++)
{ if( dta[n] & mask ) {SHIFT_DTA_1;}
else {SHIFT_DTA_0;}
sckc();
mask>>=1;
}
dk=0b00001111;
if(dk & mask) {SHIFT_DTA_1;}
else {SHIFT_DTA_0;}
sckc();
mask>>=1;
lat();
delay_ms(2000);
}
}
|
ý của bạn là xuất dữ liệu trong mảng ra hết rồi lặp lại. chân b5 chân dữ lệu chân b4 chân clock chân b3 chân chốt.viết code như bạn tốn rất nhiều chu kỳ máy. bạn đưa sơ đồ bạn lên đi mình lúc trước toàn viết kiểu này nhưng thấy truyền bít chậm quá nếu bạn dùng khoảng 16con 595 mắt nối tiếp thì làm cách này e rằng hơi châm. thay hồ dùng lệnh if và dùng thuật toán nhận dạng bít cần đưa vào là 0 hay 1 kiểu này rất chậm.
gợi ý nhé.
int dulieu = 0x01,i,y;
int1 value;
for(i=8;i>=1;i--)
{
value = bit_test(dulieu,i-1);
data = value; // data la chân dử liệu 595
ckl = 0; // chân xung nhip
ckl=1;
chot=0; // chân chốt
chot=1;
}
ở đây chương trình chạy như sau bắt đầu lấy bít 7 dử liệu đưa ra rồi chốt liền ,lần thứ 2 sẽ là 6 và 5 dến 0 cứ thế . còn nếu bạn muốn đưa nguyên byte rồi chốt thì làm như sau:
int dulieu = 0x01,i,y;
int1 value;
for(i=8;i>=1;i--)
{
value = bit_test(dulieu,i-1);
data = value; // data la chân dử liệu 595
ckl = 0; // chân xung nhip
ckl=1;
}
chot=0; // chân chốt
chot=1;
cái lệnh bit_test này tốn rất ít chu kỳ máy so với if
mình thường đưa bít 7 vào trước để dữ liệu ra giống như dữ liệu vào,còn đưa bít 0 ra trước thì dữ liệu sẻ đảo lại. bản thân thanh ghi dịch bên trong 595 la dịch trái.đi ăn cái gì đã đói bụng thế