Trích:
Nguyên văn bởi saobang
Em tìm được đoạn code này ( đọc encode và tính toán hiển thị số vòng động cơ lên LCD 16x2) nhưng còn vài chỗ chưa hiểu vì ngôn ngữ C em chưa bik nhiều lắm, mong anh chị giải thích giùm em. Em cũng mới tìm hiểu về Pic.
Code:
#include <16f877a.h>
#include <def_877a.h>
#include <lcd_lib_4bit.c>
#use delay(clock=20000000)
int8 nghin,tram,chuc,donvi;
void tinhtoan_hienthi(int16 x);
int16 count,so_vong,int_count1,x;
#define INTS_PER_SECOND1 25
#int_rtcc // Ngat Timer 0
void Timer0_isr() // Dem so vong quay dong co
{
count++;
}
#INT_TIMER1 // Chuong trinh ngat Timer 1
void Timer1_isr()
{ // Ham duoc goi khi Timer1 tran (65535->0) //
//Timer1 dinh thoi 1s //
if(--int_count1==0) //Em chưa hiểu cái hàm timer
{ //này nó như thế nào
int_count1 = INTS_PER_SECOND1;
so_vong = (count*255 + get_timer0())/400; //
count = 0;
set_timer0(0);
}
}
void tinhtoan_hienthi(int16 x) // giải thích lun giúp em hàm này
{nghin = x / 1000 + 0x30;
x = x % 1000;
tram = x / 100 + 0x30; // tach so hang tram
x = x % 100; // chia lay phan du
chuc = x / 10 + 0x30; // tach lay phan chuc
donvi = x % 10 + 0x30; // phan don vi
lcd_putcmd(0xC0);
printf(lcd_putchar,"toc do=");
lcd_putchar(nghin);
lcd_putchar(tram);
lcd_putchar(chuc);
lcd_putchar(donvi);
}
void init()
{
lcd_putcmd(0x80);
int_count1 = INTS_PER_SECOND1;//19 lan 1 giay
setup_timer_0 (RTCC_DIV_1|RTCC_EXT_H_TO_L); // Timer0 is Counter
set_timer0(0);
set_timer1(15535);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4); // Timer1 is Timer
enable_interrupts(INT_RTCC);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
count = 0;
lcd_init();
delay_ms(200);
printf(lcd_putchar,"toc do dong co");
}
void main()
{
init();
//setup_adc_ports(NO_ANALOGS);
//setup_adc(ADC_OFF);
//setup_psp(PSP_DISABLED);
//setup_spi(FALSE);
so_vong = 0;// khoi tao gia tri
while(1) // doan chuong trinh hien thi len LCD
{
tinhtoan_hienthi(so_vong);
delay_ms(500);
}
}
chỗ cái hàm timer đó cách tính số vòng như thế nào vậy?
với lại các lệnh tách số đó em nên hiểu như thế nào ?
Em hỏi hơi nhiều nhỉ? hihi. nhưng mà nghĩ ko ra nên đành lên đây hỏi vậy!
em cảm ơn trước ạh!
|
Theo minh nghĩ chương trình này đọc encoder rồi quy ra số vòng quay. Hàm ngắt timer 1 chỉ để định một thời gian nhất định để cập nhật số vòng quay, quy ra bởi giá trị đọc được của timer0
Còn lệnch tách số, mỗi đơn vị(hàng nghìn, trăm...) phải cộng thêm giá trị 0x30 để giải mã hiển thị trên LCD.
Không bit có giúp gì được cho bạn không...