📄 d16550.c
字号:
/* DX16550.C */
/***************************************************************************
**Main module for STK16XU (TQM167UE/TQM167U) (16C55x, 57600 Baud, 8, 1, n) demo
* ----------------------------------------------------------------------
*
*
* TQ-Systems GmbH
* ----------------
* Customer: TQ-Components
* Project : STK16XSW
* Tools : uVision 2.05
*
* Copyright (C) 1995 TQ-Systems
* -----------------------------
* Rev: Date: Name: Modification:
* ----+---------+----------------+------------------------------------------
* 100 10.12.01 K. Z鰌f taken over from STK16XU.200
/*****************************************************************************/
/************************************************************************/
/****************************************************************************
*
*
* availability summary
*
* available for Starterkit: STK16XU
* conformed for Starterkit: STK16XU
* available for Modul : TQM165US
*
* conformed for Modul : TQM165US TQM161US
*
*****************************************************************************/
//#pragma MEDIUM
// Setting the Programm Area into the fast-RAM Area at 0x380000 - 0x3FFFFF
#pragma RENAMECLASS (FCODE=FCD_F)
/*--------------------------------------------------------------------------*
* 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 <reg167.h> /* Special function register */
/*--------------------------------------------------------------------------*
*product specific include-files:
*---------------------------------------------------------------------------*/
#include "header.h"
#include "timer.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
/* control character: */
#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)
{
T0R=0; /* Timer 0 Stop */
T0IR=0; /* deletes Interrupt-Request-Flag */
T0=-((((long)time)*5000)/256); /* Timer-Value in 51.2 us */
T01CON=T01CON&0xFF00|(0x40+0x07); /* T0R=1, T0M=0, T0I=3 */
while(!T0IR); /* 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()
{
unsigned int i;
printf("\n\nLauflicht auf Port 2: Abbruch auf Tastendruck.");
if (TQMMOD==TQM164)
{
MVAR(unsigned int, 0xF106) =0xffff; /* Port P1H auf Ausgang: */
P1H = 0x0001;
}
else
{
DP2 = 0xFFFF; /* set Port P1H to output : */
P2 = 0x0101;
}
/* Lauflicht: */
i=0;
while(!keypressed()) /* truncation top press any Key */
{
i+=4;
if(!i)
{
if (TQMMOD==TQM164)
{P1H<<=1; if((P1H&0x00FF)==0) P1H=0x0001; }
else
if (TQMMOD==TQM165)
{P2<<=1; if((P2&0xFF00)==0) P2=0x0101; }
else
{P2<<=1; if((P2&0x00FF)==0) P2=0x0101; }
}
}
/* set back Port P1H to input: */
if (TQMMOD==TQM164) MVAR(unsigned int, 0xF106) =0;
else DP2 = 0; /* set back P2 to input: */
}
/* mainfunktion: */
void main (void)
{
char ch;
initasc(BR57600); /* initialize input- und output */
while(1)
{
printf(
"\n\nDemonstrationsprogramm fuer TQM165US: SIODEMO.C"\
"\n\n<P> :Primzahlenberechnung"\
"\n<L> :Lauflicht an Port 2"\
"\n<R> :Reset (TRAP 0)"\
"\n");
do
{
printf("\n>");
putchar(ch=toupper(_getkey()));
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 + -