![]() |
||
|
Advance Member
![]() ![]() 加入日期: Aug 2001 您的住址: 台北縣
文章: 405
|
PIC 16f877 如何才能讓"蜂鳴器"叫~
PIC 16f877 驅動碼達,與按鍵!如何才能讓"蜂鳴器"叫~
1:原型是按4x4按鍵三位數,讓馬達轉所輸入的數字,超過255,轉255(最高速) 2:現在想加一個功能就是,當輸入的數字超過180以上,蜂鳴器叫40ms,低於180不叫! 3:蜂鳴器接在RA5/AN4 主程式 ; ; 8 BITS A/D(VR) + LCD + PWM ; LIST P=16F877, R=DEC #INCLUDE P16F877.INC CBLOCK 0X20 ENDC ; ; DEFINE RAM ; CBLOCK BCDBFH, BCDBFL,KYBUF SPEED,TEMP,KEY_C ENDC ; alarm_seg equ TRISA alarm_port equ PORTA alarm_bit equ 5 ; ORG 0 NOP GOTO MAIN ; ; ;---------------------------------------------------------------; ; #INCLUDE <LCD.INC> ; ; ; Defines for I/O ports that provide LCD data & control ; ; LCD_DATA equ PORTB ; LCD_CNTL equ PORTB ; ; RS equ 5 ; RS=PORTB,5 ; E equ 4 ; ; ;===============================================================; ; #INCLUDE <HX2BCD.INC> #include <DLY2_5mS.INC> ; ;................................. ;---------------------------------------------------------------; ; #INCLUDE <key4X4.asm> ; PORT4X4 EQU PORTD ; keyboard is connected with portd ; TRIS4X4 EQU TRISD ; set direction of port ; ; ;---------------------------------------------------------------; ; MAIN: call InitLCD call clrLCD ; ;************************************************ ;* - Initialize the A/D converter * ;* - Left justified * ;* - 1 analog channels, 0 references * ;* - Fosc/8 clock source * ;* - Channel 0 * ;* - Enable A/D * ;************************************************ ; ; BANKSEL ADCON1 ; ADCON1 is in bank1 ; MOVLW B'10000010' ; select left(0) justified (d7) ; 1 ch(AN0)/0 refs ; MOVWF ADCON1 ; BANKSEL alarm_seg BCF alarm_seg,alarm_bit ;set alarm_bit be output ; BANKSEL ADCON0 ; MOVLW B'01000001' ; select Fosc/8(01), AN0(000) ; MOVWF ADCON0 ; a/d done(0), x(0), a/d ON(1) ; ;************************************************ ;* - Initialize the CCP1 Module * ;* - Set the period to FFh * ;* - Make RC2 an output * ;* - Configure CCP1 for PWM (xxxx11xx) * ;* - Initialize Timer2 * ;* - 1:1 Postscale (x0000xxx) * ;* - 1:4 Prescale (xxxxxx01) * ;* - Enable the timer (xxxxx1xx) * ;************************************************ BANKSEL PR2 MOVLW H'FF' MOVWF PR2 BCF TRISC,2 BANKSEL CCP1CON MOVLW B'00001111' MOVWF CCP1CON MOVLW B'00000101' MOVWF T2CON CLRF SPEED ;reset speed to 0 CALL DLY2_5mS ; wait for input charge MAIN1: ; BSF ADCON0,GO ; start a/d converting MAIN2: ; BTFSC ADCON0,GO ; a/d convertion finished? ; GOTO MAIN2 ; no ; call L2homeLCD MOVLW 3 CALL movcurLCD ; move cursor right 3 positions ; MOVF ADRESH,W ; read a/d result ( high byte ) MOVF SPEED,W CALL HX2BCD ; convert HEX to BCD ; results in BCDBFH/BCDBFL MOVF BCDBFH,W ; output results to LCD CALL putHexLCD ; MOVF BCDBFL,W CALL putHexLCD MOVF SPEED,W MOVWF CCPR1L ; Also in Duty cycle CLRF KEY_C CLRF TEMP wait_key: CALL KB4X4 ; read kyboard BTFSC KYBUF,4 ; Key detected? GOTO wait_key MOVLW 10 SUBWF KYBUF,W ;number key? BTFSS STATUS,C GOTO NUMBER_KEY ; GOTO wait_key NUMBER_KEY: MOVF KEY_C,W BTFSC STATUS,Z GOTO HUNDREDTH SUBLW 1 BTFSC STATUS,Z GOTO TENTH MOVF TEMP,W ADDWF KYBUF,W BTFSC STATUS,C GOTO OVER_FLOW MOVWF SPEED GOTO wait_ret OVER_FLOW: MOVLW 255 MOVWF SPEED wait_ret: CALL KB4X4 BTFSS KYBUF,4 ; KEY RELEASED? GOTO wait_ret ; w=zero means key still pressed GOTO MAIN2 HUNDREDTH: INCF KEY_C HUN_AGAIN: MOVF KYBUF,W BTFSC STATUS,Z GOTO wait_release ; SUBLW 2 ; BTFSC STATUS,C ; GOTO LESS_THAN_3 ; MOVLW 2 ; MOVWF KYBUF LESS_THAN_3: DECF KYBUF,F MOVLW 100 ADDWF TEMP,F BTFSS STATUS,C GOTO HUN_AGAIN MOVLW 255 MOVWF TEMP GOTO HUN_AGAIN TENTH: INCF KEY_C TEN_AGAIN: MOVF KYBUF,W BTFSC STATUS,Z GOTO wait_release DECF KYBUF,F MOVLW 10 ADDWF TEMP,F BTFSS STATUS,C GOTO TEN_AGAIN MOVLW 255 MOVWF TEMP GOTO TEN_AGAIN wait_release: CALL KB4X4 BTFSS KYBUF,4 ; KEY RELEASED? GOTO wait_release ; w=zero means key still pressed CALL DLY2_5mS ; wait for moment CALL DLY2_5mS ; wait for input charge GOTO wait_key ; ; ; END---------------------------------------------------------------------------------
__________________
![]() 我!!!拒收好人卡!!不要變成泡不到馬子的可憐虫!! 我的Blog好人幫本鋪 我的相簿!!好人幫!!來練身材!變成拒收好人卡的好人!!! 我被發好人卡!拒收好人卡的好人!!! |
|||||||
|
|