以前做的嵌入式控制代码分析
0赞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液晶显示屏上。
