#include
#define _ISR_STARTADDRESS 0x33ffff00
#define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x20))//存放ISR函数的入口地址
#define pISR_EINT2 (*(unsigned *)(_ISR_STARTADDRESS+0x28)) #define pISR_EINT8_23 (*(unsigned *)(_ISR_STARTADDRESS+0x34))
// _PND register must be clr by write 1
#define Clear1Pending(bit) {SRCPND = bit; INTPND = INTPND;} // precent write wrong data
#define FCLK 202800000 #define HCLK (202800000/2) #define PCLK (202800000/4) #define UART0 0x0 #define UART1 0x1 #define UART2 0xBB
///////////////////////////////////////////////////////////////////////////////////////////// void uart_init(int nMainClk, int nBaud, int nChannel) {
if(nMainClk == 0) nMainClk = PCLK;
switch (nChannel) {
case UART0:
UBRDIV0=( (int)(nMainClk/16./nBaud+0.5) -1 );// Baud rate divisior register 0
UCON0 = 0x245;
// Control register
UFCON0 = 0x0; //UART channel 0 FIFO control register, FIFO disable UMCON0 = 0x0; //UART chaneel 0 MODEM control register, AFC disable ULCON0 = 0x3; //Line control register : Normal,No parity,1 stop,8 bits
// UART symbol
}
}
break;
UFCON1 = 0x0; //UART channel 1 FIFO control register, FIFO disable UMCON1 = 0x0; //UART chaneel 1 MODEM control register, AFC disable ULCON1 = 0x3; UCON1 = 0x245;
UBRDIV1=( (int)(nMainClk/16./nBaud) -1 ); break; break;
case UART1:
default:
void uart_sendbyte(int nData) { }
void uart_sendstring(char *pString) {
while(*pString != '\\0')
uart_sendbyte(*pString++); }
void uart_printf(char *fmt) {
uart_sendstring(fmt); }
//////////////////////////////////////////////////////////////////////////////////////
/*进入中断处理函数,中断模式的寄存器先进入输入模式,所有列线输出置为1;
UTXH0 = nData;
while(!(UTRSTAT0 & 0x2));
依次把列线拉低,检测输入端口,EINT的值,如果为低点平,说明该列被拉低; 这样行列坐标就确定了。
处理完成,返回中断模式,IO口重新设定为输出低电平,使能下降沿触发中断;*/
void __irq int0_int(void) {
// clr _pend bit is essential after E_int }
Clear1Pending(0x1);
GPEDAT |= (1<<13); //set pre_bit GPGDAT &= ~(1<<2);
//clr exam_bit
if(((GPFDAT>>0)&1)==0) uart_printf(\//enter eint_mod , ouput_mod 0 GPFCON |= (0x2<<0); //EINT0 mod GPEDAT &= ~((1<<11)|(1<<13));//output 0 GPGDAT &= ~((1<<2)|(1<<6));
//output 0
GPGDAT |= (1<<6); GPEDAT &= ~(1<<13);
//set
pre_bit //clr
exam_bit
GPEDAT |= (1<<11);//set pre_bit GPGDAT &= ~(1<<6);
// clr exam_bit
if(((GPFDAT>>0)&1)==0) uart_printf(\GPGDAT |= ((1<<2)|(1<<6));//output 1
GPFCON &= ~(0x3<<0);//EINT_mod to input_mod
if(((GPFDAT>>0)&1)==0) uart_printf(\// 10 11 12 16
// enter input_mod ,kscan0-kscan3 output 1 GPGDAT &= ~(1<<11);// 0 GPEDAT |= (1<<13); // 1
if(((GPFDAT>>0)&1)==0) uart_printf(\
void __irq int2_int(void) {
GPEDAT |= (1<<13); GPGDAT &= ~(1<<2);
if(((GPFDAT>>2)&1)==0) uart_printf(\
GPFCON |= (0x2<<4); // EINT2 mod GPEDAT &= ~((1<<11)|(1<<13)); GPGDAT &= ~((1<<2)|(1<<6)); GPGDAT |= (1<<6); GPEDAT &= ~(1<<13);
if(((GPFDAT>>2)&1)==0) uart_printf(\GPEDAT |= (1<<11); GPGDAT &= ~(1<<6);
if(((GPFDAT>>2)&1)==0) uart_printf(\ // 7 8 9 15
GPGDAT &= ~(1<<11);// 0 GPEDAT |= (1<<13); // 1
GPGDAT |= ((1<<2)|(1<<6));//output 1 GPFCON &= ~(0x3<<4);// input_mod if(((GPFDAT>>2)&1)==0) uart_printf(\
// uart_printf(\ Clear1Pending(0x1<<2); }
void __irq int11_int(void) {
if(((EINTPEND>>11)&1)==1) {
//4 5 6 14
GPGDAT &= ~(1<<11);// 0 GPEDAT |= (1<<13); // 1
GPGDAT |= ((1<<2)|(1<<6));//output 1 GPGCON &= ~(0x3<<6);// input mod
if(((GPGDAT>>3)&1)==0) uart_printf(\GPEDAT |= (1<<11); GPGDAT &= ~(1<<6);
if(((GPGDAT>>3)&1)==0) uart_printf(\GPGDAT |= (1<<6); GPEDAT &= ~(1<<13);
if(((GPGDAT>>3)&1)==0) uart_printf(\GPEDAT |= (1<<13); GPGDAT &= ~(1<<2);
if(((GPGDAT>>3)&1)==0) uart_printf(\
GPGCON |= (0x2<<6);//EINT 11 mod GPEDAT &= ~((1<<11)|(1<<13)); GPGDAT &= ~((1<<2)|(1<<6));
EINTPEND=(1<<11); } else {
// 1 2 3 13
GPGDAT &= ~(1<<11);// 0
// uart_printf(\
GPEDAT |= (1<<13); // 1
GPGDAT |= ((1<<2)|(1<<6));//output 1 GPGCON &= ~(0x3<<22);// input mod
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新IT计算机ARM中断实现串口通信 全文阅读和word下载服务。
相关推荐: