📄 keyint.c
字号:
#include "C240.h"
/* define Input/Output variable value */
ioport unsigned int port0,port1,port2,port3,port4,port5;
/*********************************************/
void dsp_setup()
{
unsigned int temp;
/*********************************************/
/* Disable watchdog timer */
/*********************************************/
temp = WDCR;
temp = temp|0x68;
WDCR = temp;
/*********************************************/
/* initialize PLL module (20 MHz XTAL1) */
/*********************************************/
CKCR1 = 0x60; /* crystal=20MHz CPUCLK = 20MHz */
/* and 1x PLL mult ratio */
CKCR0 = 0xc3; /* low–power mode 0, */
/* ACLK enabled, */
/* PLL enabled, */
/* SYSCLK=CPUCLK/2 */
SYSCR = 0x40c0;
XINT1CR=0x0006;
}
/* Initiate the event management register */
void eventmgr_init()
{
GPTCON=0x0442;
/* Initialize T1 */
T1PER=0x0fa0; /* Period is 200us */
T1CMP=0x07d0;
T1CON=0x9042;
/* Initialize T2 */
T2PER=0x0190; /* Period is 20us */
T2CON=0x9040;
/* Setup shared pins */
OCRA = 0xf800; /* pins IOPB0–IOPB3 & IOPA0–IOPA2 to I/O pins */
OCRB = 0x00f1; /* pins are: ADSOC, XF, /BIO, CAP1–CAP4 */
PADATDIR = 0x0701
; /* outputs IOPA0–IOPA2, set low */
PBDATDIR = 0x0707; /* outputs IOPB0–IOPB2, set high */
/* Initialize T3 */
T3CNT=0x0;
T3PER=0xffff;
T3CON=0x9440; /* Prescaler=/16 */
/* Setup capture units */
CAPCON = 0x0; /* reset capture control register */
CAPFIFO= 0x0ff; /* Clear FIFO’s */
CAPCON = 0xa6c0; /* enable #1, use Timer3, both edges */
}
/*********************************************/
void keyboard_ISR()
{
int i;
unsigned int scan_in,scan_out,x2;
int row,column=0,key_NO; /* row=0,1,2; column=1,2,3,4 */
row=4;
for(i=0;i<7500;i++);
scan_in=port5;
x2=scan_in & 0x0f;
if (x2!=0x0f)
{
switch(x2)
{
case 0x0e: column=4;
break;
case 0x0d: column=3;
break;
case 0x0b: column=2;
break;
case 0x07: column=1;
break;
default : column=17;
}
scan_out=0x0f7;
port0=scan_out; /* scan keyboard */
for(i=0;i<1000;i++);
scan_in=port5;
while ((scan_in & 0x0f)==0x0f)
{
scan_out=scan_out>>1;
port0=scan_out;
for(i=0;i<1000;i++);
scan_in=port5;
row--;
if (row==0)
{
row=17;
break;
}
}
key_NO=4*(row-1)+column;
port0=0x00;
x2=port5;
while ((x2&0x0f)!=0x0f)
{
x2=port5;
port0=0x00;
}
for(i=0;i<7500;i++);
x2=port5;
while ((x2&0x0f)!=0x0f)
{
x2=port5;
port0=0x00;
}
port1=0x00;
port2=0x00;
switch(key_NO)
{
case 1 : port3=0x00;
port4=0x01;
break;
case 2 : port3=0x00;
port4=0x02;
break;
case 3 : port3=0x00;
port4=0x03;
break;
case 4 : port3=0x00;
port4=0x04;
break;
case 5 : port3=0x00;
port4=0x05;
break;
case 6 : port3=0x00;
port4=0x06;
break;
case 7 : port3=0x00;
port4=0x07;
break;
case 8 : port3=0x00;
port4=0x08;
break;
case 9 : port3=0x00;
port4=0x09;
break;
case 10 : port3=0x01;
port4=0x00;
break;
case 11 : port3=0x01;
port4=0x01;
break;
case 12 : port3=0x01;
port4=0x02;
break;
case 13 : port3=0x01;
port4=0x03;
break;
case 14 : port3=0x01;
port4=0x04;
break;
case 15 : port3=0x01;
port4=0x05;
break;
case 16 : port3=0x01;
port4=0x06;
break;
default : port3=0x09;
port4=0x09;
break;
}
}
}
/*************************************/
/* ISR for A/D and keyboard interrupt */
void c_int1()
{
unsigned int sysint_vector;
IFR=0x0001; /* Clear interrupt flags */
sysint_vector=SYSIVR; /* read interrupt vector address offset */
if (sysint_vector==0x0001) /* if keyboard(XINT1) interrupt */
{
keyboard_ISR();
XINT1CR=0x0007;
}
}
/*******************************************************************/
void disable_interrupts()
{
asm(" SETC INTM");
}
/************************************************************************/
void enable_interrupts()
{
XINT1CR=0x0007;
IFR = 0xffff; /* Clear pending interrupts */
IFRA = 0xffff;
IFRB = 0xffff;
IFRC = 0xffff;
IMR = 0x0001; /* Enable CPU Interrupts:INT 2,3,4 */
IMRA = 0x0000; /* Enable timer 1 period interrupts */
IMRB = 0x0000; /* Enable temer 3 period interrupts */
IMRC = 0x0000; /* Enable CAP1 interrupts*/
asm(" CLRC INTM"); /* Global interrupt enable */
}
/* ***************************************************************** */
/* The main program
/* ***************************************************************** */
main()
{
unsigned int velocity;
unsigned int x1;
int i;
disable_interrupts();
dsp_setup();
eventmgr_init();
enable_interrupts();
x1=0x01-0xffff;
for(;;)
{
port0=0x00;
x1=XINT1CR;
if (x1&0x8000)
{
keyboard_ISR();
XINT1CR=0x0006;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -