Nguyên văn bởi tamokato
Xem bài viết
Thông báo
Collapse
No announcement yet.
Tutorial: Led ma trận bằng hình ảnh (completed)
Collapse
This is a sticky topic.
X
X
-
âm bản là đảo màu đấy, trắng thành đen, đen thành trắng. Chỗ sáng sẽ tắt chỗ tắt sẽ sáng
-
Nguyên văn bởi nghaiha Xem bài viếtQua bài trước các bác đã nắm được phương pháp "tạo hình" rồi. Tức là nội dung sẽ hiển thị lên bảng led thế nào do ta thiết kế. Nó có thể là kí tự, bông hoa hay bất cứ cái gì. Và công việc bây giờ là hiển thị nó lên màn hình.
Data của chúng ta ban đầu lưu ở trong Flash ROM. Do đó em đã khai báo
Em sẽ khai báo một mảng trong RAM, mảng này sẽ là bộ nhớ màn hình. Timer 1 của chúng ta sẽ liên tục đọc mảng này và đưa ra màn hình led. Sau này ta muốn làm hiệu ứng hay bất cứ điều gì thì ta chỉ việc thay đổi cái mảng nàyCode:unsigned char flash XINCHAO[]={156,136,112,162,72,137,130,40,138,130,47,138,130,232,139,162,40,138,156,40,114,0,0,0};
Ban đầu em lấy âm bản của data lưu trong flash. Các bác có thể không thèm lấy âm bản và coi nó như là một hiệu ứng cũng được. Lúc đó chữ "CHAO" sẽ không sáng nhưng background của nó thì lại sáng.Code:unsigned char DMem[24]; // Bo nho man hinh, 3 byte dau cho hang 1, 3 byte tiep theo cho hang 2 ...
Trong chương trình ngắt Timer1 ta đưa bộ nhớ màn hình ra màn hình led. Lưu ý quét mỗi hàng thì ta lấy ra 3 bytes . Em không muốn sử dụng mảng 2 chiều cho bộ nhớ màn hình là có nguyên nhân. Các bác thử đoán xem nhé.Code:for (i=0;i<=23;i++){ DMem[i]=~XINCHAO[i]; }
Vậy là xong, các bác hãy biên dịch và nạp vào AVR. Kết quả sẽ như bài viết đầu tiên của emCode:// Timer 1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void){ spi(DMem[r*3+2]); //byte thứ 2 ở hàng thứ r spi(DMem[r*3+1]); // byte thứ 1 ở hàng thứ r spi(DMem[r*3]); // byte thứ 0 ở hàng thứ r LatchData(); PORTC=r+8; // để Enable chú 74138 r++; if (r==8) r=0; }

Đây là full source code của chúng ta cho đến thời điểm này
Bài này đã xong, các bác hãy tùy biến flash data để tạo ra các hình ảnh lạ mắt trên màn hình led nhé. Bài sau em hướng dẫn hiệu ứng làm chữ "CHAO" của ta tối dần và sáng dần. Các bác đón xem nhé.Code:6. Hien chu CHAO (giong chuong trinh XINCHAO) /***************************************************** This program was produced by the CodeWizardAVR V1.25.8 Standard Automatic Program Generator © Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 7/27/2008 Author : Nguyen Hai Ha Company : www.softviet.net Comments: Chip type : ATmega8515L Program type : Application Clock frequency : 16,000000 MHz Memory model : Small External SRAM size : 0 Data Stack size : 128 *****************************************************/ #include <mega8515.h> #include <delay.h> // SPI functions #include <spi.h> #define SCK PORTB.7 #define DATA PORTB.5 #define SCL PORTB.3 #define B PORTC.1; #define C PORTC.2; #define OE PORTC.3; char lenX=9; char NoLed=3; unsigned char flash XINCHAO[]={156,136,112,162,72,137,130,40,138,130,47,138,130,232,139,162,40,138,156,40,114,0,0,0}; unsigned char DMem[24]; // Bo nho man hinh, 3 byte dau cho hang 1, 3 byte tiep theo cho hang 2 ... unsigned char r=0; unsigned char i; void LatchData(){ SCL=0; SCL=1; } // Timer 1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void){ spi(DMem[r*3+2]); spi(DMem[r*3+1]); spi(DMem[r*3]); LatchData(); PORTC=r+8; r++; if (r==8) r=0; } void main(void){ // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 15.625 kHz // Mode: CTC top=OCR1A // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: On // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x0D; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x25; // Quyet dinh toc do quet OCR1BH=0x00; OCR1BL=0x00; DDRB=0xFF; DDRC=0xFF; SCL=1; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x40; // Global enable interrupts #asm("sei") // SPI initialization // SPI Type: Master // SPI Clock Rate: 4000,000 kHz // SPI Clock Phase: Cycle Half // SPI Clock Polarity: Low // SPI Data Order: MSB First SPCR=0x50; SPSR=0x00; for (i=0;i<=23;i++){ DMem[i]=~XINCHAO[i]; } while (1){ } }
BÁC NÀO GIẢI THÍCH GIÚP EM CHỖ NÀY VỚI:
Ban đầu em lấy âm bản của data lưu trong flash. Các bác có thể không thèm lấy âm bản và coi nó như là một hiệu ứng cũng được. Lúc đó chữ "CHAO" sẽ không sáng nhưng background của nó thì lại sáng.
Code:
for (i=0;i<=23;i++){
DMem[i]=~XINCHAO[i];
}
ÂM BẢN LÀ GÌ VẬY? EM KHÔNG HIỂU?
VỚI LẠI VIỆC XUẤT DỮ LIỆU TỪ MẢNG FONT QUA SPI,EM KHÔNG THẤY DÙNG GÌ ĐẾN 2 BIẾN NÀY SAO LẠI KHAI BÁO :
char lenX=9;
char NoLed=3;
EM LÀM THEO MÀ CHÂN E CỦA 138 KHÔNG SET LÊN 1.HIX.
em chưa hiểu cách lấy dữ liệu từ mảng ra để xuất.ai giúp em với.
em spi(XINCHAO[0]) thì 138 có làm việc nhưng cứ spi(...[r*3+..]) là không được,nên em chưa hiểu cách lấy dữ liệu kiểu này,
không biết có phải kiến thức về lập trình với mảng hay không nữa......huhu
Leave a comment:
-
ai phân tích giúp mình đoạn này chútNguyên văn bởi nghaiha Xem bài viếtHôm nay ta bắt đầu bài 3: Thay thế hàm delay bằng ngắt Timer1. Sở dĩ ta phải dùng ngắt Timer thay cho hàm delay bởi trong khi delay thì ta sẽ không làm được gì cả. Còn sử dụng Timer thì trong thời gian chờ đợi ta có thể chuẩn bị dữ liệu, tính toán hiệu ứng cho hàng tiếp theo.
Em sẽ khai báo ngắt Timer1 như sau:
Timer1 có tần số hoạt động là 15625Hz tức là nó sẽ đếm 15625 lần trong vòng 1s. Ở đây, nó cứ đếm từ 0 đến 0x25 = 37 thì ngắt Timer1 sẽ được gọi. Như vậy ngắt Timer1 sẽ được gọi với tần số là 15625/37=422 lần/s.
Chúng ta phải nhớ kích hoạt ngắt nhé:
Chương trình ngắt Timer1 được viết như sau:
Như vậy mỗi khi ngắt Timer1 được gọi thì một hàng sẽ được quét. Ta có tất cả 8 hàng. Do đó tần số quét sẽ là: 422/8=53Hz. Với tần số quét này màn hình led sẽ không bị chớp.
Các bác có thể thấy trong vòng lặp while (1) không còn câu lệnh nào cả. Việc quét led hoàn toàn thực hiện tự động nhờ Timer1.
Các bác nghỉ lấy sức, qua bài 4 chúng ta sẽ học cách tạo bộ font chữ bằng chương trình Microsoft Excel như thế nào.
Source code của bài 3 đây:
http://rapidshare.com/files/134768565/bai3.doc
Chúc vui vẻ!Code:3. Thay delay bang ngat Timer 1 /***************************************************** This program was produced by the CodeWizardAVR V1.25.8 Standard Automatic Program Generator © Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 7/27/2008 Author : Nguyen Hai Ha Company : www.softviet.net Comments: Chip type : ATmega8515L Program type : Application Clock frequency : 16,000000 MHz Memory model : Small External SRAM size : 0 Data Stack size : 128 *****************************************************/ #include <mega8515.h> #include <delay.h> // SPI functions #include <spi.h> #define SCK PORTB.7 #define DATA PORTB.5 #define SCL PORTB.3 #define B PORTC.1; #define C PORTC.2; #define OE PORTC.3; unsigned char r=0; void LatchData(){ SCL=0; SCL=1; } // Timer 1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) { if (r & 1){ spi(0b10101010); spi(0b10101010); spi(0b10101010);} else { spi(0b01010101); spi(0b01010101); spi(0b01010101); } LatchData(); PORTC=r+8; r++; if (r==8) r=0; } void main(void){ // SPI initialization // SPI Type: Master // SPI Clock Rate: 4000,000 kHz // SPI Clock Phase: Cycle Half // SPI Clock Polarity: Low // SPI Data Order: MSB First SPCR=0x50; SPSR=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 15.625 kHz // Mode: CTC top=OCR1A // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: On // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x0D; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x25; // Quyet dinh toc do quet OCR1BH=0x00; OCR1BL=0x00; DDRB=0xFF; DDRC=0xFF; SCL=1; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x40; // Global enable interrupts #asm("sei") while (1){ } }
đoạn:
Timer1 có tần số hoạt động là 15625Hz tức là nó sẽ đếm 15625 lần trong vòng 1s. Ở đây, nó cứ đếm từ 0 đến 0x25 = 37 thì ngắt Timer1 sẽ được gọi. Như vậy ngắt Timer1 sẽ được gọi với tần số là 15625/37=422 lần/s.
Chúng ta phải nhớ kích hoạt ngắt nhé:
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;
// Global enable interrupts
#asm("sei")
mình dùng timer1,để TIMSK=0X40 thì led không sáng
chuyển thành 0x10 thì lại chạy ngon.
đọc cách sử dụng ngắt của avr rùi nhưng vẫn chưa ngấm lắm,các bạn nói giúp cho mình hiểu với.cảm ơn nhiều.
Leave a comment:
-
Cái này mình làm cách đây 3 năm, cũng dựa trên topic của bác nghaiha. Mình up lên diễn đàn hy vọng giúp được gì đó cho các bạn có niềm đam mê led matris của các bạn mới. Nhớ lại thủa mất ăn, mất ngủ về cái món led (ma trận, quang báo, fanled, led cube)
Led matris.rar
pass: atkev
Leave a comment:
-
các bác ơi . mình có một ý kiến như thê này nhé.nhằm giúp mấy anh em chưa bít hoặc đang theo học vi điều khiển.Như thế này nhé: khi đưa một đề tài nào lên diễn đàn thì cố gắng thảo luận ở phạm vi xung quanh ve 1 con vi điều khiển thôi. mình thấy các bác thảo luận lung tung quá.nao la pic avr 89 cu loạn cả lên.vậy thì mấy anh em mới tiếp xúc thì khó có thể mà theo giỏi được.đọc một lúc la loạn cả lên.mong mấy bác xem xét ý kiến của mình ha.thanks các bá nhiều nhiều nhiều..........
Leave a comment:
-
Bạn ơi, bạn giúp mình làm cái đèn học bằng Led ma trận được không? Giúp mình voi. Cảm ơn bạn nhiều nhiều!
Leave a comment:
-
Bác nào có file HEX của cái này cho em xin với, vì em chưa có trình về cái này lắm nhưng đang thích làm một cái lấy cảm hứng, nhưng bị lỗi khi dịch ra file HEX nhưng chưa tìm ra lỗi, mong mấy bác giúp nhé.Nguyên văn bởi mr.ngoc Xem bài viết



