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 0x01
void __irq IRQ_SPR()
{
if((IOPIN&0X01)==0)
IOSET=0X01;
else
IOCLR=0X01;
while((EXTINT&0X02)!=0)
EXTINT=0x02;}
//中断初始化
void EINT_init(){
PINSEL0=0X;//选择为中EINT1,为GPIO
VICIntSelect=/*~*/(1<<15);//设置EINT1为
FIQ中断
VICIntEnable=(1<<15);//EINT1中断使能,
开中断
EXTINT=0x02;//清中断
}
int main(){
EINT_init();
IODIR=LED;//为输出,其余为输入
IOSET=LED;//开始不显示
while(1);
return 0;
}
修改头文件
修改lpc2016
1)在#define MAMTIM (*((volatile unsigned char *) 0xE01FC004))//定时控制添加:
#define EXTMODE (*((volatile unsigned char *) 0xE01FC148))
#define EXTPOLAR (*((volatile unsigned char *) 0xE01FC14C))
2)添加lcd1602
3)修改
void FIQ_Exception(void) {
if((IOPIN&0X01)==0)
IOSET=0X01;
else
IOCLR=0X01;
while((EXTINT&0X02)!=0)
EXTINT=0x02;
// while(1); // 这一句替换为自己的代码}
4) 修改文件将5f 改成9f
5、外部中断,通过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 0X7F
void 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,0x7
d,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 0xFEFF
void delay(uint xms){
uint i,j;
for (i=xms;i>0;i--)
for(j=110;j>0;j--) ; }int main(void){
const uint
a[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<
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;
else
IOCLR=d1;
while((EXTINT&0X02)!=0)//产生中断要清中断
EXTINT=0x02;
}
//EINT2的中断服务程序
void __irq EINT2_ISR()
{
if((IOPIN&d2)==0x0)
IOSET=d2;
else
IOCLR=d2;
while((EXTINT&0X04)!=0)
EXTINT=0x04;
}
//中断初始化
void EINT_init()
{
PINSEL0=0XA0000000;//选择,为中EINT1,
EINT2,,为GPIO
EXTMODE|=0X06;//- ,0110,跳沿触发
EXTPOLAR|=0x09;//-,1001,下跳沿触发
VICIntSelect&=~0x00018000;//设置EINT1,
2为IRQ中断
VICVectCntl1=0x20|15;//EINT1分配为向
量IRQ中通道1,b5=1
VICVectCntl2=0x20|16;//EINT2分配为向
量IRQ中通道2,b5=1
VICVectAddr1=(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 0x000000ff
uint32 temp=0;
//加法
void __irq IRQ_Eint0()
{
temp=VICIRQStatus;
temp=IOSET;
temp++;
if((temp&0x000f)>=10)
temp+=6; //个位大于9进位,改0
if((temp&0x00ff)>0x99)
temp+=0x060;//十位大于9进位,改0
IOCLR=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的方式,用数码管显示开机次数。
#include ""
#include ""
#define EEPROM 0xA0
void DelayNS(uint32 dly);
void Display(uint8 num);
uint8 data_buf[1];
int main()
{
PINSEL0 |=0x0000FFFF;
IODIR |= 0x0000FF00;
I2C_Init(100000);//初始化
IRcvStr(EEPROM,0x00,data_buf,1);//读出EEPROM 0x00处的数据
if(data_buf[0]==0xff)
data_buf[0] = 0;
if(data_buf[0]>9)
data_buf[0] = 0;
Display(data_buf[0]+1);
data_buf[0]++;
ISendStr(EEPROM,0x00,data_buf,1);//写入
数据到EEPROM 0x00
while(1);
return 0;
}
void DelayNS(uint32 dly)
{
uint32 i;
for(; dly>0; dly--)
for(i=0; i<50000; i++);
}
void Display(uint8 num)
{
switch(num)
{
case 0: //"0"
IOCLR |= (IOCLR &
0xFFFF00FF)|(0xFF<<8);
IOSET |= 0x3F<<8;
break;
case 1: //"1"
IOCLR |= (IOCLR &
0xFFFF00FF)|(0xFF<<8);
IOSET |= 0x00000006<<8;
break;
case 2: //"2"
IOCLR |= (IOCLR &
0xFFFF00FF)|(0xFF<<8);
IOSET |= 0x0000005B<<8;
break;
case 3: //"3"
IOCLR |= (IOCLR &
0xFFFF00FF)|(0xFF<<8);
IOSET |= 0x0000004F<<8;
break;
case 4: //"4"
IOCLR |= (IOCLR &
0xFFFF00FF)|(0xFF<<8);
IOSET |= 0x00000066<<8;
break;
case 5: //"5"
IOCLR |= (IOCLR &
0xFFFF00FF)|(0xFF<<8);
IOSET |= 0x0000006D<<8;
break;
case 6: //"6"
IOCLR |= (IOCLR &
0xFFFF00FF)|(0xFF<<8);
IOSET |= 0x0000007D<<8;
break;
case 7: //"7"
IOCLR |= (IOCLR & 0xFFFF00FF)|(0xFF<<8);
IOSET |= 0x00000007<<8;
break;
case 8: //"8"
IOCLR |= (IOCLR &
0xFFFF00FF)|(0xFF<<8);
IOSET |= 0x0000007F<<8;
break;
case 9: //"9"
IOCLR |= (IOCLR &
0xFFFF00FF)|(0xFF<<8);
IOSET |= 0x0000006F<<8;
break;
case 10: //"A"
IOCLR |= (IOCLR &
0xFFFF00FF)|(0xFF<<8);
IOSET |= 0x00000077<<8;
break;
case 11: //"B"
IOCLR |= (IOCLR &
0xFFFF00FF)|(0xFF<<8);
IOSET |= 0x0000007C<<8;
break;
case 12: //"C"
IOCLR |= (IOCLR &
0xFFFF00FF)|(0xFF<<8);
IOSET |= 0x00000039<<8;
break;
case 13: //"D"
IOCLR |= (IOCLR &
0xFFFF00FF)|(0xFF<<8);
IOSET |= 0x0000005E<<8;
break;
case 14: //"E"
IOCLR |= (IOCLR &
0xFFFF00FF)|(0xFF<<8);
IOSET |= 0x00000079<<8;
break;
case 15: //"F"
IOCLR |= (IOCLR &
0xFFFF00FF)|(0xFF<<8);
IOSET |= 0x00000071<<8;
break;
default: //"off"
IOCLR |= (IOCLR &
0xFFFF00FF)|(0xFF<<8);
IOSET |= 0x00000000<<8;
break;
}
}
13、利用PWM和按键,实现按键按下,脉宽增加的功能。
#include ""
#define KEY1 0x00004000 /*引脚连接KEY1*/
void WaitKey()
{ uint32 i;
while(1)
{ while((IOPIN&KEY1)!=0);
for(i=0;i<50;i++);
if((IOPIN&KEY1)==0)break;
}
while((IOPIN&KEY1)==0);
}
void init(){
PWMPR=0x00;
PWMMCR=0x02;
PWMMR0=4000;
PWMMR6=1000;
PWMLER=0x41;
PWMPCR=0x4000;
PWMTCR=0x09;
}
int main()
{
uint32 pwmdata;
PINSEL0=0x00080000;
PINSEL1=0x00000000;
init();
pwmdata=1000;
while(1)
{ PWMMR0=4000;
PWMMR6=pwmdata;
PWMLER=0x41;
WaitKey();
pwmdata+=100;
if(pwmdata>=4000)
pwmdata=0;
}
return 0;
}
14、利用数码管显示8个按键的按键序号,例如:第一个按键按下显示“1”,第二个按键按下显示“2”,以此类推。
#include ""
#define key (0xff<<8) typedef unsigned int uint; /*
*延时函数
*/
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;--j);
}
/*
*判断按键
*/
void waitkey()
{
if((IOPIN&key)!=key)//判断有键按下
{
delay(1000);//延时去抖
if((IOPIN&key)!=key)//再次判断按键
{
IOCLR=0x000000ff;//清0
switch(IOPIN&key)
{
case 0x0000fe00://键1
IOSET=0x00FF06;
break;
case 0x0000fd00:////键2
IOSET=0x00FF5b;
break;
case 0x0000fb00:////键3
IOSET=0x000FF4f;
break;
case 0x0000f700:////键4
IOSET=0x00FF66;
break;
case 0x0000ef00:////键5
IOSET=0x00FF6d;
break;
case 0x0000df00:////键6
IOSET=0x00FF7d;
break;
case 0x0000bf00:////键7
IOSET=0x0000FF07;
break;
case 0x00007f00:////键8
IOSET=0x0000FF7f;
break;
}
}
while((IOPIN&key)==key);//等待按键抬起
}
}
int main()
{
PINSEL0=0x0;//GPIO功能
IODIR=0x000000FF;//输入输出
while(1)
{
waitkey();
}
return 0;
}
15、利用WDT,控制LED1--LED4显示输出。程序先对LED1--LED4闪烁3次,并进行喂狗处理;然后只点亮LED1,并进入死循环,等待WDT复位;
#include ""
#define LEDCON 0x0000000f
void WdtFeed(void)
{
WDFEED = 0xAA;
WDFEED = 0x55;
}
void DelayNS(uint32 dly) {
uint32 i;
for(; dly>0; dly--)
{
for(i=0; i<1000; i++)WdtFeed();
}
}
int main(void)
{
uint8 i;
IODIR = LEDCON;
WDTC = ;
WDMOD = 0x03;
WdtFeed();
for(i=0; i<3; i++)
{
IOSET = 0x0000000f;
DelayNS(100);
IOCLR = 0x0000000f;
DelayNS(100);
}
IOSET = 0x0000000f;
IOCLR = 0x00000001;
while(1);
return(0);
}
16、以定时器的方式,使数码管从0—9循环显示,每一秒改变一次。#include ""
#define LED 0x7f
int
dis_tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7 d,0x07,0x7f,0x6f};
int i=0;
void __irq IRQ_Time0()
{
while((T0IR&0x01)==0);
IOCLR=0XFF;
IOSET=dis_tab[(++i)%10];
T0IR=0x01;
VICVectAddr=0x00;
}
void Time0Init()
{
T0PR = 99;
T0MCR = 0x03;
T0MR0 = 110592/4;
T0TCR = 0x03;
T0TCR = 0x01;
VICIntSelect = 0x00;
VICVectCntl0 = 0x24;
VICVectAddr0 = (uint32)IRQ_Time0;
VICIntEnable = 0x00000010;
}
int main()
{
PINSEL0 = 0x00000000;
IODIR = LED;
IOSET = 0X3F;
Time0Init();
while(1);
return 1;
}
17、利用SPI和HC595,控制数码管0-F显示。
#include ""
#define HC595_CS 0x00000100
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<5000; i++);
}
void MSpiIni(void)
{
S0SPCCR = 0x52;
S0SPCR = 0x30;
}
uint8 MSendData(uint8 data) {
IOCLR = HC595_CS;
S0SPDR =data;
while( 0==(S0SPSR&0x80) );
IOSET = HC595_CS;
return (S0SPDR);
}
uint8 const DISP_TAB[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint8 rcv_data;
int main(void)
{ uint8 i;
PINSEL0 = 0x00005500;
PINSEL1 = 0x00000000;
IODIR = HC595_CS;
MSpiIni();
while(1)
{ for(i=0; i<16; i++)
{ rcv_data = MSendData(DISP_TAB[i]);
DelayNS(300);
}
}
return(0);
}
修改添加
#define S0SPCR (*((volatile unsigned char *) 0xE0020000))
#define S0SPSR (*((volatile unsigned char *) 0xE0020004))
#define S0SPDR (*((volatile unsigned char *) 0xE0020008))
#define S0SPCCR (*((volatile unsigned char *) 0xE002000C))
#define S0SPINT (*((volatile unsigned char *) 0xE002001C))
#define S1SPCR (*((volatile unsigned char *) 0xE0030000))
#define S1SPSR (*((volatile unsigned char *) 0xE0030004))
#define S1SPDR (*((volatile unsigned char *) 0xE0030008))
#define S1SPCCR (*((volatile unsigned char *) 0xE003000C))
#define S1SPINT (*((volatile unsigned char *) 0xE003001C))
18、利用SPI和HC595,使流水灯亮,亮的方式为:从上往下——从下往上——灭——闪两下——往中间跑——交叉闪亮。
#include ""
#define HC595_CS 0x00000100
void DelayNS(uint32 dly)
{ uint32 i;
for (;dly>0;dly--)
for(i=0;i<50000;i++);
}
void MSpiIni(void)
{ S0SPCCR=0x52;
S0SPCR=0x30;
}
uint8 MSendData(uint8 data)
{ IOCLR=HC595_CS;
S0SPDR=data;
while(0==(S0SPSR&0x80));
IOSET=HC595_CS;
return(S0SPDR);
}
uint8
DISP_TAB[33]={0x01,0x02,0x04,0x08,0x10,0x20,0
x40,0x80,
0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,
0x00,0xFF,0x00,0xFF,0x00,
0x18,0x24,0x42,0x81,
0x01,0x04,0x10,0x40,
0x02,0x08,0x20,0x80
};
int main(void)
{ uint8 rcv_data;
uint8 i;
PINSEL0=0x00005500;
PINSEL1=0x00000000;
IODIR=HC595_CS;
MSpiIni();
rcv_data=MSendData(0);
while(1)
{ for (i=0;i<33;i++)
{rcv_data=MSendData(DISP_TAB[i]);
DelayNS(20);
}
}
return(0);
}
修改添加
#define S0SPCR (*((volatile unsigned char *) 0xE0020000)) #define S0SPSR (*((volatile unsigned char *) 0xE0020004)) #define S0SPDR (*((volatile unsigned char *) 0xE0020008)) #define S0SPCCR (*((volatile unsigned char *) 0xE002000C)) #define S0SPINT (*((volatile unsigned char *) 0xE002001C))
#define S1SPCR (*((volatile unsigned char *) 0xE0030000))
#define S1SPSR (*((volatile unsigned char *) 0xE0030004))
#define S1SPDR (*((volatile unsigned char *) 0xE0030008))
#define S1SPCCR (*((volatile unsigned char *) 0xE003000C))
#define S1SPINT (*((volatile unsigned char *) 0xE003001C))
19、通过UART端口向上位机(模拟终端)发送考生名字的拼音。
#include ""
void DelayNS(uint32 dly)
{ uint32 i;
for(;dly>0;dly--)
for(i=0;i<50000;i++);
}
void UART0_Ini(void)
{
U0LCR=0x83;
U0DLL=0x12;
U0DLM=0x00;
U0LCR=0x03;
}
void UART0_SendByte(uint8 data)
{
U0THR=data;
while((U0LSR&0x40)==0);
}
void UART0_SendStr(uint8 const *str)
{ while(1)
{
UART0_SendByte(*str++);
if(*str=='\0')
{
UART0_SendByte('\r');
UART0_SendByte('\n');
break;
}
}
}
int main(void)
{
uint8 const
SEND_STRING[]="zhangyunan!\n";
PINSEL0=0x00000005;
PINSEL1=0x00000000;
UART0_Ini();
UART0_SendStr(SEND_STRING);
DelayNS(10);
}
20、利用UART串口,完成一个字符串的写入和回写功能,要求每4个字符触发一次,返回刚才写入