DSP28335控制12864液晶,读取LCD数据,lcd_read_data程序应该怎么编写

DSP28335控制12864液晶,读取LCD数据,lcd_read_data程序应该怎么编写,第1张

您好,1 首先是接口的预定义

----------------------------------------------

#define LCD_DATA (((volatile Uint16 )0x0070E0)) // GPIOA7-A0对应DB7-DB0

#define RS GpioDataRegsGPBDATbitGPIOB0

#define RW GpioDataRegsGPBDATbitGPIOB1 //别弄错0 1 2

#define EN GpioDataRegsGPBDATbitGPIOB2 // 实际接线要对应

void InitGpio(void)

{

EALLOW;

GpioMuxRegsGPAMUXbitPWM1_GPIOA0 = 0; // 设置为普通GPIO使用

GpioMuxRegsGPADIRbitGPIOA0 = 1; // 设置为输出

GpioMuxRegsGPAMUXbitPWM2_GPIOA1 = 0;

GpioMuxRegsGPADIRbitGPIOA1 = 1;

GpioMuxRegsGPAMUXbitPWM3_GPIOA2 = 0;

GpioMuxRegsGPADIRbitGPIOA2 = 1;

GpioMuxRegsGPAMUXbitPWM4_GPIOA3 = 0;

GpioMuxRegsGPADIRbitGPIOA3 = 1;

GpioMuxRegsGPAMUXbitPWM5_GPIOA4 = 0;

GpioMuxRegsGPADIRbitGPIOA4 = 1;

GpioMuxRegsGPAMUXbitPWM6_GPIOA5 = 0;

GpioMuxRegsGPADIRbitGPIOA5 = 1;

GpioMuxRegsGPAMUXbitT1PWM_GPIOA6 = 0;

GpioMuxRegsGPADIRbitGPIOA6 = 1;

GpioMuxRegsGPAMUXbitT2PWM_GPIOA7 = 0;

GpioMuxRegsGPADIRbitGPIOA7 = 1;

GpioMuxRegsGPBMUXbitPWM7_GPIOB0 = 0;

GpioMuxRegsGPBDIRbitGPIOB0 = 1;

GpioMuxRegsGPBMUXbitPWM8_GPIOB1 = 0;

GpioMuxRegsGPBDIRbitGPIOB1 = 1;

GpioMuxRegsGPBMUXbitPWM9_GPIOB2 = 0;

GpioMuxRegsGPBDIRbitGPIOB2 = 1;

EDIS;

}

----------------------------------------------

一般液晶的控制线是直接对I/O口的位进行 *** 作,数据线是按字进行 *** 作。在这容易出错的是:(1)数据线地址的对应。DSP的GPIO数据地址一般为16位一个地址(F28335有的是32个GPIO一组,给出了一个地址,实际上是有两个地址的,给出的那一个地址是低16位的)。需要注意的是,液晶数据线一般为8位,那么把八位数据送出的时候,实际给的是DSP的16位数据的低八位,所以接线上要接低八位的GPIO;如果接高八位的GPIO,软件上要用下面一行程序进行移位 dat = dat << 8; //左移8位,向高位移动。(2)在进行GPIO初始化和预定义的时候,一般都会复制,但是别忘记改一些0 1 2 3等数,接线上也要一一对应,仔细检查。

2 51程序移植到DSP的时序问题

----------------------------------------------

void Display_Data_All(uchar hz)

{

while(hz != '\0')

{

WriteData12864(hz);

hz++;

delay(20);//2就不够!!!!!!

}

}

----------------------------------------------

由于51单片机的晶振一般为110592MHz,而DSP等控制器的晶振为30MHz,实际执行起来最高有150MHz,而液晶为低速外设,所以移植后可能会不显示,显示乱码等情况。我在调试12864液晶的时候就出现过只显示乱码数字不显示汉字的情况,这不是字库损坏,而是因为写汉字的时间要比写数字的时间长,而程序中延时过短。上面程序中把delay(2)改为delay(20)就解决问题了。

实际上,真正造成影响的是,程序执行过快。它认为显示完一个字之后,又很快进入下一个字的 *** 作;实际上液晶要一定的时间才能写完(见液晶 *** 作时序图),所以写数据的程序中要加长延时。至于RS、RW、EN等控制引脚,延时与否影响不大。

3 240128液晶的调试

240128液晶有busy和int返回信号,实际上不需要接即可。程序中也可以不测忙。。程序中写控制指令两者中间也要加长延时,更不用说写数据之间的延时。

----------------------------------------------

void lcd_regwrite(Uint16 regname,Uint16 regdata) // 写控制指令

{

lcd_regwr(regname);

delay(10); // 加长延时

lcd_regwr(regdata);

}

void lcd_character(uchar cha,int count) // 显示中文或字符

{

int i;

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

{

delay(10); // 加长延时

lcd_datawrite(cha);

++cha;

}

}

您好,您的问题是关于单片机LCD显示屏程序不亮的问题。首先,您需要检查您的硬件连接是否正确,以确保所有连接都得到正确的电源和信号。其次,您需要检查您的程序代码,确保它们正确地控制LCD显示屏,并且您的程序没有任何错误。最后,您可以尝试重新编程,以确保您的程序正确地写入到LCD显示屏中。如果以上措施都没有解决您的问题,您可以尝试更换LCD显示屏,以确保它仍然有效。

配套 24寸LCD屏 ST7789驱动器芯片(24P 320X240)

ST7789驱动器芯片24寸LCD屏(24P 320X240)

主要参数

1 模块名称:液晶显示模块

2 型号:KD024C-4

3 同类型型号: 

4 兼容型号:

5 显示模式:TFT

6 显示色彩:65/262K

7 分辨率: 240320

8 点距:0153 (H) x 0153 (V)

9 视角:12:00

10 控制IC:ST7789V

11 显示类型:全透型,常白

12 外形尺寸:4272602626mm

13 可视面积:38325056 mm

14 点阵区面积:36724896mm

15 亮度:300cd/m2

16 对比度:500

17 接口类型: 8/9/16/18位8080并口

                   16/18位RGB接口

                    3/4线SPI接口

18 引脚数:24

19 引脚距离:05mm

20 连接类型: FPC插接型

21 工作电压:33V

22 背光灯颜色及类型: 白色LED背光

23 背光电路:4 LED 并联, 共阳

If=80mA, Vf =32V

24 使用寿命:100000h

25 工作温度:-20----70°C 

26 储存温度:-30----80°C 

27 质量体系认证:ISO9001:2008

28 产品认证:RoHS

#MicroPython动手做(05)——零基础学MaixPy之LCD液晶屏

#测试程序之一:显示英文

#MicroPython动手做(05)——零基础学MaixPy之LCD液晶屏

#测试程序之一:显示英文

import lcd

lcdinit()

lcddraw_string(100, 100, "hello MicroPython!", lcdRED, lcdBLACK)

lcd 屏幕显示驱动

lcddisplay(image, roi=Auto)

在液晶屏上显示一张 image(GRAYSCALE或RGB565)。

roi 是一个感兴趣区域的矩形元组(x, y, w, h)。若未指定,即为图像矩形

若 roi 宽度小于lcd宽度,则用垂直的黑色边框使 roi 居于屏幕中心(即用黑色填充未占用区域)。

若 roi 宽度大于lcd宽度,则 roi 居于屏幕中心,且不匹配像素不会显示(即液晶屏以窗口形态显示 roi 的中心)。

若 roi 高度小于lcd高度,则用垂直的黑色边框使 roi 居于屏幕中心(即用黑色填充未占用区域)。

若 roi 高度大于lcd高度,则 roi 居于屏幕中心,且不匹配像素不会显示(即液晶屏以窗口形态显示 roi 的中心)。

roi 是键值参数,必须在函数调用中通过写入 roi= 来显式地调用。

#MicroPython动手做(05)——零基础学MaixPy之LCD液晶屏

#测试程序之二:LCD屏显示"hello maixpy"

import lcd, time

import image

bg = (236,36,36)

lcdinit(freq=15000000)

lcddirection(lcdYX_RLDU)

lcdclear(lcdRED)

timesleep(1)

lcddraw_string(120, 120, "hello maixpy", lcdWHITE, lcdRED)

timesleep(2)

img = imageImage()

imgdraw_string(60, 100, "hello maixpy", scale=2)

imgdraw_rectangle((120,120,30,30))

lcddisplay(img)

lcd 屏幕显示驱动函数

1 lcdinit(type=1, freq=15000000, color=lcdBLACK)

初始化 LCD 屏幕显示

参数

type: LCD 的类型(保留给未来使用):

0: None

1: lcd shield(默认值)

type 是键值参数,必须在函数调用中通过写入 type= 来显式地调用

freq: LCD (实际上指 SPI 的通讯速率) 的频率

color: LCD 初始化的颜色, 可以是 16 位的 RGB565 颜色值,比如 0xFFFF; 或者 RGB888 元组, 比如 (236, 36, 36), 默认 lcdBLACK

2 lcdclear()

将液晶屏清空为黑色或者指定的颜色。

参数

color: LCD 初始化的颜色, 可以是 16 位的 RGB565 颜色值,比如 0xFFFF; 或者 RGB888 元组, 比如 (236, 36, 36)

3 lcdfreq(freq)

设置或者获取 LCD (SPI) 的频率

Paremeters

freq: LCD (SPI) 的频率

Return

LCD 的频率

4 lcddirection(dir)

在 v031 之后已经被舍弃, 请使用lcdrotation 和 lcdinvert代替, 如非必要请勿使用, 接口仍会被保留用于调试使用

设置屏幕方向, 以及是否镜像等

参数

dir: 正常情况下推荐 lcdYX_LRUD 和 lcdYX_RLDU, 另外还有其它值,交换 XY 或者 LR 或者 DU即可

#MicroPython动手做(05)——零基础学MaixPy之LCD液晶屏

#实验程序之三:LCD液晶显示器彩条测试

import lcd,image, time

lcdinit(type=1, freq=15000000)

# lcdinit(type=2, freq=20000000)

# lcdinit(type=1, width=320, height=240, invert=True, freq=20000000)

img = imageImage(size=(240,240))

imgdraw_rectangle(0,0,30, 240, fill=True, color=(0xff, 0xff, 0xff))

imgdraw_rectangle(30,0,30, 240, fill=True, color=(250, 232, 25))

imgdraw_rectangle(60,0,30, 240, fill=True, color=(106, 198, 218))

imgdraw_rectangle(90,0,30, 240, fill=True, color=(98, 177, 31))

imgdraw_rectangle(120,0,30, 240, fill=True, color=(180, 82, 155))

imgdraw_rectangle(150,0,30, 240, fill=True, color=(231, 47, 29))

imgdraw_rectangle(180,0,30, 240, fill=True, color=(32, 77, 158))

imgdraw_rectangle(210,0,30, 240, fill=True, color=(27, 28, 32))

lcddisplay(img)

count = 500

while count > 0:

    t = timeticks_ms()

    lcddisplay(img)

    print(timeticks_ms() - t)

    count -= 1

#MicroPython动手做(05)——零基础学MaixPy之LCD液晶屏

#实验程序之四:测试Microphone阵列算法

fromMaiximportMIC_ARRAYasmic

importlcd

lcdinit()

micinit()

whileTrue:

    imga = micget_map()

    b = micget_dir(imga)

a = micset_led(b,(0,0,255))

imgb = imgaresize(160,160)

imgc = imgbto_rainbow(1)

    a = lcddisplay(imgc)

micdeinit()

#MicroPython动手做(05)——零基础学MaixPy之LCD液晶屏

#实验程序之五:图形与hello maixpy

import lcd, time

import image

bg = (236,36,36)

lcdinit(freq=15000000)

lcddirection(lcdYX_RLDU)

img = imageImage()

imgdraw_string(60, 100, "hello maixpy", scale=2)

imgdraw_rectangle((120,120,30,30))

imgdraw_circle((150,140, 80))

imgdraw_cross((250,40))

imgdraw_arrow((250,200,20,200), color=(236,36,36))

lcddisplay(img)

#MicroPython动手做(05)——零基础学MaixPy之LCD液晶屏

#实验程序之六:碰碰球演示

import image, lcd

lcdinit(freq=20000000)

i = 0

dir = 1

while(True):

    img = imageImage(copy_to_fb=1)

    imgclear()

    imgdraw_rectangle(i,50,50,50)

    lcddisplay(img)

    if dir:

        i += 5

        if i==270:

           dir = 0

    else:

        i -= 5

        if i==0:

            dir = 1

#include "Regx52h"

#include "intrinsh"

#define uchar unsigned char //宏定义替换

#define uint unsigned int //宏定义替换

#define ulong unsigned long //宏定义替换

你的DelayMS没有定义

有可能是你函数大小写错了,还有可能是你的delayms,h文件中没有这个函数

这个是1602的程序,每行16个显示单元,第一行地址从0x80~0x80+16,第二行0xc0~0xc0+16,一个字符占一个地址,其它的地址也是有存储单元的,只不过不能显示出来,你向1602发送一条移位指令就看出来了。也不是每个地址都有存储单元,具体不记得了,你试试就知道了。

光看代码你是不能了解它的使用历程的,最好看看使用手册,下面的代码是用1602液晶

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

uchar code table[]="I LIKE MCU!";

uchar code table1[]=">

//使液晶进入休眠其实就是关闭液晶显示,比如1602,发送08这个命令就可以了。

#define LCD1602_FLAG