code:
giao tiep I2C (cái này mình tham khảo trên diễn đàn thôi)
giao tiếp với DS1307
main:
Leave a comment:
-
Có ai giúp với..Làm y chang như của anh Haiha vân không được.Không biết bị gì nữa.File mô phỏng và chương trình COdevison nằm trong đó lun đó.Ai gắng giúp chỉnh sửa sai giúp mình cảm ơn rất nhiều
http://www.mediafire.com/?a121j5rc13ydwb0
Leave a comment:
-
tớ mới sửa tập được code này cậu thử xem:
code này dùng cho 4 led matrix 8x8
cậu xem thao khảo nhé
org 0000h
batdau:
mov DPTR,#maled
lap:mov r0,#30
main1 :
mov r2,#24
mov r1,#16
mov r7,#8
mov b ,#0
mov r3,#7fh
main2:
mov a,r3
rl a
mov r3,a
mov p1,a
setb p3.3
setb p3.2
setb p3.3
clr p3.0
mov a,r2
movc a,@a+DPTR
mov p2,a
inc r2
acall delay
cjne r3,#07fh,main2
main3:
mov a,r3
rl a
mov r3,a
mov p1,a
clr p3.1
setb p3.0
setb p3.2
setb p3.3
mov a,r1
movc a,@a+DPTR
mov p2,a
inc r1
acall delay
cjne r3,#07fh,main3
main4:
mov a,r3
rl a
mov r3,a
mov p1,a
clr p3.2
setb p3.0
setb p3.1
setb p3.3
mov a,r7
movc a,@a+DPTR
mov p2,a
inc r7
acall delay
cjne r3,#07fh,main4
main5:
mov a,r3
rl a
mov r3,a
mov p1,a
clr p3.3
setb p3.2
setb p3.0
setb p3.1
mov a,b
movc a,@a+DPTR
mov p2,a
inc b
acall delay
cjne r3,#07fh,main5
djnz r0,main1
inc DPTR
mov a,DPL
cjne a,#168,lap
sjmp batdau
delay :
push 04
push 05
push 06
mov r4,#4
n1:mov r5,#4
n2:mov r6,#4
n3:djnz r6,n3
djnz r5,n2
djnz r4,n1
pop 06
pop 05
pop 04
ret
delay2:
mov r4,#4
m1:mov r5,#4
m2:mov r6,#4
m3:djnz r6,m3
djnz r5,m2
djnz r4,m1
ret
org 800h
maled: db 0h, 0h, 0h, 0h, 0h, 0h ,0h, 0h
db 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h
db 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h
db 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h
db 0h, 0h, 7eh, 10h, 8h, 70h, 0h,8h
db 3eh, 48h, 20h,0h,8h,3eh,48h,20h
db 0h ,0fch, 14h, 14h ,8h, 0h,0h, 24h
db 0h, 40h, 0a0h, 50h, 28h, 14h,0ah, 4h
db 0h, 7eh, 8h, 8h, 8h,7eh,0h,3ch
db 42h,42h,42h,3ch,0h,7eh,0h, 0h
db 3ch, 42h, 42h, 62h, 7ch,80h,0h,3eh
db 40h, 40h, 3eh, 0h,7ch,0ah,0ah, 0ah
db 7ch, 0h, 7eh, 4h, 8h,10h ,7eh, 0h
db 0h, 8h, 7eh, 4ah, 4ah, 42h, 3ch, 0h
db 7eh, 0h, 7eh,4ah, 4ah, 42h ,0h, 7eh
db 4h, 8h, 10h, 7eh, 0h, 0h, 2h, 2h
db 7eh, 2h, 2h,0h ,3eh, 40h ,40h, 40h
db 3eh, 3h ,0h, 40h, 0h, 3ch ,42h, 42h
db 24h, 0h,3ch, 42h, 42h, 3ch, 0h ,7eh
db 4h, 8h, 4h, 7eh, 0h, 0h, 0h ,0h
db 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h
endLast edited by caodangbacha; 18-04-2011, 21:39.
Leave a comment:
-
có ai dùng pic 16f877a không giúp mình với mình đang làm bài tập lớn mà thấy lơ mơ quá không biết làm sao. mình cũng làm về quang báo led nè
Leave a comment:
-
Anh Hà hay các bạn pro trong diễn đàng giúp mình với mình định làm 1 bảng led quang báo 32 hàng 64 cột bằng 32 miếng led matrix 8x8 2 màu mình đã mô phỏng ok mọi thứ trên proteus nhưng vẫn loay hoay mãi không dám đi đặt mạch vì 1 vấn đề là khi mô phỏng mình dùng atmega16 nhưng thằng proteus chỉ cho mô phỏng chế độ chạy thạch anh nội 8M cộng thêm máy tình nhà em hơi yếu (100%CPU khi chạy mô phỏng) nên khi mô phỏng thì thấy MCU ko quét kịp cái bảng led.
Mình thắc mắc trên thực tế mình dùng mega16 với thạch anh 16M thì có quét kịp cái bảng này ko? để quét toàn bộ cái bảng quang báo này 1 lượt thì SPI phải xuất 32x64=2048 bit data 1 lượt quét+hiển thị cho 1 màu (kinh vãi), theo em đoán thì trên thực tế với 16m thạch anh quét cũng chả kịp
Em tính tới phương án là chia nhỏ cái bảng quang báo ra rồi điều khiển = nhiều MCU nhưng thấy kì kì vì cái bảng lớn mình xài cỡ 13-14 chân MCU hà còn thừa nhiều quá.
Sơ lược phần cứng của em:32 miếng matrix 8x8 2màu, 74hc164 dịch data, 74hc138 hiền thị hàng, hc4052 tạo 4 chân SPI, 1 mega16 16M, mô phỏng ok trên proteus (lập trình đơn giản theo chân bác nghaiha dùng spi cứng xuất 1 lần 1 byte full data 8byte cho 1 hàng thì show nó lên sau đó tắt đi đến hàng 2)
Tóm lại em muốn hỏi những điều sau:
1) Cái bảng quang báo 32 hàng 64 cột của em trên thực tế có quét được = 1 mcu mega16 chạy cry16M xuất data=SPI cứng hay ko?
2) Nếu buộc phải chia nhỏ ra dùng nhiều MCU quét cùng 1 lúc thì nên chia ra bao nhiêu modul (em tính chia 4 mỗi modul 8 hàng 64 cột vì như thế đỡ tốn ic 4052 phân kênh cho chân SPI ngược lại tốn 4 con mega16 khóc dở.)
3) Xin các bạn góp ý về phần cứng thêm cho mình hoàn thiện
4) Mình là sinh viên làm 1 cú lớn chơi cho vui rồi từ biệt mấy cái bóng đèn led luôn qua chơi PLC nên mong các bạn chân thành góp ý 1 cách dễ hiểu vì ngoài những IC và lập trình đơn giản mình nêu trên mình ko dùng thêm loại nào nữa cho phức tạp đâu vì thật sự mình bắt đầu thấy mệt mỏi rồi nhưng vì đây là thứ mình khởi động nên mình quyết ko từ bỏ thôi. mong cao nhân hiểu tấm lòng của mình và giúp về kiến thức
Leave a comment:
-
bac nào có code chạy tên sinh viên dùng 3led ma trận 8x8 sử dụng atmega16 ko? gửi cho em với huynhhd.bk@gmail.com
Leave a comment:
-




