takt equ p3.2 richtung equ p1.7 graycode EQU 20h BITS equ 21h Counter equ 30h Tabelle: DB 0, 1, 0FFH,0,0FFH,0,0,1,1,0,0,0FFH,0,0FFH,1,0 ORG 0 ;************************************************************************** ;* * ;* ****** Demoprogramm LCD ****** * ;* fuer Platine 89C51CC03 * ;* H.G.Stoehr, 2007 * ;* * ;************************************************************************** ; Der Wertebereich des ADC ist 10 Bit: ; 0 = 0x0000 = 0 V ; 1023 = 0x03FF = +2.5 V ; ************** 89C51CC03 ************************ ;Vorgesehene Peripherie: ;CAN-Schnittstelle (MCP2551SN): ; P4.0 TxDC ; P4.1 RxDC ;RS232: ; P3.0 RxD ; P3.1 TxD ;RS485 (SP481CN): ; P3.0 alternativ ; P3.1 alternativ ; P3.2 /INT0 (verbunden über Inverter mit R von RS485) ; P1.7 (über Inverter an DE von RS485) ;I2C: Echtzeituhr PCF8583T/PCF8593T, Display, LM76 ; P1.6 I2C - SDA ; P1.5 I2C - SCL ;Port - Verwendung: ;Port0: Data - Bus ;Port1: P1.0 AnalogIN0, T2 External clock input for Timer/counter2 ; P1.1 AnalogIN1, T2EX Trigger input for Timer/counter2. ; P1.2 AnalogIN2, ECI - PCA external clock input. ; P1.3 AnalogIN3, CEX0 - PCA module 0 Entry of input/PWM output. ; P1.4 AnalogIN4, CEX1 - PCA module 1 Entry of input/PWM output. ; P1.5 verwendet als I2C - SCL ; P1.6 verwendet als I2C - SDA ; P1.7 AnalogIN7, CEX4 - PCA module 4 Entry of input/PWM output oder DataEnable von RS485 (mit PhyNet) ;Port2: P2.0 SWITCH 1 ; P2.1 SWITCH 2 ; P2.2 SWITCH 3 ; P2.3 SWITCH 4 ; P2.4 LED 1 ; P2.5 LED 2 ; P2.6 LED 3 ; P2.7 LED 4 ;Port3: P3.0 RxD alternativ von RS232 oder RS485, gewählt mit JP1 ; P3.1 TxD ; P3.2 External interrupt 0 input/timer 0 gate control input oder verwendet für RS485 (mit PhyNet), aktiviert mit SJ1 ; P3.3 External interrupt 1 input/timer 1 gate control input ; P3.4 Timer 0 counter input ; P3.5 Timer 1 counter input ; P3.6 WR/ intern verwendet ; P3.7 RD/ intern verwendet ;I2C - Adressen: ;Echtzeituhr PCF8583T: 0xA0 ; PCF8593T: 0xA2 ;Temp.Sensor LM76: 0x90 ;Display BTHQ 21605AV-02 I2C: 0x76 ;Infrarot Sene/Empfänger: ;SHT506 (IR-Empfänger) an P3.3 (Ext. INT 1) ;IR-LED (Kathode) an P1.0, Anode über 220 Ohm an +5V ;PS2-Tastatur: ;CLK an P3.2 (Ext. INT 0) ;DATA an P1.7 ;Interrupt / Timer -Verwendung: ;Ext. INT 0 PS2-Tastatur ;Ext. INT 1 IR-Empfang ;IT_ADC ADC counter EQU 30h ORG 0 AJMP BEGIN ORG 3H RETI ; AJMP EXTINT0 ;SPRUNG ZUR EXTERNEN INT0/ ROUTINE ORG 0BH RETI ; AJMP TIMER0 ;SPRUNG ZUR TIMER 0 INTERRUPT ROUTINE ORG 13H RETI ; AJMP EXTINT1 ;SPRUNG ZUR EXT. INTERRUPT ROUTINE 1 ORG 23H RETI ; AJMP SERINT ;SPRUNG ZUR SERIAL PORT INTERRUPT ROUTINE ORG 2BH RETI ; AJMP TIMER2 ;SPRUNG ZUR TIMER 2 INTERRUPT ROUTINE ORG 30H DB 'H.G.Stoehr 9.Jan.2007 ' ZEILE1: DB ' 8051 ',0 ZEILE2: DB ' Test ',0 BEGIN: MOV SP,#0DFh ;STACKPOINTER (STACK VON 0E0H - 0FFH) MOV 08Eh,#016h ;AUXR = 0x16, ERAM ausschalten MOV SCON,#050H ;SERIAL PORT CONTROL REGISTER: ;SM0=LOW,SM1=HIGH ---> MODE 1, ;SM2=LOW, REN=HIGH MOV TMOD,#021H ;TIMER0: 'TIMER'-MODUS 1, 16-Bit Timer, ;TIMER1: 'TIMER'-MODUS 2, AUTO-RELOAD, fuer Baud-Rate MOV TH1,#0FDh ;19200 BAUD bei 22.1184 MHz ; MOV T2CON,#0 ;CP/RL2 = 0, automatic reload ;C/T2 = 0, timer function ;TR2 = 0, stop timer ;EXEN2 = 0, disable T2EX ;TCLK = 0, disable ;RCLK = 0, disable ;EXF2 = 0 ;TF2 = 0 ; MOV RCAP2L,#LOW(65535-1638) ;889 usec bei 22.1184MHz ; MOV RCAP2H,#HIGH(65535-1638) ; SETB TCON.0 ;IT0 = HIGH, Flankentriggerung von INT0 ; CLR TCON.2 ;IT1 = LOW, aktiv LOW Triggerung von INT1 ; SETB TCON.2 ;IT1 = HIGH, Flankenriggerung von INT1 ; SETB TI ;SCON.1 = TI setzen damit ser.Ausgabe nicht "haengen bleibt" ; MOV IP,#01h ;ext INT0 hat hohe Prioritaet ACALL DELAY ;Verzoegerung, damit DISPLAY auch Reset beenden kann ACALL DELAY ACALL DELAY ACALL RESDISP8 ;Initialisierung vom Display MOV R0,#0 ;A0 = LOW (COMMAND-REG. vom Display) MOV A,#06H ;INCREMENT CURSOR, WITHOUT SHIFT MOVX @R0,A LCALL DELAY1 MOV A,#0CH ;SET DISPLAY ON, SET CURSOR OFF, NO CURSOR BLINK MOVX @R0,A LCALL DELAY1 loop: MOV R0,#0 ;A0 = LOW (COMMAND-REG. vom Display) MOV A,#080h ;Position: 1.Stelle, 1.Zeile MOVX @R0,A LCALL DELAY1 ;--------------------------------------------------------------------------------------------------------- ;GRAYCOD ROUTINE Marke1: JNB Takt,weiter ORL graycode,#010H weiter: JNB richtung,weiter1 ORL graycode,#020H weiter1 RR graycode RR graycode ANL graycode, #0Fh MOV A, graycode MOV DTPR, Tabelle MOVC A,@DTPR+A MOV R0, A ;---------------------------------------------------------------------------------------------------------- ;HEX 2 DEC ROUTINE X2D: CALL CLEARYZ ;;Clear All YY and ZZ bytes MOV YY0,#1 ;;DECIMAL ADDER = 1 ; ;; MOV R0,#XX7 ;;LOCATE HOW MANY BYTES WITH DATA MOV B,#8 ;;POSSIBLE 8 BYTES W/DATA ON XX BITS1: MOV A,@R0 ;;GET BYTE FROM INPUT REGISTER CJNE A,#0,BITS2 ;;JUMP IF FOUND THE FIRST NON ZERO DEC R0 ;;GO TO LOWER BYTE DJNZ B,BITS1 ;;ONE BYTE DONE, GO AGAIN ;; BITS2: MOV A,#8 ;;8 BITS PER BYTE, B CONTAINS BYTE # MUL AB ;;A = QUANTITY OF BITS W/DATA MOV BITS,A ;;SAVE CJNE A,#0,X2DMAIN2 ;;B = NUMBER OF DIGITS W/DATA RET ;;RETURN IF ONLY ZEROS AT XX ;; X2DMAIN1: CALL X2DSHIFTD ;;SHIFT DECIMAL RESULT X2DMAIN2: CALL X2DSHIFTH ;;SHIFT HEXA JNC X2DMAIN3 ;;IF NOT CARRY, JUST SKIP IT CALL X2DADD ;;ADD NEW RESULT X2DMAIN3: DJNZ BITS,X2DMAIN1 ;;ONE BIT DONE, GO AGAIN RET ;;GENERAL EXIT FROM THIS ROUTINE ;;ZZ0 - ZZ7 CONTAINS DECIMAL RESULT ;; X2DSHIFTD: MOV R0,#YY0 ;;YY * 2 (DECIMAL) MOV B,#8 ;;NUMBER OF BYTES CLR C ;;NEED CARRY ZERO X2DSHIFTD1: MOV A,@R0 ;;IGNORE LAST CARRY ADDC A,@R0 ;;ADD BYTE TO ITSELF DA A ;;DECIMAL ADJUST MOV @R0,A ;;PUT IT BACK INC R0 ;;GO TO UPPER BYTE DJNZ B,X2DSHIFTD1 ;;DO IT 8 BYTES RET ;;RETURN ;; X2DSHIFTH: MOV R0,#XX7 ;;SHIFT XX7 --> XX0 RIGHT 1 BIT MOV B,#8 ;;NUMBER OF BYTES SHIFTR0B: CLR C ;;NEED CARRY ZERO SHIFTR0B1: MOV A,@R0 ;;GET BYTE RRC A ;;ROTATE RIGHT THROUGH CARRY BIT MOV @R0,A ;;SAVE IT BACK DEC R0 ;;GO TO LOWER BYTE DJNZ B,SHIFTR0B1 ;;DO IT AGAIN "B" TIMES RET ;;RETURN ;; X2DADD: MOV R0,#ZZ0 ;; GET RESULT ZZ 8 BYTES REGISTER MOV B,#8 ;; 8 BYTES MOV R1,#YY0 ;; GET YY OPERATOR CLR C ;; NEED CARRY OFF X2DADD1: MOV A,@R0 ;; ZZ = ZZ + YY (8BYTES) W/DAA ADDC A,@R1 ;; ADD BYTE TO BYTE 8 TIMES DA A ;; DECIMAL ADJUST MOV @R0,A ;; PUT IT BACK INC R0 ;; BUMP POINTER NEXT BYTE INC R1 ;; BUMP POINTER NEXT BYTE DJNZ B,X2DADD1 ;; ONE BYTE DONE, GO AGAIN MOV A,ZZ8 ;; LAST CARRY TO 9TH BYTE OF ZZ ADDC A,#0 ;; JUST CARRY TO ZZ8 MOV ZZ8,A ;; ;------------------------------------------------------------------------------------------------ ;WERT AUF LCD AUSGEBEN MOV A,BITS MOV R0,#1 ;A0 = high (data-REG. vom Display) MOVX @R0,A LCALL DELAY1 ;MOV A,R5 ;MOVX @R0,A LCALL DELAY1 ;MOV A,R4 ;MOVX @R0,A ;LCALL DELAY1 RESDISP8: PUSH 0 ;R0 MOV R0,#0 ;A0 = LOW (COMMAND-REG. vom Display) MOV A,#38h ;RESET AUF 8-BIT DATENLAENGE, 2 LINES MOVX @R0,A ACALL DELAY MOV A,#38h ;RESET AUF 8-BIT DATENLAENGE, 2 LINES MOVX @R0,A ACALL DELAY MOV A,#06h MOVX @R0,A ACALL DELAY MOV A,#0Eh MOVX @R0,A ACALL DELAY MOV A,#01h ;Display loeschen MOVX @R0,A ACALL DELAY MOV A,#0ch ;SET DISPLAY ON, SET CURSOR OFF, NO CURSOR BLINK MOVX @R0,A ACALL DELAY MOV A,#80h ;Position: 1.Stelle, 1.Zeile MOVX @R0,A ACALL DELAY POP 0 ;R0 RET DELAY: ;"lange" Verzögerung PUSH DPL PUSH DPH PUSH ACC MOV DPTR,#0F000H ;VERZOEGERUNG DELAYX: INC DPTR MOV A,DPL ORL A,DPH JNZ DELAYX POP ACC POP DPH POP DPL RET DELAY1: ;"kurze" Verzögerung PUSH B MOV B,#020h DELAY1X:DJNZ B,DELAY1X POP B RET DISPLAY: ;Ausgabe eines fixen Textes (gespeichert im ROM) PUSH 0 ;R0 DISPLA2: MOV R0,#1 ;A0 = 1 (DATA-REG. vom Display) CLR A MOVC A,@A+DPTR JZ DISPLA1 INC DPTR MOVX @R0,A LCALL DELAY1 SJMP DISPLA2 DISPLA1: POP 0 ;R0 RET END