1、用PWM方式,使LED灯闪烁。
#include ""void PwmInit(void);int main(void){PINSEL0=0x00080000;PwmInit();while(1){PWMMR0=4000;PWMMR6=2000;}return 0;}void PwmInit(){PWMPR=0x00;PWMMCR=0x02;PWMMR0=4000;PWMMR6=2000;PWMLER=0x41;PWMPCR=0x4000;PWMTCR=0x09;}2、用定时器匹配后引脚翻转功能使LED灯1秒闪烁一次。
#include ""#define LED 1<<3 void __irq IRQ_Time0(){ while((T0IR&0x01)==0);T0IR=0x01;VICVectAddr=0x00;}void Time0Init(){T0PR = 99;T0MCR = 0x03;T0MR0 = 110592/4;T0TCR = 0x03;T0TCR = 0x01;T0EMR=0X30;VICIntSelect = 0x00;VICVectCntl0 = 0x24;VICVectAddr0 = (uint32)IRQ_Time0;VICIntEnable = 0x00000010;}int main(){PINSEL0 = 0x00000080;IOCLR=LED;Time0Init();while(1);return 1;}3、上位机发送一个数字字符给下位机(1-8),下位机接受到这个字符若为“1”,则点亮一盏灯,“2”点亮2盏灯。
“8”点亮8盏灯。
4、设外部中断为FIQ快速中断,按键按下,灯的亮灭状态改变。
/**注意:需要在中添加EXTMODE和EXTPOLAR寄存器*/#include ""#define LED 0x01void __irq IRQ_SPR(){if((IOPIN&0X01)==0)IOSET=0X01;elseIOCLR=0X01;while((EXTINT&0X02)!=0)EXTINT=0x02;}//中断初始化void EINT_init(){PINSEL0=0X;//选择为中EINT1,为GPIOVICIntSelect=/*~*/(1<<15);//设置EINT1为FIQ中断VICIntEnable=(1<<15);//EINT1中断使能,开中断EXTINT=0x02;//清中断}int main(){EINT_init();IODIR=LED;//为输出,其余为输入IOSET=LED;//开始不显示while(1);return 0;}修改头文件修改lpc20161)在#define MAMTIM (*((volatile unsigned char *) 0xE01FC004))//定时控制添加:#define EXTMODE (*((volatile unsigned char *) 0xE01FC148))#define EXTPOLAR (*((volatile unsigned char *) 0xE01FC14C))2)添加lcd16023)修改void FIQ_Exception(void) {if((IOPIN&0X01)==0)IOSET=0X01;elseIOCLR=0X01;while((EXTINT&0X02)!=0)EXTINT=0x02;// while(1); // 这一句替换为自己的代码}4) 修改文件将5f 改成9f5、外部中断,通过1个按键使8个发光二极管二进制显示加法。
#include ""#define LED 0x000000FF //设置p0引脚typedef unsigned int uint32;uint32 counter=0;void __irq IRQ_Eint1(void){ //加法counter++;IOSET=LED;IOCLR=counter;while((EXTINT&0x02)!=0){EXTINT=0x02;}VICVectAddr=0;}int main(void){PINSEL0 = 0x;IODIR = LED;IOSET=LED;IOCLR=counter;VICIntSelect=0;VICIntEnable=0x00008000;VICVectCntl1=0x2F;VICVectAddr1=(int)IRQ_Eint1;while (1) ;}6、用单边沿、双边沿两种方式输出两路脉冲信号,要求占空比为50%,显示在同一个示波器上;#include ""void PWM_Init(){PWMPR=0x00;PWMMCR=0x02;PWMMR0=4000;PWMMR1=1000;PWMMR2=3000;PWMMR3=2000;PWMLER=0x0F;PWMPCR=0x0C04;PWMLER=0X0F;PWMTCR=0x09;}int main(){PINSEL0=0X00008008;PWM_Init();while(1){PWMMR0=4000;PWMMR1=1000;PWMMR2=3000;PWMMR3=2000;}return 0;}7、用延时方法,使共阳数码管静态循环显示0—F。
7seg-com-an-grn#include ""#define LED 0X7Fvoid delayNS(uint32 xms) {int i,j;for(i=xms;i>0;i--)for(j=5000;j>0;j--); }uint32 dis_tab[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};int main(){int i;PINSEL0=0;IODIR=LED;while(1)for(i=0;i<16;i++){IOSET=0xff;IOCLR=dis_tab[i];delayNS(280);}return 0;}8、8位共阴数码管动态显示。
#include""#define uchar unsigned char#define uint unsigned int#define CS 0xFEFFvoid delay(uint xms){uint i,j;for (i=xms;i>0;i--)for(j=110;j>0;j--) ; }int main(void){const uinta[8]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0xff};PINSEL0 = 0x00000000;PINSEL1 = 0x00000000;IODIR = 0xFFFF;while (1){uchar i;for (i=0;i<8;i++){IOSET = (CS<<i) & (0xFF00) | a[i];delay(20);IOCLR = 0xFFFF;}}return 0;}9、使用中断,2按键,2灯。
不同按键控制不同灯,按键按下,所控制的灯的状态改变。
修改头文件1)在#define MAMTIM (*((volatile unsigned char *) 0xE01FC004))//定时控制添加:#define EXTMODE (*((volatile unsigned char *) 0xE01FC148))#define EXTPOLAR (*((volatile unsigned char *) 0xE01FC14C))#include ""#define d1 1<<0//第一盏灯#define d2 1<<1//第二盏灯//EINT1的中断服务程序void __irq EINT1_ISR(){if((IOPIN&d1)==0x0)IOSET=d1;elseIOCLR=d1;while((EXTINT&0X02)!=0)//产生中断要清中断EXTINT=0x02;}//EINT2的中断服务程序void __irq EINT2_ISR(){if((IOPIN&d2)==0x0)IOSET=d2;elseIOCLR=d2;while((EXTINT&0X04)!=0)EXTINT=0x04;}//中断初始化void EINT_init(){PINSEL0=0XA0000000;//选择,为中EINT1,EINT2,,为GPIOEXTMODE|=0X06;//- ,0110,跳沿触发EXTPOLAR|=0x09;//-,1001,下跳沿触发VICIntSelect&=~0x00018000;//设置EINT1,2为IRQ中断VICVectCntl1=0x20|15;//EINT1分配为向量IRQ中通道1,b5=1VICVectCntl2=0x20|16;//EINT2分配为向量IRQ中通道2,b5=1VICVectAddr1=(uint32)EINT1_ISR;//EINT1的中断服务程序VICVectAddr2=(uint32)EINT2_ISR;//EINT2的中断服务程序VICIntEnable=0x00018000;//EINT1,2中断使能,开中断EXTINT=0x0f;//清中断}int main(){EINT_init();IODIR=d1|d2;//,为输出,其余为输入IOSET=d1|d2;//开始不显示while(1);return 0;}10、以中断方式,控制两个数码管显示数字,三个按键,每个按键分别控制数字的加、减和清零。
#include ""#define LED 0x000000ffuint32 temp=0;//加法void __irq IRQ_Eint0(){temp=VICIRQStatus;temp=IOSET;temp++;if((temp&0x000f)>=10)temp+=6; //个位大于9进位,改0if((temp&0x00ff)>0x99)temp+=0x060;//十位大于9进位,改0IOCLR=LED;IOSET=temp;while((EXTINT&0x01)!=0)EXTINT=0x01;VICVectAddr=0x00;}//清零void __irq IRQ_Eint1(){temp=VICIRQStatus;IOCLR=LED;IOSET=0;while((EXTINT&0x02)!=0)EXTINT=0x02;VICVectAddr=0x00;}//减法void __irq IRQ_Eint2(){temp=VICIRQStatus;temp=IOSET;temp--;if((temp&0x000f)==0xf)//temp--,个位出现f,执行下边操作temp&=0xf9; //个位f-9-,十位保留if((temp&0x00f0)==0xf0)//temp--,十位出现f,执行下边操作temp&=0x9f;//十位f--9,个位保留IOCLR=LED;IOSET=temp;while((EXTINT&0x04)!=0)EXTINT=0x04;VICVectAddr=0x00;}void EXTINT_Init(){VICIntSelect=0x00000000;VICVectCntl0=0x2e;VICVectAddr0=(int)IRQ_Eint0;VICVectCntl1=0x2f;VICVectAddr1=(int)IRQ_Eint1;VICVectCntl2=0x30;VICVectAddr2=(int)IRQ_Eint2;VICIntEnable=0x0001c000;EXTINT=0x07;}int main(){PINSEL0=0xa0000000;PINSEL1=0x00000001;EXTINT_Init();IODIR=LED;IOCLR=LED;while(1);return 0;}11、以GPIO的方式控制LCD1602输出两行,第一行显示邮箱,第二行显示电话号#include ""#define rs (1<<8) #define rw (1<<9) #define en (1<<10) #define busy (1<<7) uint8 txt1[]={""}; uint8 txt2[]={""}; void CheckBusy() {IODIR=0x700;while(1){IOCLR=rs;IOSET=rw;IOSET=en;if(!(IOPIN & busy))break;IOCLR=en;}IODIR=0x7ff;}void WrOp(uint8 dat){CheckBusy();IOCLR=rs; //全部清零IOCLR=rw;IOCLR=0xff; //先清零IOSET=dat; //再送数IOSET=en;IOCLR=en;}void WrDat(uint8 dat){CheckBusy();IOSET=rs;IOCLR=rw;IOCLR=0xff; //先清零IOSET=dat; //再送数IOSET=en;IOCLR=en;}void DisText(uint8 addr,uint8 *p){WrOp(addr);while(*p !='\0')WrDat(*(p++));}int main(void){lcd_init();IODIR=0x7ff; //设置为输出IOCLR=0x7ff;DisText(0x80,txt1);DisText(0xc3,txt2);while(1);}12、以I2C的方式,用数码管显示开机次数。