Re: 簡單的開關問題
|
||||
---|---|---|---|---|
中級會員
|
我的開關只是很間單的彈跳開關
用來控制LED 那請問一下 PORTA,4 與 5 有什麼不同 那在程式裡要如何定義呢 謝謝
發表於: 2005/11/11 12:53
|
|||
|
Re: 簡單的開關問題
|
||||
---|---|---|---|---|
中級會員
|
謝謝
我的PORTA第四隻已經接一個開關 我只是想在第五隻腳接再接一開關 我照著第四隻的接法 但是並不會動作 我在想到底是什麼問題
發表於: 2005/11/11 11:45
|
|||
|
簡單的開關問題
|
||||
---|---|---|---|---|
中級會員
|
大家好 我想請問一個簡單的開關問題
我想在PORTA多加上一個開關 我知道要串聯一個電阻與電容 但是我在程式的部分 不知道要如何定義 我使用PIC 16F873A 燒錄器為ICD 2 THX
發表於: 2005/11/11 9:24
|
|||
|
Re: 請問震盪器...
|
||||
---|---|---|---|---|
中級會員
|
不好意思
那我再請問一個問題 那我在燒錄時 oscillator模式要選擇RC的嗎? 因為我在DEMOBOARD測試時是選擇HS的模式 謝謝
發表於: 2005/10/31 20:57
|
|||
|
請問震盪器...
|
||||
---|---|---|---|---|
中級會員
|
大家好
我想請問一下 我使用16F873A 我只想單純控制LED 我的頻率想設為4MHz 那我是不是只要在OSC1 與OSC2 接上4MHz的震盪器與電容就好 其他不用考慮呢 謝謝各位
發表於: 2005/10/31 17:59
|
|||
|
請教中斷問題.....
|
||||
---|---|---|---|---|
中級會員
|
大家好 這是我寫的一個中斷程式 問題出在我使用單步執行
程式並不會跑到中斷向量的位址 請各位幫幫忙 我在想是不是我的中斷旗標沒設定好 以下是我PIC 與TIMER1得初始值設定 當打開 bsf T1CON,TMR1ON 程式不是應該會跑到0x004的位址 但是我的程式只會回到當初呼叫Timer1的位址 請各位幫幫忙 謝謝 initial banksel TRISB clrf TRISB ;定義PORTB為輸出阜 clrf TMR1H ;將Timer1內容清為零 clrf TMR1L clrf INTCON ;將INTCON內容清為零 bcf INTCON,PEIE ;將周邊功能的中斷致能 bcf INTCON,GIE banksel TMR1L clrf TMR1L movlw 0x3C movwf TMR1H movlw 0xB0 movwf TMR1L return ;------------------------------------------------------------------------------------------------- Timer1 banksel T1CON clrf T1CON ;設定Timer1時脈為Fosc/4 bsf INTCON,GIE bsf INTCON,PEIE banksel PIR1 ;選擇PIR1放置的Bank bcf PIR1,TMR1IF;將Timer1的致能旗標清除 banksel PIE1 clrf PIE1 ;將PIE1內容清為零 bsf PIE1,TMR1IE ;將Timer1溢位中斷致能 movlw Numcount1s movwf Reg_count_1s movlw Num1mCount movwf Reg_count_1m clrf TMR1L;把Timer1L清為零,防止進位 movlw 0x3C movwf TMR1H movlw 0xB0 movwf TMR1L bsf T1CON,TMR1ON return
發表於: 2005/9/26 17:56
|
|||
|
請教各位...
|
||||
---|---|---|---|---|
中級會員
|
大家好 這是一個簡單的程式 我想要利用按鍵的按下
LED便會往左移一位 每按一下 往左移一位 但是我的程式不會RUN 請各位高手指點 感激不盡 我使用PIC 16F873A ICD 2 Demoboard PICDEM 2 PLUS list p=16F873a #include <p16f873a.inc> ; Include file locate at defult directory ; #define Shift_value b'0001' shift_value equ 0x20 ;******************************************** ;********************************************* org 0x00 nop initial: banksel ADCON1 ;定義ADCCON1,將PORTA第四個bit設為數位模式 movlw b'11001110' movwf ADCON1 banksel CMCON ;定義CMCON將比較器功能關閉 movlw b'00000111' movwf CMCON banksel TRISB ;定義TRISB設定PORTB為輸出模式 clrf TRISB banksel PORTB clrf PORTB ;*********************************************** Main ;*********************************************** start: ;movlw b'00000000' ;LED初始狀態 ;movwf PORTB movlw Shift_value movwf PORTB switch: btfsc PORTA,4 ;判斷RA4是否按下 goto switch ;沒有-->switch繼續偵測;有-->執行下一行 goto original ;-----------------------LED狀態--------------------------------- original: rlf PORTB goto switch ;----------------------------------------------------------------------- end
發表於: 2005/8/23 16:09
|
|||
|
請問一下...LCD的問題
|
||||
---|---|---|---|---|
中級會員
|
大家好 請問一下
PICDEM_2_PLUS Demoboard 的 LCD需不需要驅動程式 我使用PIC 16F873A 我參照光碟理的範例 但是還是出不來 可否指點一下 謝謝 以下是我的程式碼 list p=16F873a #include P16F873a.inc #define LCD_D4 PORTB, 0 ; LCD data bits #define LCD_D5 PORTB, 1 #define LCD_D6 PORTB, 2 #define LCD_D7 PORTB, 3 #define LCD_D4_DIR TRISB, 0 ; LCD data bits #define LCD_D5_DIR TRISB, 1 #define LCD_D6_DIR TRISB, 2 #define LCD_D7_DIR TRISB, 3 #define LCD_E PORTA, 1 ; LCD E clock #define LCD_RW PORTA, 2 ; LCD read/write line #define LCD_RS PORTA, 3 ; LCD register select line #define LCD_E_DIR TRISA, 1 #define LCD_RW_DIR TRISA, 2 #define LCD_RS_DIR TRISA, 3 #define LCD_INS 0 #define LCD_DATA 1 D_LCD_DATA UDATA 0x10 COUNTER res 1 delay res 1 temp_wr res 1 temp_rd res 1 GLOBAL temp_wr PROG1 CODE ;*************************************************************************** LCDLine_1 banksel temp_wr movlw 0x80 movwf temp_wr call i_write return GLOBAL LCDLine_1 LCDLine_2 banksel temp_wr movlw 0xC0 movwf temp_wr call i_write return GLOBAL LCDLine_2 d_write ;write data call LCDBusy bsf STATUS, C call LCDWrite banksel TXREG ;move data into TXREG movwf TXREG banksel TXSTA btfss TXSTA,TRMT ;wait for data TX goto $-1 banksel PORTA return GLOBAL d_write i_write ;write instruction call LCDBusy bcf STATUS, C call LCDWrite return GLOBAL i_write rlcd macro MYREGISTER IF MYREGISTER == 1 bsf STATUS, C call LCDRead ELSE bcf STATUS, C call LCDRead ENDIF endm ;**************************************************************************** ; ******************************************************************* LCDInit clrf PORTA banksel TRISA ;configure control lines bcf LCD_E_DIR bcf LCD_RW_DIR bcf LCD_RS_DIR movlw b'00001110' banksel ADCON1 movwf ADCON1 movlw 0xff ; Wait ~15ms @ 20 MHz banksel COUNTER movwf COUNTER movlw 0xFF banksel delay movwf delay call DelayXCycles decfsz COUNTER, F goto $-3 movlw b'00110000' ;#1 Send control sequence movwf temp_wr bcf STATUS,C call LCDWriteNibble movlw 0xff ;Wait ~4ms @ 20 MHz movwf COUNTER movlw 0xFF movwf delay call DelayXCycles decfsz COUNTER, F goto $-3 movlw b'00110000' ;#2 Send control sequence movwf temp_wr bcf STATUS,C call LCDWriteNibble movlw 0xFF ;Wait ~100us @ 20 MHz movwf delay call DelayXCycles movlw b'0011000' ;#3 Send control sequence movwf temp_wr bcf STATUS,C call LCDWriteNibble ;test delay movlw 0xFF ;Wait ~100us @ 20 MHz movwf delay call DelayXCycles movlw b'00100000' ;#4 set 4-bit movwf temp_wr bcf STATUS,C call LCDWriteNibble call LCDBusy ;Busy? movlw b'00101000' ;#5 Function set movwf temp_wr call i_write movlw b'00001101' ;#6 Display = ON movwf temp_wr call i_write movlw b'00000001' ;#7 Display Clear movwf temp_wr call i_write movlw b'00000110' ;#8 Entry Mode movwf temp_wr call i_write movlw b'10000000' ;DDRAM addresss 0000 movwf temp_wr call i_write movlw b'00000010' ;return home movwf temp_wr call i_write return GLOBAL LCDInit ; ******************************************************************* ;**************************************************************************** ; _ ______________________________ ; RS _>--<______________________________ ; _____ ; RW \_____________________________ ; __________________ ; E ____________/ \___ ; _____________ ______ ; DB _____________>--------------<______ ; LCDWriteNibble btfss STATUS, C ; Set the register select bcf LCD_RS btfsc STATUS, C bsf LCD_RS bcf LCD_RW ; Set write mode banksel TRISB bcf LCD_D4_DIR ; Set data bits to outputs bcf LCD_D5_DIR bcf LCD_D6_DIR bcf LCD_D7_DIR NOP ; Small delay NOP banksel PORTA bsf LCD_E ; Setup to clock data btfss temp_wr, 7 ; Set high nibble bcf LCD_D7 btfsc temp_wr, 7 bsf LCD_D7 btfss temp_wr, 6 bcf LCD_D6 btfsc temp_wr, 6 bsf LCD_D6 btfss temp_wr, 5 bcf LCD_D5 btfsc temp_wr, 5 bsf LCD_D5 btfss temp_wr, 4 bcf LCD_D4 btfsc temp_wr, 4 bsf LCD_D4 NOP NOP bcf LCD_E ; Send the data return ; ******************************************************************* ; ******************************************************************* LCDWrite call LCDBusy call LCDWriteNibble BANKSEL temp_wr swapf temp_wr, f call LCDWriteNibble banksel temp_wr swapf temp_wr,f return GLOBAL LCDWrite ; ******************************************************************* ; ******************************************************************* ; _____ _____________________________________________________ ; RS _____>--<_____________________________________________________ ; ____________________________________________________ ; RW _________/ ; ____________________ ____________________ ; E ____________/ \____/ \__ ; _________________ __________ ___ ; DB _________________>--------------<__________>--------------<___ ; LCDRead banksel TRISB bsf LCD_D4_DIR ; Set data bits to inputs bsf LCD_D5_DIR bsf LCD_D6_DIR bsf LCD_D7_DIR BANKSEL PORTA btfss STATUS, C ; Set the register select bcf LCD_RS btfsc STATUS, C bsf LCD_RS bsf LCD_RW ;Read = 1 NOP NOP bsf LCD_E ; Setup to clock data NOP NOP NOP NOP btfss LCD_D7 ; Get high nibble bcf temp_rd, 7 btfsc LCD_D7 bsf temp_rd, 7 btfss LCD_D6 bcf temp_rd, 6 btfsc LCD_D6 bsf temp_rd, 6 btfss LCD_D5 bcf temp_rd, 5 btfsc LCD_D5 bsf temp_rd, 5 btfss LCD_D4 bcf temp_rd, 4 btfsc LCD_D4 bsf temp_rd, 4 bcf LCD_E ; Finished reading the data NOP NOP NOP NOP NOP NOP NOP NOP bsf LCD_E ; Setup to clock data NOP NOP btfss LCD_D7 ; Get low nibble bcf temp_rd, 3 btfsc LCD_D7 bsf temp_rd, 3 btfss LCD_D6
發表於: 2005/7/26 15:00
|
|||
|
程式除錯
|
||||
---|---|---|---|---|
中級會員
|
大家好 這是我用中斷寫的蜂鳴器程式 我希望響聲一秒後停止
但是我試過了 蜂鳴器還是持續叫著 請各位高手 給予校正 謝謝 以下是我的程式碼 list p=16F873a #include <p16f873a.inc> ; Include file locate at defult directory w_temp equ 0x20 ;定義暫存器位址w_temp,STATUS_temp, STATUS_temp equ 0x21 scaler equ 0x22 ;定義暫存器scaler,blankcnt位址 blankcnt equ 0x23 maxcount equ .10 ;定義maxcount為數值50 SOUNDDELAY1 equ 0x33 ;******************************************** ;********************************************* org 0x00 ;初始位置為0x00 goto Main nop ;利用ICD偵錯時,程式第一個位址需填入nop org 0x04 ;中斷位置 goto IntServ IntServ movwf w_temp ;將w暫存器內容儲存 swapf STATUS_temp,w ;將STATUS暫存器高低byte內容交換 movwf STATUS_temp ;交換後,存至STATUS_temp中 btfsc PIR1,TMR1IF ;判斷Timer1是否中斷 call Timer1 ;當Timer1有溢位中斷產生,呼叫中斷服務程式 swapf STATUS_temp,w ;將中斷前STATUS內容重新載入 movwf STATUS swapf w_temp,f ;將中斷前w內容重新載入 swapf w_temp,w Timer1 banksel PIR1 ;選擇PIR1放置的Bank bcf PIR1,TMR1IF ;將Timer1的致能旗標清除 clrf TMR1L ;把Timer1L清為零,防止進位 movlw 0xf8 ; movwf TMR1H ;Timer1H載入f8h movlw 0x2f ;Timer1L載入2fh movwf TMR1L ;所以Timer1會從f82fh計數到溢位中斷產生,剛好為2000(2ms) banksel maxcount movlw maxcount movwf blankcnt return banksel PORTC ;定義PORTC,清除PORTC CLRF PORTC BSF STATUS,RP0 ; MOVLW b'00000000' ;定義TRISC為輸出模式 MOVWF TRISC BCF STATUS,RP0 SOUND MOVLW 222 ;1/222,450HZ BSF PORTC,2 ;將蜂鳴器打開 CALL SOUNDDELAY0 ;呼叫延遲 BCF PORTC,2 ;關閉延遲 MOVLW 222 ;反覆鳴叫 CALL SOUNDDELAY0 GOTO SOUND ;---------------------Main------------------------------------------------------------- Main call initial bcf PORTC,2 ;---------------------sounddelay--------------------------------------------------- SOUNDDELAY0 MOVWF SOUNDDELAY1 ;將222放入暫存器 SOUNDDELAYUS_1 ;每一個指令為1us,所以延遲為222*5us+1=1111us,為900Hz NOP NOP DECFSZ SOUNDDELAY1 GOTO SOUNDDELAYUS_1 retfie ;------------------------------------------------------------------------------------- initial banksel maxcount movlw maxcount movwf blankcnt ;將常數值maxcount載入blankcnt暫存器 movlw b'00000000' movwf PORTC ;將PORTB的LED清除 ;movlw 0x04 ;初始值4,scaler ;movwf scaler banksel TRISC clrf TRISC ;定義PORTB為輸出阜 banksel T1CON clrf T1CON ;設定Timer1時脈為Fosc/4 clrf TMR1H ;將Timer1內容清為零 clrf TMR1L clrf INTCON ;將INTCON內容清為零 bsf INTCON,PEIE ;將周邊功能的中斷致能 banksel PIE1 clrf PIE1 ;將PIE1內容清為零 bsf PIE1,TMR1IE ;將Timer1溢位中斷致能 banksel PIR1 clrf PIR1 banksel TMR1L clrf TMR1L movlw 0xf8 movwf TMR1H movlw 0x2f movwf TMR1L bsf T1CON,TMR1ON ;讓Timer1開始計數 banksel INTCON bsf INTCON,GIE ;將中斷總開關打開,使中斷可以產生 return ;----------------Blink-------------------------------------------------------------------------- ;Blink ; decfsz blankcnt,f ;blankcnt減1 ; goto blinkend ;若blankcnt不為零,跳離Blink副程式 ; bcf PORTC,2 ;blinkend ; return ;------------------------------------------------------- end
發表於: 2005/7/25 13:51
|
|||
|