arm力天电子 lpc2148流水灯驱动程序详解

2019-05-20来源: eefocus关键字:arm  lpc2148  流水灯驱动

一个破流水灯程序看了两天了,void WriteByte(unsigned char data)这部分还是没看懂,力天电子上面介绍说这部分三端口的数据输入,选出8位的串行数据。


选择16,17,18,19四个控制位,主要跟电路图的连接有关,4块74HC595,组成32位(如图所示),从下往上依次是0~31为,图中写反了。因此到D13对应的引脚应该是16,D12对应的是17,D11对应的是18,D10对应的是19. 当16,17,18,19分别为低电平时二极管才能够导通发光。高电平时熄灭


1#include


2#define         SCLK  0x01<<24  //指定P1.24管脚,通过 IO1DIR |= SCLK;可判断是IO1端口,而不是IO0端口

3#define         MISO  0x01<<5    //指定P0.5口

4#define         MOSI  0x01<<6   //指定P0.6口

5#define         RCK   0x01<<7  //指定P0.7口

6void Delayn(unsigned long n);  //unsigned long n是一个入口函数

7void HC595_Init(void);

8void Write595(void);

9unsigned int HC595_DATA = 0;

10int main(void)

11{

 12 //初始化74HC595

 13 HC595_Init();

14  //主循环

15  while(1)

16  {

17    HC595_DATA &=~(1<<16);Write595();  //首先1左移16位,得到0000 0000 0000 0001 0000 0000 0000 0000,取反(~)得到1111 1111 1111 1110 1111 1111 1111 1111


    //然后跟HC595_DATA取与(&),HC595_DATA的值为0xFFFFFFFF(在42行),得到1111 1111 1111 1110 1111 1111 1111 1111 //此处取与的目的是为了保证在改变16位的同时不会影响到其他位。之后跳转到60行执行Write595(),依次写入第一个八位,0xff。写入第二个八位,0xff。写入第三个八位,0xfe。写入第四个八位,0xff  因此写入的32位数据就是0xfffeffff  (16位为0)


18    Delayn(250000);  //延迟,使D13发亮一段时间


19    HC595_DATA &=~(1<<17);Write595(); //类似于上面,最终得到的是1111 1111 1111 1101 1111 1111 1111 1111 写入的32位数据时0xfffdffff  (17位为0)

 20   Delayn(250000);   //延迟,使D12发亮一段时间

 21   HC595_DATA &=~(1<<18);Write595(); //类似于上面,最终得到的是1111 1111 1111 1011 1111 1111 1111 1111 写入的32位数据时0xfffbffff  (18位为0)

22    Delayn(250000);   //延迟,使D12发亮一段时间

23    HC595_DATA &=~(1<<19);Write595();//类似于上面,最终得到的是1111 1111 1111 0111 1111 1111 1111 1111 写入的32位数据时0xfff7ffff  (19位为0)

24   Delayn(250000);   //延迟,使D10发亮一段时间 

    

25    HC595_DATA |=(1<<16);Write595(); 

26    Delayn(250000); //D13灭

27    HC595_DATA |=(1<<17);Write595(); 

28    Delayn(250000);  //D12灭

29   HC595_DATA |=(1<<18);Write595();

30   Delayn(250000);  //D11灭

31   HC595_DATA |=(1<<19);Write595();

32   Delayn(250000);  //D10灭

33  }

34}


35//初始化595接口

36void HC595_Init(void)  //初始化IO口

37{

38  IO0DIR |= MOSI|RCK; //此处可以换一种写法IO0DIR |= (1<<6)|(1<<7),方向寄存器设置成输出

39  IO1DIR |= SCLK;  //方向寄存器设置成输出

40  IO1CLR |= SCLK;

41 // IO0DIR |= RCK; (可以不要)

  

42  HC595_DATA = 0xFFFFFFFF;  Write595(); //HC595_DATA = 0xFFFFFFFF的作用是置595所有的端口为高电平,使所有的发光二级管熄灭

43}

44//写字节(此处的功能不是很懂,希望有知道的朋友可以指点!)

45void WriteByte(unsigned char data)  //unsigned char data是一个入口函数

46{

47  unsigned char i;

48  //IO0CLR = RCK; (可以不要,62已经声明过了)

49  for(i=0;i<8;i++)

50  {

51    if(data&0x01)      IO0SET=MOSI;

52    else      IO0CLR=MOSI;

53    IO1SET=SCLK;  //时钟高电平

54    data>>=1;  //数据移位,把数据移到串行端口

55    IO1CLR=SCLK;  //时钟低电平

56  }

57  //IO0SET = RCK; (可以不要,67已经声明过了)

58}


59//刷新595的数据

60void Write595(void)   //第一步595片选,然后数据写入第一个八位(0-7),再数据写入第二个八位(8-15),第三个八位(16-23),第四个八位(24-31)

61{

62  IO0CLR = RCK;                     //595片选

63  WriteByte(HC595_DATA&0xff);   //写入第一个八位,0xff  然后跳转到45行执行WriteByte

64  WriteByte((HC595_DATA&0xff00)>>8);//写入第二个八位,0xff  然后跳转到45行执行WriteByte

65  WriteByte((HC595_DATA&0xff0000)>>16); //写入第三个八位,0xfe  然后跳转到45行执行WriteByte

66  WriteByte((HC595_DATA&0xff000000)>>24);//写入第四个八位,0xff  然后跳转到45行执行WriteByte

67  IO0SET = RCK;

68}