#define LCD1602_PORT P1

#include<reg52h>

#include<stddefh>

#include"dtypeh"

sbit lcd1602_rs=P3^7;

sbit lcd1602_e=P3^5;

sbit lcd1602_rw=P3^6;

sbit lcd1602_busy=P1^7;

sbit keydis=P3^0;

sbit keyno=P3^1;

/

函数名称:lcd1602_CheckBusy()

函数功能:状态查询

/

void lcd1602_CheckBusy()

{

do

{

lcd1602_busy=1;

lcd1602_rs=0;

lcd1602_rw=1;

lcd1602_e=0;

lcd1602_e=1;

}

while(lcd1602_busy);

}

/

函数名称: lcd1602_WriteCmd()

函数功能:写命令

/

void lcd1602_WriteCmd(const INT8U cmd)

{

lcd1602_CheckBusy();

lcd1602_rs=0;

lcd1602_rw=0;

lcd1602_e=1;

LCD1602_PORT=cmd;

lcd1602_e=0;

}

/

函数名称:lcd1602_WriteData()

函数功能:写数据

/

void lcd1602_WriteData(const INT8U c)

{

lcd1602_CheckBusy();

lcd1602_rs=1;

lcd1602_rw=0;

lcd1602_e=1;

LCD1602_PORT=c;

lcd1602_e=0;

}

/

函数名称:lcd1602_Init()

函数功能:初始化LCD

/

void lcd1602_Init()

{

lcd1602_WriteCmd(0x38); //显示模式为8位2行57点阵

lcd1602_WriteCmd(0x0f); //display enable,flag enable,flash enable,

lcd1602_WriteCmd(0x06); //flag move to right,screen don't move

lcd1602_WriteCmd(0x01); //clear screen

}

/

函数名称:lcd1602_Display()

函数功能: 字符显示

/

void lcd1602_Display(const INT8U ptr)

{

INT8U data i=0;

INT8U data q;

q=ptr;

lcd1602_WriteCmd(0x80);

while(q!=NULL && (q!='\0') && i<16)

{

lcd1602_WriteData(q);

q++;

i++;

}

lcd1602_WriteCmd(0xc0);

while(q!=NULL && (q!='\0') && i>=16 && i<32)

{

lcd1602_WriteData(q);

q++;

i++;

}

}

main()

{

INT8U txt="hello friend!";

lcd1602_Init();

while(1)

{

if(keydis==0)

{

while(keydis==0);

lcd1602_Display(txt); //显示信息

}

if(keyno==0)

{

while(keyno==0);

lcd1602_WriteCmd(0x08); //关闭显示

}

}

}

/

程序名称:带汉字库的12864液晶显示模块驱动

程序功能:显示字符 、汉字和

开发工具:Kile

MCU型号:AT89S52-24PU

时钟频率:110592MHZ

程序作者:yuan

版权说明:yuan

/

#include<reg52h>

#include "lcdh"

#include "utilh"

sbit E=P1^5;//脉冲使能

sbit RW=P1^6;//读写选择

sbit RS=P1^7;//数据命令选择

sbit rst=P3^6;//12864复位

// 延时ms函数:

// 12864检查状态函数:

void Check12864State(void)

{

P0=0xff;

E=0;//读状态前三控制线的状态

RS=0;

RW=1;

E=1;//拉高,读状态

while((P0&0x80)==0x80);//等待空闲

E=0;//写命令后三控制线的状态

RS=1;

RW=0;

}

// 12864写命令函数:

void Write12864Command( unsigned char com)

{

Check12864State();//检查状态

P0=com;//赋值

E=0;//写命令前三控制线的状态

RS=0;

RW=0;

E=1;//拉高,写命令

E=0;//写命令后三控制线的状态

RS=1;

RW=1;

}

//12864写数据函数:

void Write12864Data( unsigned char dat)

{

Check12864State();//检查状态

P0=dat;//赋值

E=0;//写数据前三控制线的状态

RS=1;

RW=0;

E=1;//拉高,写数据

E=0;//写数据后三控制线的状态

RS=0;

RW=1;

}

//在指定的位置显示字符串(汉字和ASCII码字符)函数:

void LCD12864DisplayString( unsigned char y,unsigned char x, unsigned char pstr)

//y-行数值0-3,x-列数值0-7,pstr-字符串指针

//12864可以显示32个汉字(四行每行8个),一个地址对应一个汉字

//可以显示64个ASCII码字符(四行每行16个),一个地址对应两个字符

//为了实现自动换行功能,这个函数比较繁琐

