arm 键盘实验 基于lpc2000系列

serial.c修改两行 ,97是根据波特率,时钟频率算出来的,请查找相关公式。   

PINSEL0 = 0x00050000;                  
U1LCR = 0x83;                         
U1DLL = 97;                          
U1LCR = 0x03; 

main.c   增加了一段代码(弥补软件缺陷的,自己阅读理解),这里把整个main.c拷了过来,乱码不用管,粘贴到keil中就能正常显示

#include "LPC21xx.h"
#include <stdio.h> 
extern void init_serial (void);          /* initialize serial interface       */
//³£Á¿¶¨Òå
const unsigned char LEDSEGCODE[]=
{
	0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};
unsigned char KSCANCODE[]={0x01,0x02,0x04,0x08};
unsigned char keytab[4][4]=  //¼üÖµ±í£¬±£´æÁË16¸ö°´¼üµÄ¶ÔÓ¦¼üÖµ
{
	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x00,0x01,0x02,0x03,0x04,0x05
};
void Delay_250uS(void) //ÑÓʱº¯Êý
{
	unsigned int i;
	i=50000;//CCLK=60MHZ
	while(i--);
}
int main(void)
{
	unsigned int keyval;
	unsigned int row,col,x1,x2;
	unsigned int oldrow=66;
	unsigned int oldcol=66;
	int amount=10;
	init_serial( );
	 //printf("xvvvv1");
	//³õʼ»¯LPC2124µÄP0
	PINSEL0=0x00050000;//0x00000000;
	PINSEL1=0x00000000;
	PINSEL2=0x00000000;
	IO0DIR=0x000000FF;//
	IO1DIR=0x000F0000;//KR1-KR4¶¨ÒåΪÊä³ö KC1-KC4¶¨ÒåΪÊäÈë	 
	IO0CLR=0x000000FF;//³õʼ»¯LEDÃð
	keyval=0;
	//ÎÞÏÞÑ­»·Ìå
	printf("xin zhen shuai");	
	while (1)
	{
		//Delay();
		//printf("%d %d\n",(x1 & 0x00F00000)!=0x00F00000,(x2 & 0x00F00000)!=0x00F00000);
		//Ñ­»·´ÓP1.16-P1.19Êä³öÐÐɨÃèÐźţ¨Ö»ÓÐ1ÌõÐÐÏßÊä³öµÍµçƽ£¬ÆäÓà3ÌõΪ¸ß£©
		for (row=0; row<4; row++)  //·¢³öɨÃèÂëµÄʱºò£¬È·¶¨±¾´Î¼ì²â°´¼üµÄÐкÅ
		{ 
			IO1SET=(0x0F)<<16;
			IO1CLR=(KSCANCODE[row])<<16; //¸ù¾ÝÐкŲé±í£¬µÃµ½²¢·¢³ö±¾´Î¼üÅÌɨÃèÂë
			x1=	IO1PIN;
			if ((x1 & 0x00F00000)!=0x00F00000) //¼ì²âµ½¼üÅÌ°´Ï¶¯×÷
			{
				Delay_250uS();	//ÑÓʱȥ¶¶¶¯
				
				x2=IO1PIN;
				if ((x2 & 0x00F00000)!=0x00F00000)	//È·ÈÏÊÇÄÄÁеļü°´ÏÂ
				{   //È·¶¨°´¼üµÄÁкÅ
					if ((IO1PIN & 0x00E00000)==0x00E00000) col=0; 
					else if ((IO1PIN & 0x00D00000)==0x00D00000) col=1; 
					else if ((IO1PIN & 0x00B00000)==0x00B00000) col=2;
					else col=3;					
					keyval=keytab[row][col];  //¸ù¾ÝÐкźÍÁкţ¬²é±íÇó¼üÖµ 
					
					if(oldrow==row && oldcol==col)
					{
						if(amount>0){
							amount--;
							
							break;
						}
					}
					amount=10;
					oldrow=row;
					oldcol=col;
					
					
					
					
					IO0CLR|=0xFF; 						//ÇåÏÔʾ
					IO0SET=(LEDSEGCODE[keyval]<<0);	//ÏÔʾ±¾´Î°´ÏµļüÂëÖµ
					printf("R=%x  c=%x\n",(x2>>16)&0x000f,(x2>>20)&0xf);
					
					IO1SET=(0x0F)<<16;
					IO1CLR=(KSCANCODE[row])<<16; //¸ù¾ÝÐкŲé±í£¬µÃµ½²¢·¢³ö±¾´Î¼üÅÌɨÃèÂë
					x1=	IO1PIN;
					Delay_250uS();
					while(1){
						Delay_250uS();
						if((x1 & 0x00F00000)==0x00F00000)break;//ûÓа´¼ü°´ÏÂÍ˳öÑ­»·
						IO1SET=(0x0F)<<16;
						IO1CLR=(KSCANCODE[row])<<16; //¸ù¾ÝÐкŲé±í£¬µÃµ½²¢·¢³ö±¾´Î¼üÅÌɨÃèÂë
						x1=	IO1PIN;
					}
						
					
				}			
			}
		}
	}
}

串行口怎么看?

这个黑黑的就是个显示屏,可以看到串行口输出的字符,main.c中调用printf函数输出的内容就会在这里显示。

想要看这个黑屏幕的内容很简单,运行后,右键点击黑框,再点击最后一行virtual terminal(虚拟终端)

如果一切正常,可以在弹出的virtual terminal中看到打印出来的字符,每按一下按键都会再打印出一行字符

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会写代码的孙悟空

赠人玫瑰 手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值