19-06-2006, 01:21 PM | #1 |
Đệ tử 3 túi
Tham gia ngày: Jun 2006
Bài gửi: 50
: |
Lập trình với ngôn ngử Basic
Sau khi đăng nhập vào diễn đàn em thấy hầu như mọi người sử dụng CCS và HT để lập trình cho PIC, ngôn ngữ trên hổ trợ rất nhiều tuy nhiên bên cạnh dó cũng có ngôn ngữ BASIC giúp ích chúng ta rất nhiều trong việc thiết kế các module nhỏ. Do đó em xin trình bày mốt số câu lệnh với BASIC giúp cho các bạn mới học để làm quen với PIC
Chương trình sử dụng đựoc Down tại: http://www.oshonsoft.com/downloads.html |
19-06-2006, 01:21 PM | #2 |
Đệ tử 3 túi
Tham gia ngày: Jun 2006
Bài gửi: 50
: |
Đầu tiên là cách khai báo biến, trong Basic hổ trợ 4 loại dữ liệu đó là:
Bit: có giá trị 0 hoặc 1 Byte: chiếm 1 byte có giá trị từ 0 – 255 Word: chiếm 2 byte có giá trị từ 0-65536 Long: chiếm 4 byte có gía trị từ 0-4294967295 Trong chương trình Basic mà em sử dụng thì không có hổ trợ số âm và thưc nhưng bằng thuật tóan ta có thể thay thế được. Cú pháp : dim <tên biến> as <loại, kiểu biến> Vd: dim a as byte Dim b as bit Dim c as word Dim d as long Và chúng ta cũng có thể sử dung khai báo kiểu mảng (vd: sử dụng trong giải mã led 7 đọan) Vd: dim a(10) as byte ‘khai báo mãng a gồm 10 phần tử kiểu byte. Ngoài ra chúng ta còn có thể truy suất tới từng bit của biến Dim a as byte a.5=7 ‘khai báo biến a là byte và set bit thứ sáu là 1 Hoặc gán trực tiếp với các port hoặc các thanh ghi Trisb=0ffh ‘khai báo portb là input Status.5=1 ‘nhảy vào bank 1 Portc.1=1 ‘set bit thứ hai port c lên 1 nếu port c là output |
19-06-2006, 01:22 PM | #3 |
Đệ tử 3 túi
Tham gia ngày: Jun 2006
Bài gửi: 50
: |
Cách khai báo hằng và đạt lại tên cho các thanh ghi
Cú pháp: const <tên hằng>= <gia trị> hoặc define <tên hằng>= <gía trị> Vd: khai báo a là hằng số và có giá trị là 5 Const a=5 Cú pháp: symbol <tên mới> = <bit hoặ thanh ghi> Vd: SYMBOL LED1 = PORTB.0 LED1 = 1 |
19-06-2006, 01:23 PM | #4 |
Đệ tử 3 túi
Tham gia ngày: Jun 2006
Bài gửi: 50
: |
Các phép tóan gồm có (+; -; *; /; %) và các phép tóan logic (not; and; or; nand; nor; xor; nxor)
Ví dụ: DIM A AS WORD DIM B AS WORD DIM X AS WORD A = 123 B = A * 234 X = 2 X = (12345 - B * X) / (A + B) Ví dụ: DIM A AS BIT DIM B AS BIT DIM X AS BIT X = NOT A X = A AND B X = A OR B X = A XOR B X = A NAND B X = A NOR B X = A NXOR B |
19-06-2006, 01:23 PM | #5 |
Đệ tử 3 túi
Tham gia ngày: Jun 2006
Bài gửi: 50
: |
Câu lện goto: dung để nhảy tới 1 nhã nào đó đã được đặt tên trước
Vídụ: DIM A AS WORD A = 0 loop: A = A + 1 GOTO loop Ví dụ: sử dung portb làm mạch dếm với chu kì 1s Dim a as byte Trisb=00 Main: Portb=a A=a+1 Goto main End |
19-06-2006, 01:24 PM | #6 |
Đệ tử 3 túi
Tham gia ngày: Jun 2006
Bài gửi: 50
: |
Cậu lệnh chờ dợi.
Cú pháp: delayms(<số mili giây cần trì hõan>) , delayus(<số micro giay cần trì hõan>) Vd: nếu ta dung thãch anh 4Mhz thì cau lệnh delayms(1) sẽ cho ta trì hõan 1000 câu lệnh ( tương dương với 1000 câu lện nop) Ví dụ: DIM A AS WORD A = 100 WAITMS A WAITUS 50 |
19-06-2006, 01:25 PM | #7 |
Đệ tử 3 túi
Tham gia ngày: Jun 2006
Bài gửi: 50
: |
Các câu lệnh về vòng lặp FOR , WHILE và câu lện điều kiện IF
Vòng lặp FOR: Cú pháp: For <giá trị dầu> to <giá trị cuối> step <bước nhảy> Thực hiện lệnh Next <tên biến dể tiếp tục> Ví dụ: DIM A AS BYTE DIM B AS BYTE DIM X AS BYTE B = 255 X = 2 TRISB = 0 FOR A = B TO 0 STEP -X PORTB = A NEXT A Vòng lặp While: Cú pháp: While (<điều kiện>) Thực hiệ lệnh Wend ‘kết thúc Ví dụ: DIM A AS BYTE TRISB = 0 A = 255 WHILE A > 0 PORTB = A A = A - 1 WAITMS 100 WEND PORTB = A Câu lện điều kiện IF Cú pháp: If <điều kiện> then Thực hiện lệnh Else ‘ ngược lại Thực hiện lệnh End if Ví dụ: DIM A AS BYTE TRISB = 0 A = 255 WHILE A > 0 PORTB = A A = A - 1 WAITMS 100 WEND PORTB = A |
19-06-2006, 01:26 PM | #8 |
Đệ tử 3 túi
Tham gia ngày: Jun 2006
Bài gửi: 50
: |
Câu lệnh LOOKUP giống như là kỹ thuật bảng tra. Ví dụ đi63n hình là dung giải mã led bảy thanh.
Ví dụ: DIM DIGIT AS BYTE DIM MASK AS BYTE loop: TRISB = %00000000 FOR DIGIT = 0 TO 9 MASK = LOOKUP(0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F), DIGIT PORTB = MASK WAITMS 1000 NEXT DIGIT GOTO loop Ngoài ra nó còn cho phép ta trả về mã ASCII của kí tự; Ví dụ: MASK = LOOKUP("ABCDEFGHIJK"), INDEX |
19-06-2006, 01:27 PM | #9 |
Đệ tử 3 túi
Tham gia ngày: Jun 2006
Bài gửi: 50
: |
Sử dụng chương trình con với cau lệnh GOSUB
Cú pháp: gosub <tên chương trình con> Ví dụ: SYMBOL ad_action = ADCON0.GO_DONE SYMBOL display = PORTB TRISB = %00000000 TRISA = %111111 ADCON0 = 0xC0 ADCON1 = 0 HIGH ADCON0.ADON main: GOSUB getadresult display = ADRESH GOTO main END getadresult: HIGH ad_action WHILE ad_action WEND RETURN Ví dụ trên là biến đổi giá trị Analog đưa vào RA.0 và thể hiện ra PORTB.0 sử dung chương trình con và các vòng lặp. |
19-06-2006, 01:29 PM | #10 |
Đệ tử 3 túi
Tham gia ngày: Jun 2006
Bài gửi: 50
: |
Sử dung EEPROM nội:
Cú pháp: READ <địa chỉ> ,<giá trị> ‘đọc từ EEPROM WRITE <địa chỉ> ,<giá trị> ‘ghi vào EEPROM Ví dụ DIM A AS BYTE DIM B AS BYTE A = 10 READ A, B WRITE 11, B |
19-06-2006, 01:29 PM | #11 |
Đệ tử 3 túi
Tham gia ngày: Jun 2006
Bài gửi: 50
: |
Sử dụng ngắt: sau khi viết chương trình chính xong thì cuối cùng ta viết chương trinh phục vụ ngắt.
Cú pháp: Main: ……. ……. Goto main End On interrupts <chương trình phục vụ ngắt viế ở đây> Resume |
19-06-2006, 01:30 PM | #12 |
Đệ tử 3 túi
Tham gia ngày: Jun 2006
Bài gửi: 50
: |
Ví dụ ngắt ngoài RB0:
DIM A AS BYTE A = 255 TRISA = 0 PORTA = A INTCON.INTE = 1 ENABLE END ON INTERRUPT A = A - 1 PORTA = A INTCON.INTF = 0 RESUME Đọan chương trình trên sử dụng ngắt ngoài ở chân RB.0. Nếu có ngắt thì gảim a đi 1 và đưa giá trị của a ra PORTA. Lưu ý là khi kết thúc chương trình phục vụ ngắt thì phải xoa cờ ngắt |
19-06-2006, 01:32 PM | #13 |
Đệ tử 3 túi
Tham gia ngày: Jun 2006
Bài gửi: 50
: |
Ví dụ ngắt do bộ định thời:
DIM T AS WORD T = 0 TRISA = 0xFF ADCON1 = 0 TRISB = 0 OPTION_REG.T0CS = 0 INTCON.T0IE = 1 ENABLE loop: ADCIN 0, PORTB GOTO loop END ON INTERRUPT SAVE SYSTEM T = T + 1 INTCON.T0IF = 0 RESUME Đay là đạon chương trình ngắt do bộ dịnh thời Timer0, sau khi phục vụ ngắt nhớ xóa cờ ngắt |
19-06-2006, 01:32 PM | #14 |
Đệ tử 3 túi
Tham gia ngày: Jun 2006
Bài gửi: 50
: |
Giao tiếp qua cổng nối tiếp chuẩn RS232. Ở đay chia ra làm 2 lọai là giao tiếp bằng phần mềm và phần cứng. Phần cứng là sử dụng chân RxD và TxD làm nhận và chuyển, còn phần mềm là sử dụng bất cứ chân nào làm RxD và TxD cũng được.
Phần cứng gồm có các câu lệnh: HSEROPEN, HSERIN, HSEROUT, HSERGET Ví dụ: DIM I AS BYTE HSEROPEN 38400 WAITMS 1000 FOR I = 20 TO 0 STEP -1 HSEROUT "Number: ", #I, CrLf WAITMS 500 NEXT I DIM I AS BYTE HSEROPEN 19200 loop: HSERIN I HSEROUT "Number: ", #I, CrLf GOTO loop DIM I AS BYTE HSEROPEN 19200 loop: HSERGET I IF I > 0 THEN HSEROUT "Number: ", #I, CrLf WAITMS 50 ENDIF GOTO loop Phần mềm gồm các câu lệnh: SEROUT, SERIN. Ví dụ: DEFINE SEROUT_DELAYUS = 5000 SEROUT PORTC.6, 1200, "Hello world!", CrLf DIM I AS BYTE loop: SERIN PORTC.7, 9600, I SEROUT PORTC.6, 9600, "Number: ", #I, CrLf GOTO loop |
19-06-2006, 01:43 PM | #15 |
Đệ tử 3 túi
Tham gia ngày: Jun 2006
Bài gửi: 50
: |
Ví dụ chương trinh lấy mã Scancode của bàn phím sau đó gởi vào PC qua cổng nối tiếp.
Sơ dồ mạch: |
|
|
Similar Threads | ||||
Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
Giao tiếp RS232 trên PC bằng Visual Basic. | ngohaibac | Giao tiếp cổng COM và LPT | 129 | 31-10-2013 01:39 PM |
Mikro basic | minhtienbk | Chương trình dịch & các công cụ mô phỏng | 1 | 11-11-2009 08:25 PM |
Ngôn ngữ Basic cho PIC | thaychua | Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) | 10 | 10-10-2007 08:49 PM |
Lập trình cho PIC bằng BASIC | phamgiaquang | Tổ dịch thuật | 11 | 10-10-2007 07:51 PM |
Gặp vấn đề về Mikro Basic | TTL | Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) | 5 | 09-08-2006 07:07 PM |