{

unsigned char row,n=0;

Write12864Command(0x30);//基本指令

Write12864Command(0x06);//地址计数器自动加以,光标右移

switch(y)//根据行号选择行地址

{

case 0:row=0x80;break;//第一行首地址

case 1:row=0x90;break;//第二行首地址

case 2:row=0x88;break;//第三行首地址

case 3:row=0x98;break;//第四行首地址

default:;

}

Write12864Command(row+x);//写地址

while(pstr!='\0')

{

Write12864Data(pstr);//写字符

pstr++;

n++;//计数

if((n+x2)==16)//如果一行写完 ,继续写第二行

{

if(y==0) Write12864Command(0x90);//写下一行地址

else if(y==1) Write12864Command(0x88);//写下一行地址

else if(y==2) Write12864Command(0x98);//写下一行地址

else ;

}

else if((n+x2)==32)//如果第二行写完 ,继续写第三行

{

if(y==0) Write12864Command(0x88);//写下一行地址

else if(y==1) Write12864Command(0x98);//写下一行地址

else ;

}

else if((n+x2)==48)//如果第三行写完 ,继续写第四行

{

if(y==0) Write12864Command(0x98);//写下一行地址

else ;

}

else ;

}

}

//模式清屏函数:

void Clear12864Screen()

{

unsigned char i,j;

Write12864Command(0x34);//功能设定:8位控制方式,使用扩充指令

Write12864Command(0x36);//使用扩充指令,绘图显示控制

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

//ST7920可控制25632点阵(32行256列),而12864液晶实际的行地址只有0-31行,

//12864液晶的32-63行的行是0-31行地址从第128列划分一半出来的,所以分为上下两半屏,

//也就是说第0行和第32行同属一行,行地址相同;第1行和第33行同属一行,以此类推

{

Write12864Command(0x80|i);//写行地址(垂直地址)

Write12864Command(0x80);//写列地址(水平地址)

for(j=0;j<32;j++)

Write12864Data(0x00);//清屏

}

}

//在任意位置显示任意大小的函数:

void LCD12864DisplayPictrue(unsigned char y,unsigned char x,

unsigned char px,unsigned char py, unsigned char pp)

//y-起始行(数值0-63),x-起始列(16位宽,数值0-7),

//px-宽度,py-高度,pp-指针指向数组

//因为上下屏的地址不连续,要在任意位置显示完整的图像,处理起来比较繁琐

{

unsigned char i,j,k;

Clear12864Screen();//清屏

if(y<32)//如果起始行在上半屏

{

k=32-y;//算出上半屏的行数

for(i=0;i<k;i++,y++)//上半屏行数

{

Write12864Command(0x80|y);//写行地址(垂直地址)

Write12864Command(0x80|x);//写列地址(水平地址)

for(j=0;j<px/8;j++)

Write12864Data(pp[ipx/8+j]);//写数据

}

y=0;//下半屏起始行,接上半屏继续写数据

for(;i<py;i++,y++)//下半屏剩下的行数

{

Write12864Command(0x80|y);//写行地址(垂直地址)

Write12864Command(0x80|(8+x));//写列地址(水平地址)

for(j=0;j<px/8;j++)

Write12864Data(pp[ipx/8+j]);//写数据

}

}

else //如果起始行在下半屏

{

for(i=0;i<py;i++,y++)//行数

{

Write12864Command(0x80|(y-32));//写行地址(垂直地址)

Write12864Command(0x80|(8+x));//写列地址(水平地址)

for(j=0;j<px/8;j++)

Write12864Data(pp[ipx/8+j]);//写数据

}

}

}

void Clear12864Text()

{

Write12864Command(0x34);//清屏

DelayMs(5);

Write12864Command(0x30);//清屏

DelayMs(5);

Write12864Command(0x01);//清屏

DelayMs(5);

}

//12864初始化函数:

void Initialize12864()

{

rst=0;//复位12864

DelayMs(30);

rst=1;

DelayMs(20);

Write12864Command(0x30);//功能设定:8位控制方式,使用基本指令

Write12864Command(0x08);//显示关

Write12864Command(0x01);//清屏

Write12864Command(0x06);//地址计数器加一、光标右移

Write12864Command(0x0c);//显示开

}

带字库的驱动

以上就是关于DSP28335控制12864液晶,读取LCD数据,lcd_read_data程序应该怎么编写全部的内容,包括:DSP28335控制12864液晶,读取LCD数据,lcd_read_data程序应该怎么编写、单片机lcd显示屏程序不亮、【雕爷学编程】MicroPython动手做(05)——零基础学MaixPy之LCD液晶屏等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9501945.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存