69//延时周期数   

70void Delayn(unsigned long n)     //()里面不能是void,因为此处有一个入口函数unsigned long n

71{

72  while(n--);

73}

关键字:arm  lpc2148  流水灯驱动 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic462265.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:lpc2148基于DS18B20的温度控制系统程序代码之dat=(j1)详解
下一篇:S3C2440核心板原理图设计:与NAND FLASH接线分析

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

ARM七种异常源和异常处理流程(四大步三小步)
                                                    ARM异常处理(处理器对特定的异常事件进行的处理)的进入过程(硬件自动完成):四大步(两备份两修改)三小步:(1)拷贝 CPSR (当前程序状态寄存器current program status register)到 SPSR_<mode>(保存当前
发表于 2020-03-08
ARM七种异常源和异常处理流程(四大步三小步)
arm开发板的一些常用命令
这写记录是我经常忘记的东西:做个笔记在这里1、reboot 是重启的意思。2、source 是使那些修改的文件立即生效,避免了重启之后才能生效的问题,例如我们修改了/etc/profiile,修改之后不能立即生效。这时我们输入 source /etc/profile 就可以生效了这些以后还会继续更新。3、chmod -R 777 /home/edu/practice 设置practice文件夹里面的所有的文件权限为7774、压缩单个文件:gzip -v etc.c   生成的压缩名为:etc.c.gz5、压缩多个文件:gzip -v  *     //压缩当前目录下的所有文
发表于 2020-03-08
ARM处理器的未定义指令异常处理过程分析
在前面的两篇文章中已经介绍了ARM处理器的工作模式和ARM异常中断处理流程。这篇文章我们通过代码来详细介绍ARM处理器未定义指令的异常中断处理;当发生未定义指令异常中断时,CPU进入未定义指令模式。可以通过读取CPSR寄存器的值来判定是否真的进入了未定义指令模式。开发板:tiny4412;工具链版本:gcc version 4.5.1 (ctng-1.8.1-FA)主要设置以下几个文件:start.S文件,详细内容如下:.text.global _start_start: b reset /* vector 0x46000000 reset*/ ldr pc, _undefined_instruction
发表于 2020-03-08
【ARM裸板】启动文件与栈的简略分析
unsigned int *)0x56000054; *pGPFCON = 0x100; *pGPFDAT = 0; return 0;}3.问题函数的调用规则ATPCS:ARM-THUMB procedure call standard(ARM-Thumb过程调用标准)参考文章 Arm汇编学习笔记(六)——函数调用栈空间以及fp寄存器3.1 为什么要设置栈?因为C函数所需保存局部变量保存LR等寄存器(返回地址)调用者如何传递参数给被调用者被调用者如何传返回这给调用者怎么从栈中恢复那些寄存器调用者和被调用者通过r0-r3寄存器传递参数和返回值在函数中,r4-r11可能被使用,所以:在入口保存他们,在出口恢复他们高标号寄存器存放在高地
发表于 2020-03-08
【ARM裸板】启动文件与栈的简略分析
【ARM裸板】S3C2440 时钟设置与分析
由时钟树分析,时钟源通过选择器接入给MPLL(Main PLL)与UPLL(USB PLL)经过MPLL得到FCLK提供给CPU[ARM920T]FCLK分别通过HDIVN与PDIVN分频得到HCLK与PCLKHCLK接入给AHB总线,再给各种高速设备(Nand Flash、内存控制器、中断控制器…)PCLK接入给APB总线,再给各种低速设别(I2C、PWM、GPIO、UART…)1.时钟源最大值2.时钟源2.1 两种时钟源1.晶振2.外部引脚时钟输入2.2 选择时钟源通过改变OM[3:2]引脚来选择时钟源JZ2440 OM[3:2]接入GND,则主时钟源与USB时钟源都选择外部晶振3.上电时钟分析复位等待, 等待电源稳定
发表于 2020-03-08
【ARM裸板】S3C2440 时钟设置与分析
【ARM裸板】内存控制器、SDRAM基础与代码重定位
1.CPU如何控制外设?CPU控制相应外设的寄存器,有外设控制器发出特定的波形2.CPU如何选择寄存器?CPU通过内存控制器选择发出地址addr根据地址选择不同的模块CPU内存控制器读写数据3.外设共用地址、数据总线,如何互不干扰?通过片选CS引脚,选择不同的外设4.谁控制片选引脚发出地址addr根据地址发出片选信号CPU内存控制器使能相应的外设由芯片手册得知:当CPU发出地址是0x00000000时 nGCS0为低电平选择(有效)5.CPU如何读写数据的方向?通过外设芯片的读写引脚控制6.CPU不同位宽设备如何连接并读取数据【内存控制器】6.1 连接方式8bit ROM (从A0开始对应连接)16bit ROM (A0不接,从A1
发表于 2020-03-06
【ARM裸板】内存控制器、SDRAM基础与代码重定位
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved