DSP28335LCD1602实时显示代码
时间: 2024-05-06 22:18:04 浏览: 18
下面是一个简单的DSP28335和LCD1602实时显示代码的例子:
```c
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
// LCD1602相关宏定义
#define E 0x80
#define RS 0x81
#define DATA 0x82
// 函数声明
void initLCD1602();
void sendCommand(unsigned char cmd);
void sendData(unsigned char data);
void delay_us(unsigned long us);
void delay_ms(unsigned long ms);
void lcdPrint(char *str);
void lcdPrintNum(unsigned int num);
// 主函数
void main(void)
{
InitSysCtrl();
// 初始化LCD1602
initLCD1602();
// 实时显示计数器数值
unsigned int cnt = 0;
while(1)
{
// 清屏
sendCommand(0x01);
// 显示计数器数值
lcdPrint("Count: ");
lcdPrintNum(cnt);
// 计数器自增
cnt++;
// 延时一段时间
delay_ms(1000);
}
}
// 初始化LCD1602
void initLCD1602()
{
// 延时等待LCD1602上电稳定
delay_ms(15);
// 4位数据线、2行显示、5x7点阵
sendCommand(0x28);
// 显示开、光标关、闪烁关
sendCommand(0x0C);
// 光标移动、不移动整体、左对齐
sendCommand(0x06);
// 清屏
sendCommand(0x01);
// 光标复位、数据指针复位
sendCommand(0x02);
}
// 发送指令
void sendCommand(unsigned char cmd)
{
// 设置RS为0,表示发送指令
GpioDataRegs.GPASET.bit.GPIO20 = 1;
GpioDataRegs.GPASET.bit.GPIO21 = 0;
// 发送高四位
GpioDataRegs.GPBDAT.all = (GpioDataRegs.GPBDAT.all & 0x00FF) | ((cmd >> 4) << 8);
GpioDataRegs.GPASET.bit.GPIO22 = 1;
delay_us(1);
GpioDataRegs.GPASET.bit.GPIO23 = 1;
delay_us(1);
GpioDataRegs.GPASET.bit.GPIO22 = 0;
GpioDataRegs.GPASET.bit.GPIO23 = 0;
// 发送低四位
GpioDataRegs.GPBDAT.all = (GpioDataRegs.GPBDAT.all & 0x00FF) | ((cmd & 0x0F) << 8);
GpioDataRegs.GPASET.bit.GPIO22 = 1;
delay_us(1);
GpioDataRegs.GPASET.bit.GPIO23 = 1;
delay_us(1);
GpioDataRegs.GPASET.bit.GPIO22 = 0;
GpioDataRegs.GPASET.bit.GPIO23 = 0;
// 延时等待指令执行完成
delay_us(50);
}
// 发送数据
void sendData(unsigned char data)
{
// 设置RS为1,表示发送数据
GpioDataRegs.GPASET.bit.GPIO20 = 1;
GpioDataRegs.GPASET.bit.GPIO21 = 0;
// 发送高四位
GpioDataRegs.GPBDAT.all = (GpioDataRegs.GPBDAT.all & 0x00FF) | ((data >> 4) << 8);
GpioDataRegs.GPASET.bit.GPIO22 = 1;
delay_us(1);
GpioDataRegs.GPASET.bit.GPIO23 = 1;
delay_us(1);
GpioDataRegs.GPASET.bit.GPIO22 = 0;
GpioDataRegs.GPASET.bit.GPIO23 = 0;
// 发送低四位
GpioDataRegs.GPBDAT.all = (GpioDataRegs.GPBDAT.all & 0x00FF) | ((data & 0x0F) << 8);
GpioDataRegs.GPASET.bit.GPIO22 = 1;
delay_us(1);
GpioDataRegs.GPASET.bit.GPIO23 = 1;
delay_us(1);
GpioDataRegs.GPASET.bit.GPIO22 = 0;
GpioDataRegs.GPASET.bit.GPIO23 = 0;
// 延时等待指令执行完成
delay_us(50);
}
// 微秒级延时函数
void delay_us(unsigned long us)
{
unsigned long i;
for(i=0; i<us*6; i++);
}
// 毫秒级延时函数
void delay_ms(unsigned long ms)
{
unsigned long i;
for(i=0; i<ms*6000; i++);
}
// 在LCD1602上打印字符串
void lcdPrint(char *str)
{
while(*str != '\0')
{
sendData(*str);
str++;
}
}
// 在LCD1602上打印数字
void lcdPrintNum(unsigned int num)
{
unsigned char buf[10];
unsigned char i = 0;
if(num == 0)
{
sendData('0');
return;
}
while(num > 0)
{
buf[i] = num % 10;
num /= 10;
i++;
}
for(i--; i>=0; i--)
{
sendData(buf[i] + '0');
}
}
```
上述代码使用了GPIO模拟SPI接口来与LCD1602通信,需要将LCD1602的E、RS、D4~D7引脚与DSP28335的GPIO口相连接。在主函数中,我们实时显示了一个计数器的数值,并使用LCD1602进行显示。延时函数使用了简单粗暴的循环计数方式,可能存在一定误差,实际应用中可以使用更加精确的定时器方式来实现。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![h](https://img-home.csdnimg.cn/images/20210720083646.png)