code:
giao tiep I2C (cái này mình tham khảo trên diễn đàn thôi)
giao tiếp với DS1307#define SCL P1_0
#define SDA P1_1
//=====================
/* giao tiep i2c */
//-------------------------
void delay(){
int i;
for (i=0;i<10;i++);
}
void SCL_high(){
SCL=1;
delay();
}
void SCL_low(){
SCL=0;
delay();
}
//------------------------
//=======================================
//------------------------
void i2c_start(){
SDA=1;
SCL=1;
SDA=0;
delay();
SCL=0;
SDA=1;
}
void i2c_stop(){
SDA=0;
SCL=1;
delay();
SDA=1;
}
//-------------------------
//==========*** Ham ghi gia tri vao i2c ***================
bit i2c_write(unsigned char dat){
unsigned char i;
bit outbit;
for (i=1;i<=8;i++){
outbit=dat&0x80;
SDA=outbit;
dat=dat<<1;
SCL_high();
SCL_low();
}
SDA=1; //set SDA to receive Acknowedge
SCL_high();
outbit=SDA; //kiem tra ACK xem slaver nhan dung chua
SCL_low();
return(outbit); //if outbit=1,Ack=1 :error // if outbit=0;Ack=0 :ok
}
//================================================== ====
main://================================================== ==
/* giao tiep voi IC DS1307 */
//==== Ham ghi du lieu data1 toi thanh ghi dia chi address cua DS1307 ==========
void rtc_write(unsigned char address, unsigned char data1){
i2c_start();
i2c_write(0xd0); // dia chi cua DS1307 che do ghi
i2c_write(address); //dia chi cua thanh ghi
/* i2c_write(((data1/10)<<4)|(data1%10)); //chuyen thanh so thap phan */
i2c_stop();
}
//======= Ham doc du lieu cua DS1307 tai thanh ghi co dia chi address =========
unsigned char rtc_read(unsigned char address){
unsigned char data1;
i2c_start();
i2c_write(0xd0); //dia chi cua DS1307 che do ghi
i2c_write(address); //dia chi thanh ghi can doc
i2c_start(); //restart
i2c_write(0xd1); //dia chi DS1307 che do doc
data1=i2c_read(0);
i2c_stop();
/*data1=(data1&0x0f)+(data1>>4)*10; //chuyen thanh so thap phan */
return(data1);
}
//================================
#include <at89x51.h>
#define SCL P1_0
#define SDA P1_1
/* dinh nghia cac bien hien thi */
#define LED P0 // xuat ma led
#define DP P0_7
/*quet led*/
#define on 1
#define off 0
#define led1 P1_2 //dung de quet led
#define led2 P1_3
#define led3 P1_4
#define led4 P1_5
#define led5 P1_6
#define led6 P1_7
/* nut an */
#define mode P2_0
#define tang P2_1
#define giam P2_2
#define change P2_3
/*khai bao cac bien gio phut giay*/
unsigned char index;
unsigned char gio,phut,giay,ngay,thang,nam;
unsigned char gio1,gio2,phut1,phut2,giay1,giay2;
unsigned char ngay1,ngay2,thang1,thang2,nam1,nam2;
bit bit_mode1,bit_mode2,bit_mode3,bit_mode4,bit_tang1, bit_tang2,bit_tang3,bit_tang4;
bit bit_giam1,bit_giam2,bit_giam3,bit_giam4,bit_change 1,bit_change2,bit_change3,bit_change4;
unsigned int dem=0;
#define clear_bit {bit_mode1=0; bit_mode2=0; bit_mode3=0; bit_mode4=0;}
#define clear_bit1 {bit_tang1=0; bit_tang2=0; bit_tang3=0; bit_tang4=0; }
#define clear_bit2 {bit_giam1=0; bit_giam2=0; bit_giam3=0; bit_giam4=0; }
#define clear_bit3 {bit_change1=0; bit_change2=0; bit_change3=0; bit_change4=0;}
led_code[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };
led_code1[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10 };
//===================/* giao tiep i2c */================================================== =
void delay(){
int i;
for (i=0;i<10;i++);
}
void SCL_high(){
SCL=1;
delay();
}
void SCL_low(){
SCL=0;
delay();
}
//------------------------
//=======================================
//------------------------
void i2c_start(){
SDA=1;
SCL=1;
SDA=0;
delay();
SCL=0;
SDA=1;
}
void i2c_stop(){
SDA=0;
SCL=1;
delay();
SDA=1;
}
//--------------------------------------------------------------------------------
//==========*** Ham ghi gia tri vao i2c ***================
bit i2c_write(unsigned char dat){
unsigned char i;
bit outbit;
for (i=1;i<=8;i++){
outbit=dat&0x80;
SDA=outbit;
dat=dat<<1;
SCL_high();
SCL_low();
}
SDA=1; //set SDA to receive Acknowedge
SCL_high();
outbit=SDA; //kiem tra ACK xem slaver nhan dung chua
SCL_low();
return(outbit); //if outbit=1,Ack=1 :error // if outbit=0;Ack=0 :ok
}
//--------------------------------------------------------------------------------
//=========*** Ham doc gia tri tu i2c ***=================
unsigned char i2c_read(bit ack){
unsigned char i,dat;
bit inbit;
dat=0;
for(i=1;i<=8;i++){
SCL_high();
inbit=SDA;
dat=dat<<1;
dat=dat|inbit;
SCL_low();
}
if (ack){ //set SDA=0 (ACK)
SDA=0;
}
else { //set Not ACK
SDA=1;
}
SCL_high();
SCL=0;
SDA=1; //set SDA=1 for next read
delay();
return(dat);
}
//============/* ket thuc cac ham giao tiep cho i2c */===============================
//==========================************************ ****=============================
//=============/* giao tiep voi IC DS1307 */=========================================
//==== Ham ghi du lieu data1 toi thanh ghi dia chi address cua DS1307 ==========
void rtc_write(unsigned char address, unsigned char data1){
i2c_start();
i2c_write(0xd0); // dia chi cua DS1307 che do ghi
i2c_write(address); //dia chi cua thanh ghi
i2c_write(((data1/10)<<4)|(data1%10)); //chuyen thanh so thap phan */
i2c_stop();
}
//======= Ham doc du lieu cua DS1307 tai thanh ghi co dia chi address =========
unsigned char rtc_read(unsigned char address){
unsigned char data1;
i2c_start();
i2c_write(0xd0); //dia chi cua DS1307 che do ghi
i2c_write(address); //dia chi thanh ghi can doc
i2c_start(); //restart
i2c_write(0xd1); //dia chi DS1307 che do doc
data1=i2c_read(0);
i2c_stop();
data1=(data1&0x0f)+(data1>>4)*10; //chuyen thanh so thap phan */
return(data1);
}
//========================***********************=== ============================
//================================================== ===================
void delay1ms(){
int x,y;
for (x=0;x<10;x++){
for (y=0;y<13;y++);{}
}
}
//------------------------------------
void chuyendoiBCD_time(){
giay1=giay%10;
giay2=giay/10;
phut1=phut%10;
phut2=phut/10;
gio1=gio%10;
gio2=gio/10;
}
//-----------------------------------
void chuyendoiBCD_date(){
ngay1=ngay%10;
ngay2=ngay/10;
thang1=thang%10;
thang2=thang/10;
nam1=nam%10;
nam2=nam/10;
}
/*-----------tam thoi chua dung den----------------------
void display_time(){
//bat led1 hien thi hang don vi giay
LED=led_code[giay1]; //xuat ma 7doan ra led
led1=on;
delay1ms(); //tre 1ms
led1=off; //tat led
LED=led_code[giay2];
led2=on;
delay1ms();
led2=off;
LED=led_code[phut1];
led3=on;
delay1ms();
led3=off;
LED=led_code[phut2];
led4=on;
delay1ms();
led4=off;
LED=led_code[gio1];
led5=on;
delay1ms();
led5=off;
LED=led_code[gio2];
led6=on;
delay1ms();
led6=off;
}
//-----------------------------------
void display_date(){
LED=led_code[nam1];
led1=on;
delay1ms();
led1=off;
LED=led_code[nam2];
led2=on;
delay1ms();
led2=off;
LED=led_code[thang1];
led3=on;
delay1ms();
led3=off;
LED=led_code[thang2];
led4=on;
delay1ms();
led4=off;
LED=led_code[ngay1];
led5=on;
delay1ms();
led5=off;
LED=led_code[ngay2];
led6=on;
delay1ms();
led6=off;
}
//-------------------------------------------------*/
void update_time(){
//doc thoi gian tu RTC
giay=rtc_read(0x00); //doc giay (o dang so thap phan)
phut=rtc_read(0x01); // doc phut
gio = rtc_read(0x02); // doc gio
}
void update_date(){
//doc ngay - thang - nam tu RTC
ngay = rtc_read(0x04); // doc ngay` (o dang so thap phan)
thang= rtc_read(0x05); // doc thang
nam = rtc_read(0x06); //doc nam
}
void hienthi_time(){
update_time();
chuyendoiBCD_time();
}
void hienthi_date(){
update_date();
chuyendoiBCD_date();
}
void set_time(); //ham cai dat thoi gian
void set_ngaythangnam(); //ham cai dat ngay thang nam
void set_alarm();
void set_gio();
void set_phut();
void set_ngay();
void set_thang();
void set_nam();
void update_timeDS1307(); //ham update thoi gian sau khi cai dat vao DS1307
void update_dateDS1307(); //ham update ngay thang nam sau khi cai dat vao DS1307
//=====================
void T0_ISR() interrupt 1
{
TR0=0;
TF0=0;
TH0=-1000/256;
TL0=-1000%256;
led1=led2=led3=led4=led5=led6=0;
if(bit_change1==1){
index++;
if(index==1)
{
LED=led_code[ngay2];
led1=1;
}
else if(index==2)
{
LED=led_code[ngay1];
led2=1;
}
else if(index==3)
{
LED=led_code[thang2];
led3=1;
}
else if(index==4)
{
LED=led_code[thang1];
led4=1;
}
else if(index==5)
{
LED=led_code[nam2];
led5=1;
}
else if(index==6)
{
LED=led_code[nam1];
led6=1;
index=0;
}
}
else if(bit_change1==0){
index++;
if(index==1)
{
LED=led_code[gio2];
led1=1;
}
else if(index==2)
{
LED=led_code[gio1];
led2=1;
}
else if(index==3)
{
LED=led_code[phut2];
led3=1;
}
else if(index==4)
{
LED=led_code[phut1];
led4=1;
}
else if(index==5)
{
LED=led_code[giay2];
led5=1;
}
else if(index==6)
{
LED=led_code[giay1];
led6=1;
index=0;
}
}
TR0=1;
}
//==========================
void set_timer(){
TMOD=0x01;
TH0=-1000/256;
TL0=-1000%256;
TF0=0;
ET0=1;
EA=1;
TR0=1;
}
//************************************************** **************************
//----------------------------------------------------------------------------
//========================/* chuong trinh chinh */============================
void main(void){
unsigned char buff_giay;
set_timer();
index=0; P1=0xff; P2=0xff; P0=0xff;
clear_bit; clear_bit1; clear_bit2; clear_bit3;
buff_giay=rtc_read(0x00);
rtc_write(0x00, 0x00); //neu dat cau lenh nay thi khi reset lai VDK thi giay se bi xoa ve 0
rtc_write(0x07, 0x10); //chan(7) SQW/OUT enable pulse out 1Hz
rtc_write(0x00, buff_giay);
while(1){
hienthi_time();
if (change==0) { //neu nhan "change" thi chuyen sang hien thi ngay thang nam
while(change==0){TR0=0;} //cho nha phim
bit_change1=1;
TR0=1;
}
if (mode==0) { //neu nhan "mode" lan1 thi chuyen sang cai dat thoi gian
while(mode==0) {TR0=0;} //cho nha phim
bit_mode1=1; //bit nho dung trong vong lap cai dat thoi gian
set_time();
TR0=1;
}
while(bit_change1==1){
hienthi_date();
if (change==0) { //neu nhan "change" tiep thi chuyen ve che doi hien thi thoi gian
while(change==0){TR0=0;} //cho nha phim
bit_change1=0;
TR0=1;
}
if (mode==0) { //neu nhan "mode" thi chuyen sang che do cai dat ngay thang nam
while(mode==0) {TR0=0;} //cho nha phim
bit_mode3=1; //bit nho dung trong vong lap cai dat ngay thang nam
set_ngaythangnam();
TR0=1;
}
}
}
}
//************************************************** *
//---------------------------------------------------
//************************************************** *
void update_timeDS1307(){
int dulieu=0;
//update phut
dulieu=phut1+phut2*10; //chuyen sang so BCD
rtc_write(0x01, dulieu); //ghi du lieu vao thanh ghi phut
//update gio
dulieu=gio1+gio2*10; //chuyen sang so BCD
rtc_write(0x02, dulieu); //ghi du lieu vao thanh ghi gio
}
//---------------------------------------------------
void update_dateDS1307(){
int dulieu1=0;
//update ngay
dulieu1=ngay1+ngay2*10; //chuyen sang BCD
rtc_write(0x04, dulieu1); //ghi du lieu vao thanh ghi ngay
//update thang
dulieu1=thang1+thang2*10;
rtc_write(0x05, dulieu1);
//update nam
dulieu1=nam1+nam2*10;
rtc_write(0x06, dulieu1);
}
//---------------------------------------------------
void set_time(){
unsigned int dem1=0;
while(bit_mode1==1) { //vong lap o lai chuong trinh cai dat time cho toi khi nhan mode tiep
if (change==0) {
while(change==0) {} //cho nha phim
dem1++; }
if (dem1%2==0) { set_phut(); }
if (dem1%2!=0) { set_gio(); }
update_timeDS1307(); //update lai thoi gian sau khi cai dat vao DS1307
if (mode==0) { //neu nhan nut "mode" lan 2 thi chuyen sang cai dat hen gio
while (mode==0){} //cho nha phim
bit_mode1=0;
bit_mode2=1; //bit nho dung trong vong lap cai dat alarm
set_alarm(); //goi ham cai dat hen gio
}
}
}
//----------------------------------------------------
void set_ngaythangnam(){
unsigned char dem3=1;
while(bit_mode3==1){
if (change==0){ //neu nhan "change" thi chuyen che do ngay -> thang
while(change==0){} //cho nha phim
dem3++;
}
if (mode==0){
while (mode==0){} //cho nha phim
bit_mode3=0;
}
switch(dem3){
case 1: set_ngay(); break;
case 2: set_thang(); break;
case 3: set_nam(); break;
case 4: dem3=1; break;
}
update_dateDS1307();
}
}
//----------------------------------------------------
void set_gio(){
if (tang==0){ //neu nhan nut "tang" thi tang gia tri "gio1" len 1 don vi
while (tang==0){} //cho nha phim
gio1++;
if ((gio2==2)&(gio1==4)) { gio1=0; gio2=0; }
if (gio1==10) { gio2++; gio1=0;}
}
if (giam==0){ //neu nhan nut "giam" thi giam gia tri "gio1" xuong 1 don vi
while(giam==0){} //cho nha phim
gio1--;
if ((gio1==255)&(gio2==0)) {gio1=3; gio2=2; }
if (gio1==255){gio2--; gio1=9;}
}
LED=led_code[phut1];
led3=on;
delay1ms();
led3=off;
LED=led_code[phut2];
led4=on;
delay1ms();
led4=off;
LED=led_code1[gio1];
led5=on;
delay1ms();
led5=off;
LED=led_code1[gio2];
led6=on;
delay1ms();
led6=off;
}
//-----------------------------------------
void set_phut(){
if (tang==0){ //neu nhan nut "tang" thi tang gia tri "gio1" len 1 don vi
while (tang==0){} //cho nha phim
phut1++;
if ((phut2==5)&(phut1==10)) { phut1=0; phut2=0; }
if (phut1==10) { phut2++; phut1=0; }
}
if (giam==0){ //neu nhan nut "giam" thi giam gia tri "gio1" xuong 1 don vi
while(giam==0){} //cho nha phim
phut1--;
if ((phut1==255)& (phut2==0)) { phut1=9; phut2=5; }
if (phut1==255) { phut2--; phut1=9; }
}
LED=led_code1[phut1];
led3=on;
delay1ms();
led3=off;
LED=led_code1[phut2];
led4=on;
delay1ms();
led4=off;
LED=led_code[gio1];
led5=on;
delay1ms();
led5=off;
LED=led_code[gio2];
led6=on;
delay1ms();
led6=off;
}
//------------------------------------------------------
void set_ngay(){
if (tang==0){
while(tang==0){} //cho nha phim
ngay1++;
if ((ngay1==2)&(ngay2==3)) { ngay1=1; ngay2=0; }
if (ngay1==10) { ngay2++; ngay1=0; }
}
if (giam==0){
while(giam==0){} //cho nha phim
ngay1--;
if ((ngay2==0)&(ngay1==0)) { ngay1=1; ngay2=3; }
if (ngay1==255) { ngay2--; ngay1=9; }
}
LED=led_code1[ngay2];
led6=on;
delay1ms();
led6=off;
LED=led_code1[ngay1];
led5=on;
delay1ms();
led5=off;
LED=led_code[thang2];
led4=on;
delay1ms();
led4=off;
LED=led_code[thang1];
led3=on;
delay1ms();
led3=off;
LED=led_code[nam2];
led2=on;
delay1ms();
led2=off;
LED=led_code[nam1];
led1=on;
delay1ms();
led1=off;
}
//---------------------------------------------
void set_thang(){
if(tang==0){
while(tang==0){} //cho nha phim
thang1++;
if ((thang2==1)&(thang1==3)) { thang1=1; thang2=0; }
if (thang1==10) { thang2++; thang1=0; }
}
if (giam==0){
while (giam==0) {} // cho nha phim
thang1--;
if ((thang2==0)&(thang1==0)) { thang1=2; thang2=1; }
if (thang1==255) { thang2--; thang1=9; }
}
LED=led_code[ngay2];
led6=on;
delay1ms();
led6=off;
LED=led_code[ngay1];
led5=on;
delay1ms();
led5=off;
LED=led_code1[thang2];
led4=on;
delay1ms();
led4=off;
LED=led_code1[thang1];
led3=on;
delay1ms();
led3=off;
LED=led_code[nam2];
led2=on;
delay1ms();
led2=off;
LED=led_code[nam1];
led1=on;
delay1ms();
led1=off;
}
//-------------------------------------------------
void set_nam(){
if (tang==0){
while(tang==0){} // cho nha phim
nam1++;
if ((nam2==9)&(nam1==10)) { nam1=0; nam2=0; }
if (nam1==10) { nam2++; nam1=0; }
}
if (giam==0){
while(giam==0){} //cho nha phim
nam1--;
if ((nam2==0)&(nam1==255)) { nam1=9; nam2=9; }
if (nam1==255) { nam2--; nam1=9; }
}
LED=led_code[ngay2];
led6=on;
delay1ms();
led6=off;
LED=led_code[ngay1];
led5=on;
delay1ms();
led5=off;
LED=led_code[thang2];
led4=on;
delay1ms();
led4=off;
LED=led_code[thang1];
led3=on;
delay1ms();
led3=off;
LED=led_code1[nam2];
led2=on;
delay1ms();
led2=off;
LED=led_code1[nam1];
led1=on;
delay1ms();
led1=off;
}
Leave a comment:
-




code:
giao tiep I2C (cái này mình tham khảo trên diễn đàn thôi)
giao tiếp với DS1307#define SCL P1_0
#define SDA P1_1
//=====================
/* giao tiep i2c */
//-------------------------
void delay(){
int i;
for (i=0;i<10;i++);
}
void SCL_high(){
SCL=1;
delay();
}
void SCL_low(){
SCL=0;
delay();
}
//------------------------
//=======================================
//------------------------
void i2c_start(){
SDA=1;
SCL=1;
SDA=0;
delay();
SCL=0;
SDA=1;
}
void i2c_stop(){
SDA=0;
SCL=1;
delay();
SDA=1;
}
//-------------------------
//==========*** Ham ghi gia tri vao i2c ***================
bit i2c_write(unsigned char dat){
unsigned char i;
bit outbit;
for (i=1;i<=8;i++){
outbit=dat&0x80;
SDA=outbit;
dat=dat<<1;
SCL_high();
SCL_low();
}
SDA=1; //set SDA to receive Acknowedge
SCL_high();
outbit=SDA; //kiem tra ACK xem slaver nhan dung chua
SCL_low();
return(outbit); //if outbit=1,Ack=1 :error // if outbit=0;Ack=0 :ok
}
//================================================== ====
main://================================================== ==
/* giao tiep voi IC DS1307 */
//==== Ham ghi du lieu data1 toi thanh ghi dia chi address cua DS1307 ==========
void rtc_write(unsigned char address, unsigned char data1){
i2c_start();
i2c_write(0xd0); // dia chi cua DS1307 che do ghi
i2c_write(address); //dia chi cua thanh ghi
/* i2c_write(((data1/10)<<4)|(data1%10)); //chuyen thanh so thap phan */
i2c_stop();
}
//======= Ham doc du lieu cua DS1307 tai thanh ghi co dia chi address =========
unsigned char rtc_read(unsigned char address){
unsigned char data1;
i2c_start();
i2c_write(0xd0); //dia chi cua DS1307 che do ghi
i2c_write(address); //dia chi thanh ghi can doc
i2c_start(); //restart
i2c_write(0xd1); //dia chi DS1307 che do doc
data1=i2c_read(0);
i2c_stop();
/*data1=(data1&0x0f)+(data1>>4)*10; //chuyen thanh so thap phan */
return(data1);
}
//================================
#include <at89x51.h>
#define SCL P1_0
#define SDA P1_1
/* dinh nghia cac bien hien thi */
#define LED P0 // xuat ma led
#define DP P0_7
/*quet led*/
#define on 1
#define off 0
#define led1 P1_2 //dung de quet led
#define led2 P1_3
#define led3 P1_4
#define led4 P1_5
#define led5 P1_6
#define led6 P1_7
/* nut an */
#define mode P2_0
#define tang P2_1
#define giam P2_2
#define change P2_3
/*khai bao cac bien gio phut giay*/
unsigned char index;
unsigned char gio,phut,giay,ngay,thang,nam;
unsigned char gio1,gio2,phut1,phut2,giay1,giay2;
unsigned char ngay1,ngay2,thang1,thang2,nam1,nam2;
bit bit_mode1,bit_mode2,bit_mode3,bit_mode4,bit_tang1, bit_tang2,bit_tang3,bit_tang4;
bit bit_giam1,bit_giam2,bit_giam3,bit_giam4,bit_change 1,bit_change2,bit_change3,bit_change4;
unsigned int dem=0;
#define clear_bit {bit_mode1=0; bit_mode2=0; bit_mode3=0; bit_mode4=0;}
#define clear_bit1 {bit_tang1=0; bit_tang2=0; bit_tang3=0; bit_tang4=0; }
#define clear_bit2 {bit_giam1=0; bit_giam2=0; bit_giam3=0; bit_giam4=0; }
#define clear_bit3 {bit_change1=0; bit_change2=0; bit_change3=0; bit_change4=0;}
led_code[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };
led_code1[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10 };
//===================/* giao tiep i2c */================================================== =
void delay(){
int i;
for (i=0;i<10;i++);
}
void SCL_high(){
SCL=1;
delay();
}
void SCL_low(){
SCL=0;
delay();
}
//------------------------
//=======================================
//------------------------
void i2c_start(){
SDA=1;
SCL=1;
SDA=0;
delay();
SCL=0;
SDA=1;
}
void i2c_stop(){
SDA=0;
SCL=1;
delay();
SDA=1;
}
//--------------------------------------------------------------------------------
//==========*** Ham ghi gia tri vao i2c ***================
bit i2c_write(unsigned char dat){
unsigned char i;
bit outbit;
for (i=1;i<=8;i++){
outbit=dat&0x80;
SDA=outbit;
dat=dat<<1;
SCL_high();
SCL_low();
}
SDA=1; //set SDA to receive Acknowedge
SCL_high();
outbit=SDA; //kiem tra ACK xem slaver nhan dung chua
SCL_low();
return(outbit); //if outbit=1,Ack=1 :error // if outbit=0;Ack=0 :ok
}
//--------------------------------------------------------------------------------
//=========*** Ham doc gia tri tu i2c ***=================
unsigned char i2c_read(bit ack){
unsigned char i,dat;
bit inbit;
dat=0;
for(i=1;i<=8;i++){
SCL_high();
inbit=SDA;
dat=dat<<1;
dat=dat|inbit;
SCL_low();
}
if (ack){ //set SDA=0 (ACK)
SDA=0;
}
else { //set Not ACK
SDA=1;
}
SCL_high();
SCL=0;
SDA=1; //set SDA=1 for next read
delay();
return(dat);
}
//============/* ket thuc cac ham giao tiep cho i2c */===============================
//==========================************************ ****=============================
//=============/* giao tiep voi IC DS1307 */=========================================
//==== Ham ghi du lieu data1 toi thanh ghi dia chi address cua DS1307 ==========
void rtc_write(unsigned char address, unsigned char data1){
i2c_start();
i2c_write(0xd0); // dia chi cua DS1307 che do ghi
i2c_write(address); //dia chi cua thanh ghi
i2c_write(((data1/10)<<4)|(data1%10)); //chuyen thanh so thap phan */
i2c_stop();
}
//======= Ham doc du lieu cua DS1307 tai thanh ghi co dia chi address =========
unsigned char rtc_read(unsigned char address){
unsigned char data1;
i2c_start();
i2c_write(0xd0); //dia chi cua DS1307 che do ghi
i2c_write(address); //dia chi thanh ghi can doc
i2c_start(); //restart
i2c_write(0xd1); //dia chi DS1307 che do doc
data1=i2c_read(0);
i2c_stop();
data1=(data1&0x0f)+(data1>>4)*10; //chuyen thanh so thap phan */
return(data1);
}
//========================***********************=== ============================
//================================================== ===================
void delay1ms(){
int x,y;
for (x=0;x<10;x++){
for (y=0;y<13;y++);{}
}
}
//------------------------------------
void chuyendoiBCD_time(){
giay1=giay%10;
giay2=giay/10;
phut1=phut%10;
phut2=phut/10;
gio1=gio%10;
gio2=gio/10;
}
//-----------------------------------
void chuyendoiBCD_date(){
ngay1=ngay%10;
ngay2=ngay/10;
thang1=thang%10;
thang2=thang/10;
nam1=nam%10;
nam2=nam/10;
}
/*-----------tam thoi chua dung den----------------------
void display_time(){
//bat led1 hien thi hang don vi giay
LED=led_code[giay1]; //xuat ma 7doan ra led
led1=on;
delay1ms(); //tre 1ms
led1=off; //tat led
LED=led_code[giay2];
led2=on;
delay1ms();
led2=off;
LED=led_code[phut1];
led3=on;
delay1ms();
led3=off;
LED=led_code[phut2];
led4=on;
delay1ms();
led4=off;
LED=led_code[gio1];
led5=on;
delay1ms();
led5=off;
LED=led_code[gio2];
led6=on;
delay1ms();
led6=off;
}
//-----------------------------------
void display_date(){
LED=led_code[nam1];
led1=on;
delay1ms();
led1=off;
LED=led_code[nam2];
led2=on;
delay1ms();
led2=off;
LED=led_code[thang1];
led3=on;
delay1ms();
led3=off;
LED=led_code[thang2];
led4=on;
delay1ms();
led4=off;
LED=led_code[ngay1];
led5=on;
delay1ms();
led5=off;
LED=led_code[ngay2];
led6=on;
delay1ms();
led6=off;
}
//-------------------------------------------------*/
void update_time(){
//doc thoi gian tu RTC
giay=rtc_read(0x00); //doc giay (o dang so thap phan)
phut=rtc_read(0x01); // doc phut
gio = rtc_read(0x02); // doc gio
}
void update_date(){
//doc ngay - thang - nam tu RTC
ngay = rtc_read(0x04); // doc ngay` (o dang so thap phan)
thang= rtc_read(0x05); // doc thang
nam = rtc_read(0x06); //doc nam
}
void hienthi_time(){
update_time();
chuyendoiBCD_time();
}
void hienthi_date(){
update_date();
chuyendoiBCD_date();
}
void set_time(); //ham cai dat thoi gian
void set_ngaythangnam(); //ham cai dat ngay thang nam
void set_alarm();
void set_gio();
void set_phut();
void set_ngay();
void set_thang();
void set_nam();
void update_timeDS1307(); //ham update thoi gian sau khi cai dat vao DS1307
void update_dateDS1307(); //ham update ngay thang nam sau khi cai dat vao DS1307
//=====================
void T0_ISR() interrupt 1
{
TR0=0;
TF0=0;
TH0=-1000/256;
TL0=-1000%256;
led1=led2=led3=led4=led5=led6=0;
if(bit_change1==1){
index++;
if(index==1)
{
LED=led_code[ngay2];
led1=1;
}
else if(index==2)
{
LED=led_code[ngay1];
led2=1;
}
else if(index==3)
{
LED=led_code[thang2];
led3=1;
}
else if(index==4)
{
LED=led_code[thang1];
led4=1;
}
else if(index==5)
{
LED=led_code[nam2];
led5=1;
}
else if(index==6)
{
LED=led_code[nam1];
led6=1;
index=0;
}
}
else if(bit_change1==0){
index++;
if(index==1)
{
LED=led_code[gio2];
led1=1;
}
else if(index==2)
{
LED=led_code[gio1];
led2=1;
}
else if(index==3)
{
LED=led_code[phut2];
led3=1;
}
else if(index==4)
{
LED=led_code[phut1];
led4=1;
}
else if(index==5)
{
LED=led_code[giay2];
led5=1;
}
else if(index==6)
{
LED=led_code[giay1];
led6=1;
index=0;
}
}
TR0=1;
}
//==========================
void set_timer(){
TMOD=0x01;
TH0=-1000/256;
TL0=-1000%256;
TF0=0;
ET0=1;
EA=1;
TR0=1;
}
//************************************************** **************************
//----------------------------------------------------------------------------
//========================/* chuong trinh chinh */============================
void main(void){
unsigned char buff_giay;
set_timer();
index=0; P1=0xff; P2=0xff; P0=0xff;
clear_bit; clear_bit1; clear_bit2; clear_bit3;
buff_giay=rtc_read(0x00);
rtc_write(0x00, 0x00); //neu dat cau lenh nay thi khi reset lai VDK thi giay se bi xoa ve 0
rtc_write(0x07, 0x10); //chan(7) SQW/OUT enable pulse out 1Hz
rtc_write(0x00, buff_giay);
while(1){
hienthi_time();
if (change==0) { //neu nhan "change" thi chuyen sang hien thi ngay thang nam
while(change==0){TR0=0;} //cho nha phim
bit_change1=1;
TR0=1;
}
if (mode==0) { //neu nhan "mode" lan1 thi chuyen sang cai dat thoi gian
while(mode==0) {TR0=0;} //cho nha phim
bit_mode1=1; //bit nho dung trong vong lap cai dat thoi gian
set_time();
TR0=1;
}
while(bit_change1==1){
hienthi_date();
if (change==0) { //neu nhan "change" tiep thi chuyen ve che doi hien thi thoi gian
while(change==0){TR0=0;} //cho nha phim
bit_change1=0;
TR0=1;
}
if (mode==0) { //neu nhan "mode" thi chuyen sang che do cai dat ngay thang nam
while(mode==0) {TR0=0;} //cho nha phim
bit_mode3=1; //bit nho dung trong vong lap cai dat ngay thang nam
set_ngaythangnam();
TR0=1;
}
}
}
}
//************************************************** *
//---------------------------------------------------
//************************************************** *
void update_timeDS1307(){
int dulieu=0;
//update phut
dulieu=phut1+phut2*10; //chuyen sang so BCD
rtc_write(0x01, dulieu); //ghi du lieu vao thanh ghi phut
//update gio
dulieu=gio1+gio2*10; //chuyen sang so BCD
rtc_write(0x02, dulieu); //ghi du lieu vao thanh ghi gio
}
//---------------------------------------------------
void update_dateDS1307(){
int dulieu1=0;
//update ngay
dulieu1=ngay1+ngay2*10; //chuyen sang BCD
rtc_write(0x04, dulieu1); //ghi du lieu vao thanh ghi ngay
//update thang
dulieu1=thang1+thang2*10;
rtc_write(0x05, dulieu1);
//update nam
dulieu1=nam1+nam2*10;
rtc_write(0x06, dulieu1);
}
//---------------------------------------------------
void set_time(){
unsigned int dem1=0;
while(bit_mode1==1) { //vong lap o lai chuong trinh cai dat time cho toi khi nhan mode tiep
if (change==0) {
while(change==0) {} //cho nha phim
dem1++; }
if (dem1%2==0) { set_phut(); }
if (dem1%2!=0) { set_gio(); }
update_timeDS1307(); //update lai thoi gian sau khi cai dat vao DS1307
if (mode==0) { //neu nhan nut "mode" lan 2 thi chuyen sang cai dat hen gio
while (mode==0){} //cho nha phim
bit_mode1=0;
bit_mode2=1; //bit nho dung trong vong lap cai dat alarm
set_alarm(); //goi ham cai dat hen gio
}
}
}
//----------------------------------------------------
void set_ngaythangnam(){
unsigned char dem3=1;
while(bit_mode3==1){
if (change==0){ //neu nhan "change" thi chuyen che do ngay -> thang
while(change==0){} //cho nha phim
dem3++;
}
if (mode==0){
while (mode==0){} //cho nha phim
bit_mode3=0;
}
switch(dem3){
case 1: set_ngay(); break;
case 2: set_thang(); break;
case 3: set_nam(); break;
case 4: dem3=1; break;
}
update_dateDS1307();
}
}
//----------------------------------------------------
void set_gio(){
if (tang==0){ //neu nhan nut "tang" thi tang gia tri "gio1" len 1 don vi
while (tang==0){} //cho nha phim
gio1++;
if ((gio2==2)&(gio1==4)) { gio1=0; gio2=0; }
if (gio1==10) { gio2++; gio1=0;}
}
if (giam==0){ //neu nhan nut "giam" thi giam gia tri "gio1" xuong 1 don vi
while(giam==0){} //cho nha phim
gio1--;
if ((gio1==255)&(gio2==0)) {gio1=3; gio2=2; }
if (gio1==255){gio2--; gio1=9;}
}
LED=led_code[phut1];
led3=on;
delay1ms();
led3=off;
LED=led_code[phut2];
led4=on;
delay1ms();
led4=off;
LED=led_code1[gio1];
led5=on;
delay1ms();
led5=off;
LED=led_code1[gio2];
led6=on;
delay1ms();
led6=off;
}
//-----------------------------------------
void set_phut(){
if (tang==0){ //neu nhan nut "tang" thi tang gia tri "gio1" len 1 don vi
while (tang==0){} //cho nha phim
phut1++;
if ((phut2==5)&(phut1==10)) { phut1=0; phut2=0; }
if (phut1==10) { phut2++; phut1=0; }
}
if (giam==0){ //neu nhan nut "giam" thi giam gia tri "gio1" xuong 1 don vi
while(giam==0){} //cho nha phim
phut1--;
if ((phut1==255)& (phut2==0)) { phut1=9; phut2=5; }
if (phut1==255) { phut2--; phut1=9; }
}
LED=led_code1[phut1];
led3=on;
delay1ms();
led3=off;
LED=led_code1[phut2];
led4=on;
delay1ms();
led4=off;
LED=led_code[gio1];
led5=on;
delay1ms();
led5=off;
LED=led_code[gio2];
led6=on;
delay1ms();
led6=off;
}
//------------------------------------------------------
void set_ngay(){
if (tang==0){
while(tang==0){} //cho nha phim
ngay1++;
if ((ngay1==2)&(ngay2==3)) { ngay1=1; ngay2=0; }
if (ngay1==10) { ngay2++; ngay1=0; }
}
if (giam==0){
while(giam==0){} //cho nha phim
ngay1--;
if ((ngay2==0)&(ngay1==0)) { ngay1=1; ngay2=3; }
if (ngay1==255) { ngay2--; ngay1=9; }
}
LED=led_code1[ngay2];
led6=on;
delay1ms();
led6=off;
LED=led_code1[ngay1];
led5=on;
delay1ms();
led5=off;
LED=led_code[thang2];
led4=on;
delay1ms();
led4=off;
LED=led_code[thang1];
led3=on;
delay1ms();
led3=off;
LED=led_code[nam2];
led2=on;
delay1ms();
led2=off;
LED=led_code[nam1];
led1=on;
delay1ms();
led1=off;
}
//---------------------------------------------
void set_thang(){
if(tang==0){
while(tang==0){} //cho nha phim
thang1++;
if ((thang2==1)&(thang1==3)) { thang1=1; thang2=0; }
if (thang1==10) { thang2++; thang1=0; }
}
if (giam==0){
while (giam==0) {} // cho nha phim
thang1--;
if ((thang2==0)&(thang1==0)) { thang1=2; thang2=1; }
if (thang1==255) { thang2--; thang1=9; }
}
LED=led_code[ngay2];
led6=on;
delay1ms();
led6=off;
LED=led_code[ngay1];
led5=on;
delay1ms();
led5=off;
LED=led_code1[thang2];
led4=on;
delay1ms();
led4=off;
LED=led_code1[thang1];
led3=on;
delay1ms();
led3=off;
LED=led_code[nam2];
led2=on;
delay1ms();
led2=off;
LED=led_code[nam1];
led1=on;
delay1ms();
led1=off;
}
//-------------------------------------------------
void set_nam(){
if (tang==0){
while(tang==0){} // cho nha phim
nam1++;
if ((nam2==9)&(nam1==10)) { nam1=0; nam2=0; }
if (nam1==10) { nam2++; nam1=0; }
}
if (giam==0){
while(giam==0){} //cho nha phim
nam1--;
if ((nam2==0)&(nam1==255)) { nam1=9; nam2=9; }
if (nam1==255) { nam2--; nam1=9; }
}
LED=led_code[ngay2];
led6=on;
delay1ms();
led6=off;
LED=led_code[ngay1];
led5=on;
delay1ms();
led5=off;
LED=led_code[thang2];
led4=on;
delay1ms();
led4=off;
LED=led_code[thang1];
led3=on;
delay1ms();
led3=off;
LED=led_code1[nam2];
led2=on;
delay1ms();
led2=off;
LED=led_code1[nam1];
led1=on;
delay1ms();
led1=off;
}
Leave a comment:
Bài viết mới nhất
Collapse
-
Trả lời cho Đấu tắt điện cho máy tính bảngbởi bqvietBqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
-
Channel: Thiết bị điện tử cá nhân
06-12-2025, 17:17 -
-
Trả lời cho Xin hỏi về mạch thu FM/AM trong catsettebởi nguyendinhvanTheo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
-
Channel: Điện thanh
05-12-2025, 19:59 -
-
Trả lời cho Đấu tắt điện cho máy tính bảngbởi afrendlyCó vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
-
Channel: Thiết bị điện tử cá nhân
04-12-2025, 01:27 -
-
Trả lời cho Máy điện châm ?bởi nick22Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
-
Channel: Điện tử y sinh
01-12-2025, 13:23 -

Leave a comment: