⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 d16550.c

📁 TQ公司的STK16x开发系统的源码
💻 C
字号:
/* DX16550.C */
              
/***************************************************************************
**Main module for STK16XU (TQM167UE/TQM167U) (16C55x, 57600 Baud, 8, 1, n) demo 
* ----------------------------------------------------------------------
*

*
* TQ-Systems GmbH
* ----------------                                                         
* Customer: TQ-Components
* Project : TQMX16xU
* Tools   : uVision 2.05
*
* Copyright (C) 1995 TQ-Systems
* -----------------------------
* Rev: Date:     Name:            Modification:
* ----+---------+----------------+------------------------------------------
* 100  27.04.01  K. Z鰌f        taken over from STK16X.506   
* 200  17.02.03  V. Jung        changes for xc16c porzessor
* 251  29.07.03  Volker Jung	  Anpassung an TQ_Select              
/*****************************************************************************/

/************************************************************************/

/****************************************************************************
*
*
*                            availability summary
*
* available for Starterkit: STK16XU
* conformed for Starterkit: STK16XU 
* available for Modul     : TQM167UL TQM167U  TQM167UE TQMX16xU
*                           
* conformed for Modul     : TQM167UL TQM167U  TQM167UE
*                           
*****************************************************************************/

/*--------------------------------------------------------------------------*
* Standard-Include-Files: 
*****************************************************************************/

#include <stdio.h>
#include <ctype.h>   /* Typecast functions        */
#include <string.h>  /* String functions          */
#include <setjmp.h>  /* Global jump functions     */

/*--------------------------------------------------------------------------*
* Hardware- and Compiler-spezifische Include-Files: 
*---------------------------------------------------------------------------*/

#include <absacc.h>  /* absolute accesss          */
#include <intrins.h> /* Intrinsic functions       */
#include <xc161.h>  /* Special function register */

/*--------------------------------------------------------------------------*
*product specific include-files: 
*---------------------------------------------------------------------------*/

#include "header.h"
#include "timer0.h"

#if (TQMMOD==TQM167UE)
#define X16550START SIO_A_BASEADDR /* Set  SIO_A to default SIO */
#else
//#define X16550START XREG_BASEADDR+0x0400 /* Set  SIO_A to default SIO */
#endif
#define X16550START 0x800800 /* Set  SIO_A to default SIO */
/* control character: */

#define pX16550 XARRAY (unsigned char,0x800800)


#define BK    0x03
#define BS    0x08
#define CR    0x0D
#define LF    0x0A
#define XON   0x11
#define XOFF  0x13


/* Masken Receiver Buffer Register  RBR */
#define RBR_ADDR   X16550START+0

/* Masken Transmitter Holding Register  IER */
#define THR_ADDR   X16550START+0

/* Masken Interrupt enable Register  IER */
#define IER_ADDR   X16550START+1
#define ERBI_MASK  0x01
#define ETBEI_MASK 0x02
#define ELSI_MASK  0x04
#define EDSSI_MASK 0x08

/* Masken f黵 Interrupt Ident. Register */
#define IIR_ADDR   X16550START+2

/* Masken f黵 FIFO Control Register */
#define FCR_ADDR   X16550START+2

/* Masken f黵 Line Control Register */
#define LCR_ADDR   X16550START+3
#define WLS0_MASK  0x01
#define WLS1_MASK  0x02
#define STB_MASK   0x04
#define PEN_MASK   0x08
#define EPS_MASK   0x10
#define STPY_MASK  0x20
#define BRC_MASK   0x40
#define DLAB_MASK  0x80

/* Masken f黵 Modem Control Register */
#define MCR_ADDR   X16550START+4
#define DTR_MASK   0x01
#define RTS_MASK   0x02
#define OUT1_MASK  0x04
#define OUT2_MASK  0x08
#define LOOP_MASK  0x10

/* Masken f黵 Line Status Register */
#define LSR_ADDR   X16550START+5
#define DR_MASK    0x01
#define OE_MASK    0x02
#define PE_MASK    0x04
#define FE_MASK    0x08
#define BI_MASK    0x10
#define THRE_MASK  0x20
#define TEMT_MASK  0x40
#define VCVR_MASK  0x80


/* Masken f黵 Modem Status Register */
#define MSR_ADDR   X16550START+6
#define DCTS_MASK  0x01
#define DDSR_MASK  0x02
#define TERI_MASK  0x04
#define DDCD_MASK  0x08
#define CTS_MASK   0x10
#define DSR_MASK   0x20
#define  RI_MASK   0x40
#define DCD_MASK   0x80

/* Masken f黵 Scratch Register */
#define SCR_ADDR   X16550START+7

/* Masken f黵 Divisor Latch LSB Register */
#define DLL_ADDR   X16550START+0

/* Masken f黵 Modem Status Register */
#define DLM_ADDR   X16550START+1


// Reloadwerte f黵 14.745 MHz
const UINT bg_xvalues[10] =
{
 3072,  /*    300 Baud */
 1536,  /*    600 Baud */
  768,  /*   1200 Baud */
  384,  /*   2400 Baud */
  192,  /*   4800 Baud */
   96,  /*   9600 Baud */
   48,  /*  19200 Baud */
   24,  /*  38400 Baud */
   16,  /*  57600 Baud */
    8   /* 115200 Baud */
};


/* baudrate definition */
#define BR9600  5
#define BR19200 6
#define BR38400 7
#define BR57600 8

/* appropriated Baudrate */
#define USED_BAUDRATE BR57600


/* to initialize Asynchrone serial Interface ASC0  */

void initasc(BYTE br_number)
{
  
  MVAR(BYTE, LCR_ADDR)=0x80; /* aktivate Divisor-Latch      */
  MVAR(UINT, DLL_ADDR)=bg_xvalues[br_number]; /* set Divisor Latch LOW+HIGH  */
  /* Set parameter from X16550-Routins:                 */
  MVAR(BYTE, LCR_ADDR)=WLS0_MASK+WLS1_MASK ; /* 8 Bit, no Parity   */
}

/* Test to receive characters : */
/* return: Integer = >0, if receive a character  */

int keypressed()
{
 BYTE  flag; 
 char  ch;
 /* read data: */
 flag=MVAR(BYTE, LSR_ADDR)&DR_MASK;   /* 16550-receive-flag  */
 if (flag) ch  =MVAR(BYTE, RBR_ADDR);  /* received character */
 /* LF, Xon und Xoff ignorieren: */
 if (flag && (ch==LF || ch==XON || ch==XOFF)) flag=0;
 return flag;
}

/* read character : overwrite Standartfunction */
/* return: char = from ASC0 received character   */

char _getkey()
{
  char  ch;
  while(!keypressed());               /* wait of character         */
  ch=MVAR(BYTE, RBR_ADDR);            /* read received character   */
  return ch;
}

/* to write out character : overwrite Standardfunction, for example printf verw. */
/* committal: char = character to send                                  */
/* return: char = transmited character                                     */

char putchar (char ch)
{
  if (ch=='\n') putchar(13);                 /* converting LF -> CR+LF              */
  while (!(MVAR(BYTE, LSR_ADDR)&TEMT_MASK)); /* wait until last character is transmited */
  return (MVAR(BYTE, THR_ADDR)=ch);         /* write character to transmit buffer    */
}

/* receive a character:                                             */
/* return: char = received character                                   */
/*         released character: "0".."9" , "A".."Z" , " " , "," , "="   */
/*         converting  "a".."z" into "A".."Z"                          */

char sio_getchar()
{
  /* Local variables: */
  char  c;

  while (1)
  {
    c=_getkey();

    /* Testing the received character: */
    switch (c)
    {
      case BS:
      case BK:
        return c;

      case CR:
        putchar(c);
        return c;

      /* Filtering valid characters: */
      default:
        if (isalnum(c)||(c==' ')||(c==',')||(c=='='))
        {
          c=toupper(c);
          putchar(c);
          return c;
        }
    }
  }
  return 0;
}


/* wait action: time is in ms, max. 3.3 s */

// void delay(unsigned int time)
// {
//   CC1_T01CON_T0R=0;                        /* Timer 0 Stop                   */
//   CC1_T0IC_IR=0;                           /* deletes Interrupt-Request-Flag  */
//   CC1_T0=-((((long)time)*5000)/256);       /* Timer-Value in 51.2 us         */
//   CC1_T01CON=CC1_T01CON&0xFF00|(0x40+0x07);/* T0R=1, T0M=0, T0I=3            */
//   while(!CC1_T0IC_IR);                     /* wait of Timeout              */
// }

/* arithmetic technique prime number : */

void primzahlen()
{
  unsigned long  z, t, r;
  printf("\n\nPrimzahlen: Abbruch auf Tastendruck.");
  z=1; r=1;
  while(!keypressed()) /* truncation top press any Key */
  {
    while(r*r<z) r++;
    for(t=3; t<=r; t+=2) if(z%t==0) break;
    if(t>r) printf("\n%5li", z);
    z+=2;
  }
  _getkey(); /* read character */
}

/*  rolling direction: */

void lauflicht()
{
 
  printf("\n\nLauflicht auf Port 2: Abbruch auf Tastendruck.");
  
    DP2 = 0xFFFF; 
    P2  = 0x0100;           
 
  while(!keypressed()) /* truncation top press any Key */
  {
      timer_delay_10ms(40);
      P2=P2*2;
  	  
	  if((P2==0x8000))  
	  {
	    timer_delay_10ms(40);
	    P2=0x0100; 
	  }
  }
 /* set back Port P1H to input: */
 DP2 = 0;   /* set back P2 to input: */
}

/* mainfunktion: */

void main (void)
{
  char  ch;
  timer_init();  


  

  
  initasc(BR57600);         /* initialize input- und output  */
 
  
  while(1)
  {
   
      printf(
     "\n\nDemonstrationsprogramm fuer TQMX167U / TQMX161U  SIODEMO.C"\
      "\n\n<P> :Primzahlenberechnung"\
      "\n<L> :Lauflicht an Port 2"\
      "\n<R> :Reset (TRAP 0)"\
      "\n");

      
    do
    {
      
      printf("\n>");
      
	  ch=toupper(_getkey());
      
	  putchar(ch);
      
      switch(ch)
      {
        case 'P' :primzahlen(); break;
        case 'L' :lauflicht(); break;
        case 'R' :_trap_(0);
      }
    }
    while(ch>32);
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -