认识ARM7-- LPC2124—Philips
当作8位51模式用:熟悉、理解保留字、数据模式、硬件接口与扩展à内置
1) 单个LED灯(位操作—输出)与多(8及其整倍数)个LED灯(字节操作—输出)—最小系统,仅有输出的单片机系统
1) 单个LED灯,位操作—输出
2) 多(8及其整倍数)个LED灯,字节操作—输出
3) 单个与多个LED灯,位与字节混合操作—输出
4) 单个LED灯闪烁—延时函数
5) 多个LED灯闪烁或流动—延时函数—流水灯
6) 多种软控制形成流水灯
1) 单位输出—一个LED灯显示
了解ARM
A) 硬件操作
打开-Proteus,
选取ARM芯片LPC2124、R电阻、LED灯、电源(设置正电位)与接地
连线完成(可以将二极管的极性调换,使用高电位或低电位)
保存文件
B) 软件操作
打开- Keil,
建立新的工程、设置或选择ARM芯片LPC2124、
建立新文件、编写控制代码、保存文件为*.C、添加到工作区
设置时钟频率、设置输出的编译文件*.HEX
链接编译、编译修改
保存文件
C) 控制指令—软件编写
***************单位输出—一个LED灯显示*************
#include
//软件延时函数: delay()—用户自定义函数
void delay (void)
{
unsigned volatile long i,j;
for(i=0;i<60000;i++)
for(j=0;j<5;j++)
}
int main(void)
{
PINSEL0 = 0;//设置引脚为GPIO-输出口PINSEL0、PINSEL1设置各引脚的功能。
IO0DIR = 0x000001;//将P0.0设置为输出 ,P0~7口用0x0000ff
IO0SET = 0x000001;//将P0.0置1,也就是让led灭(因:外接高电平); P0~7口用0x0000ff
while (1)
{
IO0CLR = 0x000001;// 使led亮
delay();
IO0SET = 0x000001;
delay();
}
程序说明:
GPIO
做输入输出。以P0口为例,寄存器有IO0PIN、IO0SET、IO0DIR、IO0CLR。
D) 仿真结果
打开-Proteus的仿真文件,双击芯片LPC2124,选择需要仿真的文件路径,选取*.HEX文件,OK;
点击仿真按钮,观察结果,修改软硬件,调整仿真时钟频率;
2) 多位输出—LEDs灯显示—流水灯
A) 硬件操作
同前
B) 软件操作
同前
C) 控制指令—软件编写
///////////////////////////////
void delay (void) //软件延时函数
{
unsigned volatile long i,j;
for(i=0;i<60000;i++);
for(j=0;j<8;j++);
}
int main(void)
{
PINSEL0 = 0;
IO0DIR = 0x0000FF;
IO0SET = 0x0000FF;
while (1)
{
IO0CLR = 0x000001;
delay();
IO0SET = 0x000001;
delay();
IO0CLR = 0x000002;
delay();
IO0SET = 0x000002;
delay();
IO0CLR = 0x000004;
delay();
IO0SET = 0x000004;
delay();
IO0CLR = 0x000008;
delay();
IO0SET = 0x000008;
delay();
IO0CLR = 0x000010;
delay();
IO0SET = 0x000010;
delay();
IO0CLR = 0x000020;
delay();
IO0SET = 0x000020;
delay();
IO0CLR = 0x000040;
delay();
IO0SET = 0x000040;
delay();
IO0CLR = 0x000080;
delay();
IO0SET = 0x000080;
delay();
}
}
////////////////////////////////
程序说明:
该程序表明了
可以注意数值的发送格式0x000080;这里总计8位,每位代表4个二进制数,总共32位?0x00000000==二进制0000 0000 0000 0000 0000 0000 0000 0000
0x0000FFFF==二进制0000 0000 1111 1111 1111 1111 1111 1111
注意对比8位的51系列数值的发送格式0x00与0x0FF
程序可读性差,使用数组比较恰当
专用的数据格式的变化,可以用于数码管的显示驱动
D) 仿真结果
打开-Proteus的仿真文件,双击芯片LPC2124,选择需要仿真的文件路径,选取*.HEX文件,OK;
点击仿真按钮,观察结果,修改软硬件,调整仿真时钟频率;
3) 多位输出—LEDs灯显示—流水灯
A) 硬件操作
同前
B) 软件操作
同前
C) 控制指令—软件编写
//流水灯
#include
void delay (void)// 软件延时函数delay()
{
unsigned volatile long i,j;
for(i=0;i<60000;i++);
for(j=0;j<9;j++);
}
int main(void)
{
PINSEL0 = 0; //用PINSEL0设置引脚为GPIO ;PINSEL1设置?
IO0DIR = 0x0003FF;//将P0.0~P0.09设置为输出,阳极硬件--高电平,阴极硬件可取反;DIR?
IO0SET = 0x0003FF; //将P0.0~P0.09置1,也就是让led灭
while (1)
{
IO0CLR = 0x000001;
delay();
IO0SET = 0x000001;
delay();
IO0CLR = 0x000002;
delay();
IO0SET = 0x000002;
delay();
IO0CLR = 0x000004;
delay();
IO0SET = 0x000004;
delay();
IO0CLR = 0x000008;
delay();
IO0SET = 0x000008;
delay();
IO0CLR = 0x000010;
delay();
IO0SET = 0x000010;
delay();
IO0CLR = 0x000020;
delay();
IO0SET = 0x000020;
delay();
IO0CLR = 0x000040;
delay();
IO0SET = 0x000040;
delay();
IO0CLR = 0x000080;
delay();
IO0SET = 0x000080;
delay();
IO0CLR = 0x000100;
delay();
IO0SET = 0x000100;
delay();
IO0CLR = 0x000200;
delay();
IO0SET = 0x000200;
delay();
}
}
程序说明:
程序书写的繁琐可以看到数组的好处。程序编写用循环结构的好处
D) 仿真结果
4) 多位输出—LEDs灯显示—流水灯—位扫描—数组
A) 硬件操作
同前
B) 软件操作
同前
C) 控制指令—软件编写
//流水灯--数组
#include
typedef unsigned int uint;
uint const SaoMiao_TAB[]={0x000001,0x000002,0x000004,0x000008,0x000010,0x000020,0x000040,0x000080,0x000100,
0x000200,0x000400,0x000800,0x001000,0x002000,0x004000,0x008000,0x010000,0x020000,0x040000,0x080000};
void delay (void)// 软件延时函数delay()
{
unsigned volatile long i,j;
for(i=0;i<60000;i++);
for(j=0;j<9;j++);
}
int main(void)
{
PINSEL0 = 0; //用PINSEL0设置引脚为GPIO ;PINSEL1设置?
IO0DIR = 0x0fffFF;//将P0.0~P0.15设置为输出,阳极硬件--高电平,阴极硬件可取反;DIR?
IO0SET = 0x0fffFF; //将P0.0~P0.15置1,也就是让led灭
while (1)
{
unsigned volatile long n;
for(n=0;n<20;n++)
{
IO0CLR = SaoMiao_TAB[n];
delay();
IO0SET = SaoMiao_TAB[n];
delay();
}
}
}
程序说明:
程序书写简洁,可读性好;可以看到数组的好处。程序编写用循环结构的好处
---------数组也显得不方便—移位功能好使--------------
//流水灯—38LED—数组
#include
typedef unsigned int uint;
uint const SaoMiao_TAB[]={0x000001,0x000002,0x000004,0x000008,0x000010,0x000020,0x000040,0x000080,0x000100,0x000200,0x000400,0x000800,0x001000,0x002000,0x004000,0x008000,0x010000,0x020000,0x040000,0x080000,0X100000,0X0200000,0X0400000,0X0800000, 0X01000000,0X02000000,0X040000000,0X080000000};
uint const SaoMiao_TAB1[]={0x010000,0x020000,0x040000,0x080000,0x100000,0x200000,0x400000,0x800000,0x01000000,0x02000000,0x04000000,0x08000000,0x010000000,0x020000000,0x040000000,0x080000000};
void delay (void)// 软件延时函数delay()
{
unsigned volatile long i,j;
for(i=0;i<60000;i++);
for(j=0;j<9;j++);
}
int main(void)
{
PINSEL0 = 0; //用PINSEL0设置引脚为GPIO ;
IO0DIR = 0x0FFFFFFFF;//将P0.0~P0.31设置为输出,阳极硬件--高电平,阴极硬件也不能取反;
IO0SET = 0x0FFFFFFFF; //将P0.0~P0.31置1,也就是让led灭
IODIR1 = 0x0ffff0000;//将P1.16~P1.31设置为输出,阳极硬件--高电平,阴极硬件也不能取反;
IOSET1 = 0x0ffff0000;
while (1)
{
unsigned volatile long n,m;
for(n=0;n<32;n++)
{
IO0CLR = SaoMiao_TAB[n];
delay();
IO0SET = SaoMiao_TAB[n];
delay();
for(m=0;m<16;m++)
{
IOCLR1 = SaoMiao_TAB1[m];
delay();
IOSET1 = SaoMiao_TAB1[m];
delay();
}
}
}
}
程序说明:
通过使用32+16位LED显示流水灯,可以理解LPC2124的各个管脚、端口的功能。
---------------数组也显得不方便—移位功能好使-----------------





