![]() |
|
Tài trợ cho PIC Vietnam |
MPASM Lập trình bằng hợp ngữ là một việc làm vô cùng vất vả, tuy nhiên, để hiểu và làm việc với vi điều khiển, hợp ngữ trở thành một công cụ khá đắc lực ... |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
![]() |
#1 |
Đệ tử 7 túi
Tham gia ngày: May 2005
Bài gửi: 258
: |
Làm cách nào để viết một bảng tra dài như trong 89
nhờ các bạn giúp đỡ để viết một bảng tra lớn hơn 256 byte .
|
![]() |
![]() |
![]() |
#2 |
Đệ tử 1 túi
Tham gia ngày: Aug 2007
Bài gửi: 11
: |
Đọc trong piclist.com ay
đây là 1 ví dụ trong đó Table movlw High(TStart) addwf OffsetH,W movwf PCLATH movlw Low(TStart) addwf OffsetL,W skpnc incf PCLATH,F movwf PCL ;computed goto with right PCLATH ; end of Table subroutine. ; ... ; org 0x???? TStart Retlw d'0' Retlw d'255' Retlw d'9' .... etc |
![]() |
![]() |
![]() |
#3 | |
Đệ tử 7 túi
Tham gia ngày: May 2005
Bài gửi: 258
: |
Trích:
|
|
![]() |
![]() |
![]() |
#4 |
Đệ tử 4 túi
Tham gia ngày: Aug 2006
Bài gửi: 81
: |
để có 1 bảng dài hơn 256 byte có thể chia bảng nhỏ bảng đó và đặt ở nhiều Page khác nhau (mình vẫn làm thế!).Và theo mình chỉ có cách này vi thanh ghi PCL chỉ 8 bit
|
![]() |
![]() |
![]() |
#5 |
PIC Bang chủ
|
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
![]() |
![]() |
![]() |
#6 |
Nhập môn đệ tử
Tham gia ngày: Mar 2008
Bài gửi: 6
: |
Code:
ORG 0x80 Table ADDWF PCL, F RETLW ‘A’ RETLW ‘B’ RETLW ‘C’ . . Code:
ORG 0x80 Table ADDWF PCL, F dt "ABC.." Code:
ORG 0x80 Table ADDWF PCL, F dt 'A','B','C',.. Code:
movlw high(Table) movwf TBLPTRH movlw low(Table) addlw offset movwf TBLPTRL tblrd* ; giá trị return từ vị trí "bảng+offset" sẽ chứa trong thanh ghi TABLAT sau lệnh này Code:
Table data "ABC.." Code:
Table data "A","B","C",.. thay đổi nội dung bởi: thaile, 11-08-2008 lúc 03:02 PM. |
![]() |
![]() |
![]() |
#7 |
Nhập môn đệ tử
Tham gia ngày: Feb 2007
Bài gửi: 1
: |
Bạn có thể sử dụng bộ nhớ chương trình (Flash memory) để lưu bảng, sau dùng tính năng đọc bộ nhớ chương trìng để tra bảng. Với phưong pháp này bạn có thể tạo bảng có độ dài tối đa = 2^14 words. Đoạn chương trình sau có thể giúp bạn hiểu rõ hơn
Code:
lcd_print: movlw HIGH(msg_table) movwf addrh movlw LOW(msg_table) addwf pointer,W ; point to message in the msg_table btfsc STATUS,C ; check for overflow incf addrh,f ; yes, increase hi address movwf addrl ; no, goto next step lcd_print_loop: call flash_read ; read from flash memory movf datah ; test for zero btfsc STATUS,Z movf datal ; test for zero btfsc STATUS,Z return bcf STATUS, C ; clear carry flag rlf datal,W ; shift MSB of low byte to C bcf datal,7 ; clear MSB bit rlf datah,f ; shift C to LSB position of hi byte movf datah,W ; put hi byte to LCD call lcd_put_char movf datal,W ; put low byte to LCD call lcd_put_char incf addrl ; increase address pointer btfsc STATUS,C ; check for overflow incf addrh,f goto lcd_print_loop return ;--------------------------------------------------------------- ;flash read flash_read: global flash_read movf addrl, w ;low address Bank2 movwf EEADR Bank0 movf addrh,w ;hi address Bank2 movwf EEADRH Bank3 bsf EECON1,EEPGD ;point to program memory (see 16F873A datasheet) bsf EECON1,RD ;start read operation nop ;required two nops nop Bank2 movf EEDATA,W ;datal = eedata Bank0 movwf datal ; Bank2 movf EEDATH,W ;datah = eedath Bank0 movwf datah ; return ;---------------------------------------------------------- ;program memory string table msg_table: global msg_table ;(pointer position,msg length) DA "HW ver 1.0",0 ;(0,6) DA "SW ver 1.2",0 ;(6,6) thay đổi nội dung bởi: risc, 14-10-2008 lúc 05:08 AM. |
![]() |
![]() |
![]() |
|
|