chào các bạn!
Các bạn xem cái code mình với( quang báo dùng 16f877a). Sao mình đổi chân của Port C 4, 5, 6 sang 1,2,3 thì nó chạy không được ( mình tô đỏ trong code). mình gởi code lên.
#include <16f877a.h>
#include <font5x7.c>
#use delay(clock=20m)
#byte Port_B = 0x06 // Dinh nghia thanh ghi Port B
#byte Port_C = 0x07 // Dinh nghia thanh ghi Port C
#byte TRIS_B = 0x86 // Dinh nghia thanh ghi Tris B
#byte TRIS_C = 0x87 // Dinh nghia thanh ghi Tris B
#byte led_data = Port_B
#bit data = Port_C.4 // Dinh nghia chan data la pin C.4
#bit clock = Port_C.5 // Dinh nghia chan data la pin C.5
#bit latch = Port_C.6 // Dinh nghia chan data la pin C.6
char led[32];//4led matran
char font_buffer[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};//
unsigned char string1[]="DO AN HE THONG NHUNG -- LED matrix 8x32 -- Sad_moon";
char dem_ngat, addr, leng, ky_tu, vi_tri;
// Chuong trinh con day du lieu vao 595
// ULN 2803 dem dau ra dao nen day vao 1bit 0 va 31bit 1
void HC595(char cot){
char i;
for(i=0;i<cot;i++){ //DUA CAC BIT 0 VAO` TRUOC
data=1; // Dua bit 0 vao 595
clock=1; // Tao 1 xung o chan Clock de dua du lieu vao 595
clock=0;
}
data=0; // Dua bit 0 vao vi tri cot can hien thi
clock=1;
clock=0;
for(i=(cot+1);i<=31;i++){
data=1; //Tiep tu dua bit 0 vao 595 cho du 32bit
clock=1;
clock=0;
}
latch=1; // Tao 1 xung o chan Latch de day du lieu ra cac cong va chot
latch=0;
}
#int_timer0 // Khai bao su dung timer 0
// Chuong trinh ngat Timer0
void Scan(void){
set_timer0(6); //cai dat gia tri ban dau cho timer0
if((++dem_ngat)==2){
led_data=0xff;
HC595(addr);
led_data=led[addr];
addr++;
if(addr>=32) addr=0;
dem_ngat=0;
}
}
// Chuong trinh con lay do dai chuoi ky tu
void leng_string(void){
leng=0;
while((string1[leng])!='\0') // Chay tu dau cho toi khi ket thuc chuoi
leng++;
}
// Chuong trinh con Copy font chu vao bo dem
void copy_font(void){
char j;
for(j=0;j<=4;j++)
font_buffer[j]=font[(string1[ky_tu]-32)].b[j]; // Copy ma font (5byte) tu ky tu can hien thi vao bo dem font_buffer
font_buffer[j]=0xff;
}
// Chuong trinh con cho chu chay tu phai sang trai
void kieu_1(void){
char j;
for(j=31;j>0;j--)
led[j]=led[j-1];
if(vi_tri>5){
vi_tri=0;
copy_font();
ky_tu++;
}
else{
led[0]=font_buffer[vi_tri];
vi_tri++;
}
}
// Chuong trinh chinh
void main(){
int i;
TRIS_B=0x00; TRIS_C=0x00;
Port_B=0x00; Port_C=0x00;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16); //tan so timer0 = precase/16
set_timer0(6); //dat gia tri ban dau cho RTC
enable_interrupts(global);//cho phep ngat toan cuc
enable_interrupts(int_rtcc);
leng_string(); // Lay do dai
ky_tu=0;
while(true){
for (i=0;i<=31;i++) led[i]=0xff;
while(ky_tu<=leng){
kieu_1();
delay_ms(50);
}
}
}
Các bạn xem cái code mình với( quang báo dùng 16f877a). Sao mình đổi chân của Port C 4, 5, 6 sang 1,2,3 thì nó chạy không được ( mình tô đỏ trong code). mình gởi code lên.
#include <16f877a.h>
#include <font5x7.c>
#use delay(clock=20m)
#byte Port_B = 0x06 // Dinh nghia thanh ghi Port B
#byte Port_C = 0x07 // Dinh nghia thanh ghi Port C
#byte TRIS_B = 0x86 // Dinh nghia thanh ghi Tris B
#byte TRIS_C = 0x87 // Dinh nghia thanh ghi Tris B
#byte led_data = Port_B
#bit data = Port_C.4 // Dinh nghia chan data la pin C.4
#bit clock = Port_C.5 // Dinh nghia chan data la pin C.5
#bit latch = Port_C.6 // Dinh nghia chan data la pin C.6
char led[32];//4led matran
char font_buffer[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};//
unsigned char string1[]="DO AN HE THONG NHUNG -- LED matrix 8x32 -- Sad_moon";
char dem_ngat, addr, leng, ky_tu, vi_tri;
// Chuong trinh con day du lieu vao 595
// ULN 2803 dem dau ra dao nen day vao 1bit 0 va 31bit 1
void HC595(char cot){
char i;
for(i=0;i<cot;i++){ //DUA CAC BIT 0 VAO` TRUOC
data=1; // Dua bit 0 vao 595
clock=1; // Tao 1 xung o chan Clock de dua du lieu vao 595
clock=0;
}
data=0; // Dua bit 0 vao vi tri cot can hien thi
clock=1;
clock=0;
for(i=(cot+1);i<=31;i++){
data=1; //Tiep tu dua bit 0 vao 595 cho du 32bit
clock=1;
clock=0;
}
latch=1; // Tao 1 xung o chan Latch de day du lieu ra cac cong va chot
latch=0;
}
#int_timer0 // Khai bao su dung timer 0
// Chuong trinh ngat Timer0
void Scan(void){
set_timer0(6); //cai dat gia tri ban dau cho timer0
if((++dem_ngat)==2){
led_data=0xff;
HC595(addr);
led_data=led[addr];
addr++;
if(addr>=32) addr=0;
dem_ngat=0;
}
}
// Chuong trinh con lay do dai chuoi ky tu
void leng_string(void){
leng=0;
while((string1[leng])!='\0') // Chay tu dau cho toi khi ket thuc chuoi
leng++;
}
// Chuong trinh con Copy font chu vao bo dem
void copy_font(void){
char j;
for(j=0;j<=4;j++)
font_buffer[j]=font[(string1[ky_tu]-32)].b[j]; // Copy ma font (5byte) tu ky tu can hien thi vao bo dem font_buffer
font_buffer[j]=0xff;
}
// Chuong trinh con cho chu chay tu phai sang trai
void kieu_1(void){
char j;
for(j=31;j>0;j--)
led[j]=led[j-1];
if(vi_tri>5){
vi_tri=0;
copy_font();
ky_tu++;
}
else{
led[0]=font_buffer[vi_tri];
vi_tri++;
}
}
// Chuong trinh chinh
void main(){
int i;
TRIS_B=0x00; TRIS_C=0x00;
Port_B=0x00; Port_C=0x00;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16); //tan so timer0 = precase/16
set_timer0(6); //dat gia tri ban dau cho RTC
enable_interrupts(global);//cho phep ngat toan cuc
enable_interrupts(int_rtcc);
leng_string(); // Lay do dai
ky_tu=0;
while(true){
for (i=0;i<=31;i++) led[i]=0xff;
while(ky_tu<=leng){
kieu_1();
delay_ms(50);
}
}
}
Comment