wuyouwuyou

以前做的嵌入式控制代码分析

0
阅读(2117)

void displayDemo(){

    uint8 i,j,ii;

    uint8 len;

    uint8 data_buf[]="Hello World";

    lcd();

    PINSEL0 = 0x00000000;           /* 设置管脚连接GPIO         */

    PINSEL1 = 0x00000000;

    PINSEL2 = 0x00000000;

    IRQEnable();                       /* 打开中断       */

    I2cInit(400000);                   /* I2C初始化,400K   */

    len=strlen(data_buf);

    I2C_WriteNByte(CAT24C16, ONE_BYTE_SUBA, 0x00, data_buf, len);

    DelayNS(1000);   

    /* 清零数据缓冲区,防止出错*/

    for (i=0; i<19; i++)

       data_buf[i] = 0;

    /* 读回刚才写入的数据*/

    I2C_ReadNByte(CAT24C16, ONE_BYTE_SUBA, 0x00, data_buf,len);

    /* 判断读回的数据是否正确*/

    UART0Init();

    j=0;

    while( data_buf[j]!='\0')

    {

           UART0WriteChar(data_buf[j]);

           j++;

    }

    WriteCmd(0x01);       //清除显示,并且设定地址指针为00H

   delay(5);

    PrintStr(0,4,data_buf);

}

显示程序将所编写的固件函数整合在了一块,通过一个程序演示出来。这个程序用到的变量有计数器i,j,要发送的字符串data_buf和data_buf的长度len;程序首先通过LCD展示一个欢迎的图片,接着是毕业设计作者及指导老师等信息,然后程序开始进行管脚的设定,在这里为了方便起见,管脚全部都先设为GPIO状态,而要使用管脚其他的功能时,如I2C功能时,在void I2cInit(uint32 Fi2c)初始化函数里就已经进行了管脚I2C功能的设定,并且不影响其他管脚的正常使用;当然还有其他的包括一些时钟和中断的设定。这样用户就不用再翻找器件资料,直接使用相应的初始化函数就可以了。接着就是开中断,并初始化I2C,I2C时钟为400K,程序首先得到字符串data_buf的长度,然后调用I2C提供的函数uint8 I2C_WriteNByte(uint8 sla, uint8 suba_type, uint32 suba, uint8 *s, uint32 num); uint8 sla是器件的从地址,设计的开发板上使用的是24C16的E2PROM芯片,只能接一个24C16芯片,所以这里sla只能写为0xA0;uint8 suba_type是子地址的结构,1表示单字节地址,2表示是双字节地址;uint32 suba是器件内部的子地址,也可以说是内部的存储器地址;uint8 *s是将要写入的数据的指针;uint8 num是将要写入的数据的个数。通过I2C_WriteNByte函数将字符串“Hello World”写到E2PROM芯片中。接着延时,这点延时很重要,因为注意flash的读取写入速度比较慢,这里要多延时一段时间。然后立即将data_buf中的数据清零,后面在用uint8 I2C_ReadNByte (uint8 sla, uint32 suba_type, uint32 suba, uint8 *s, uint32 num);函数将写在E2PROM芯片中的数据读取出来,这里函数的参数与I2C_WriteNByte函数里的参数一样。

将E2PROM芯片中的数据读到data_buf后,通过串口将数据显示到电脑上,要使用串口,就像使用I2C一样,必须先调用串口初始化函数进行初始化,串口初始化函数也只改变与串口功能相关的管脚的功能,对其他的管脚并不影响,所以最大限度的保证了各个功能模块的相互独立性。接着将数据同样显示在LCD液晶显示屏上,由于这是LCD液晶显示屏上还有上次显示的内容,所以要先清除显示,然后在讲字符串写入到LCD液晶显示屏上。