Xin chào các bạn!
Trong bài viết này, mình sẽ hướng dẫn các bạn lập trình hiển thị các số từ 0 – 9999 lên Led 7 thanh với vi điều khiển Atmega16. Project chạy trên KIT AVR V4.
Chú ý : Source code bài viết dưới đây được biên dịch bằng phần mềm CodeVisionAVR để biên dịch code không lỗi xin vui lòng Download bản CodeVisionAVR Tại Đây
I.SƠ ĐỒ PHẦN CỨNG
Trên KIT AVR V4 hỗ trợ các bạn khối Led 7 thanh 4 số Anode chung có sơ đồ như sau:
Trong đó, các chân kết nối với Atmega16:
- Các chân điều khiển cấp nguồn LQ1:4 kết nối lần lượt với PORTC4:7.
- Các chân dữ liệu A, B, C, D, E, F, G, Dp kết nối lần lượt với PORTB0:7.
Ta có bảng mã hiển thị các số từ 0 – 9 trên Led 7 thanh:
II.LẬP TRÌNH PHẦN MỀM
1.Phương pháp quét Led 7 thanh
KIT AVR V4 hỗ trợ phần cứng Led 7 thanh 4 số Anode chung vì vậy các bạn cần sử dụng phương pháp quét Led để điều khiển hiển thị.
Phương pháp quét Led dựa trên sự lưu ảnh của mắt người. Mắt người phải mất khoảng 25 ms để xử lý một hình ảnh (40 hình/s), vậy nếu cho Led sáng tắt với khoảng thời gian nhỏ hơn 25 ms thì giá trị hiển thị trên Led giống như luôn sáng.
Để hiển thị lên màn hình Led 7 thanh 4 số, ta lần lượt cấp nguồn cho từng con Led và bắn dữ liệu vào các chân data.
Gọi thời gian giữa 2 lần cấp nguồn là T.
Vậy khoảng thời gian 1 con Led sáng – tắt là 4T < 25ms à T < 6ms.
Trong bài toán này mình sử dụng TIMER1 của Atmega16 để tạo khoảng thời gian giữa 2 lần cấp nguồn T = 1ms.
2.Lập trình hiển thị các số từ 0 – 9999 lên Led 7 thanh 4 số Anode chung
Các bạn cần cấu hình GPIO: PORTC4:7, PORTB0:7 là các chân OUTPUT với mức logic đầu ra ban đầu là mức 1:
// Port B initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1 PORTB=0xFF; DDRB=0xFF; // Port C initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In // State7=1 State6=1 State5=1 State4=1 State3=T State2=T State1=T State0=T PORTC=0xF0; DDRC=0xF0;
Các bạn cấu hình xảy ra ngắt tràn TIMER1 sau 1ms:
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 1000.000 kHz // Mode: Normal top=0xFFFF // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: On // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x02; TCNT1H=0xFC; TCNT1L=0x17; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x04; // Global enable interrupts #asm("sei")
Sau 1 ms, ngắt tràn TIMER1 xảy ra, các bạn thực hiện quét Led ở trình phục vụ ngắt TIMER1 interrupt [TIM1_OVF] void timer1_ovf_isr(void):
interrupt [TIM1_OVF] void timer1_ovf_isr(void) { // Reinitialize Timer1 value TCNT1H=0xFC17 >> 8; TCNT1L=0xFC17 & 0xff; // Place your code here LED7_Display(Value_Display); }
Trong trình phục vụ ngắt mình sử dụng hàm hiển thị giá trị số lên Led 7 thanh void LED7_Display(uint16_t Value) (nằm trong File led7 thuộc Folder User):
void LED7_Display(uint16_t Value) { LED7_CacuCode(Value); LED7_PowerOff(); LED7_DataOut(Led7_BufferData[Led7_Index]); LED7_PowerOn(Led7_Index); Led7_Index++; if(Led7_Index>=NUMBER_LED7)Led7_Index=0; }
Thực hiện thay đổi giá trị hiển thị lên Led 7 thanh trong vòng while(1):
while(1) { Value_Display++; if(Value_Display > 9999) Value_Display = 0; delay_ms(500); }
Link dowload File Code của chương trình: TẠI ĐÂY