Main函数之Port_Init分析

这个函数的功能,将I/O口初始化,就是配置管脚的功能,因为有很多管脚是 复用 的引脚。
相应的管脚的寄存器,都在2440adr.h中定义了
#define rGPACON    (*(volatile unsigned *)0x56000000)
分析一下:volatile表示易挥发性,表示这个值容易改变(不是很懂),0x56000000就是GPACON寄存器的地址(volatile unsigned *) 表示强制转换,将0x56000000转换为指针类型,指针的内容就是这个地址
最外边的 * 表示取出指针所指向的这个地址的内容。就是取出GPACON寄存器中的内容。

查看datasheet知,当I/O口设置为input、output时,GPBDAT的值设置才有意义,就是说,I/O输出的值,为相应的在GPBDAT中设置的值。
GPBUP上拉电阻,简单的说上拉电阻在I/O口高电平的时候可以加强驱动能力,下拉电阻一般是使开机的时候管脚低电平。这个目前,我不是很懂。只要知道他的作用就行了。有份总结,感兴趣的可以看看http://hi.baidu.com/hybespecial/blog/item/a909223fc0511be53c6d97ac.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你需要添加一个LCD1602显示屏,然后连接到微控制器上,并且需要一个LCD1602的驱动程序。以下是一个简单的LCD1602驱动程序示例: ``` sbit RS = P2^0; sbit RW = P2^1; sbit EN = P2^2; sbit LCD_D4 = P0^4; sbit LCD_D5 = P0^5; sbit LCD_D6 = P0^6; sbit LCD_D7 = P0^7; void delay_ms(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) { for (j = 0; j < 120; j++); } } void LCD_WriteCommand(unsigned char cmd) { RS = 0; RW = 0; LCD_D7 = cmd & 0x80; LCD_D6 = cmd & 0x40; LCD_D5 = cmd & 0x20; LCD_D4 = cmd & 0x10; EN = 1; delay_ms(1); EN = 0; delay_ms(1); LCD_D7 = cmd & 0x08; LCD_D6 = cmd & 0x04; LCD_D5 = cmd & 0x02; LCD_D4 = cmd & 0x01; EN = 1; delay_ms(1); EN = 0; delay_ms(1); } void LCD_WriteData(unsigned char dat) { RS = 1; RW = 0; LCD_D7 = dat & 0x80; LCD_D6 = dat & 0x40; LCD_D5 = dat & 0x20; LCD_D4 = dat & 0x10; EN = 1; delay_ms(1); EN = 0; delay_ms(1); LCD_D7 = dat & 0x08; LCD_D6 = dat & 0x04; LCD_D5 = dat & 0x02; LCD_D4 = dat & 0x01; EN = 1; delay_ms(1); EN = 0; delay_ms(1); } void LCD_Init() { LCD_WriteCommand(0x28); // 16×2显示,5×7点阵,4位数据接口 LCD_WriteCommand(0x0C); // 开启显示,不显示光标,不闪烁 LCD_WriteCommand(0x06); // 光标移动时不要移动屏幕 LCD_WriteCommand(0x01); // 清屏 } void LCD_DisplayString(unsigned char x, unsigned char y, unsigned char *s) { unsigned char i = 0; if (x < 16) { x |= 0x80; switch (y) { case 0: i = 0; break; case 1: i = 0x40; break; case 2: i = 0x10; break; case 3: i = 0x50; break; } i += x; LCD_WriteCommand(i); } while (*s) { LCD_WriteData(*s++); } } void main() { Port_Init(); Uart1_Init(); LCD_Init(); Uart1String("hello1\n"); while (1) { parseGpsBuffer(); printGpsBuffer(); // 在LCD1602显示经纬度 LCD_DisplayString(0, 0, "Lat: "); // 在第一行显示Lat: LCD_DisplayString(5, 0, Latitude); // 在第一行显示经度 LCD_DisplayString(0, 1, "Lon: "); // 在第二行显示Lon: LCD_DisplayString(5, 1, Longitude);// 在第二行显示纬度 } } ``` 这样,当你运行程序时,LCD1602将显示经纬度。注意,在代码中的parseGpsBuffer()和printGpsBuffer()函数中,需要将经纬度分别存储在变量Latitude和Longitude中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值