打印
[其它应用]

不起作用

[复制链接]
777|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
songqian17|  楼主 | 2023-2-3 23:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机学习板上用的是16个管脚的12864,按照20个管脚的datasheet写了一段程序,但12864不起作用,是程序写的不对,还是datasheet不对,找不到16个管脚的datasheet,以下是我写的程序:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code dis1[]={"welcome"};
uchar code dis2[]={"2016-08-11"};

sbit lcde=P2^7;     // 使能,下降沿写数据,为1的时候读数据
sbit rd=P2^6;     //rd=0 指令,rd=1 数据
sbit wr=P2^5;     //wr=0 往lcd写,wr=1 读lcd
uchar busy,j;

void delay(uchar z)
{
    uchar x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}

void write_com(uchar com)
{
    rd=0;
    wr=0;
    lcde=0;
    delay(10);
    P0=com;
    delay(10);
    lcde=1;
    delay(10);
    lcde=0;
    delay(10);
}

void write_date(uchar date)
{
    rd=1;
    wr=0;
    lcde=0;
    delay(10);
    P0=date;
    delay(10);
    lcde=1;
    delay(10);
    lcde=0;
    delay(10);
}

uchar lcd_busy()
{
    uchar busy;
    rd=0;
    wr=1;
    lcde=1;
    delay(1);
    lcde=0;
    busy=P0&0x80;  //P0.7为BF位,得到BF位
    return busy;
}

void init()
{
//    delay(10);
//    write_com(0x38);     //数据总线为8位,显示2行
    delay(10);
    write_com(0x0c);    //显示功能开,无光标,不闪烁
    delay(10);
    write_com(0x06);    //写入后光标右移,屏幕不动
    delay(10);
    write_com(0x01);    //清屏
    delay(10);

}

void lcd_disp_pos(uchar x,y)    //显示位置函数
{
    uchar address;
    switch(x)
    {
        case 1:address=0x80+y;
            break;
        case 2:address=0x90+y;
            break;
        case 3:address=0x88+y;
            break;
        case 4:address=0x98+y;
            break;
    }
    delay(5);
    write_com(address);
}

void main()
{
    init();
    delay(10);
    lcd_disp_pos(1,2);
    j=0;
    while(dis1[j]!='\0')
    {
        delay(10);
        write_date(dis1[j]);
        j++;
    }
   
    lcd_disp_pos(2,2);
    j=0;
    while(dis2[j]!='\0')
    {
        delay(10);
        write_date(dis2[j]);
        j++;
    }
}

使用特权

评论回复
沙发
dengdc| | 2023-2-3 23:28 | 只看该作者

/*******************************************************************************
* 函 数 名         : LCD12864_WriteCmd
* 函数功能                   : 写入一个命令到12864
* 输    入         : cmd
* 输    出         : 无
*******************************************************************************/

void LcdSt7565_WriteCmd(cmd)
{
        LCD12864_CS = 0;           //chip select,打开片选
        LCD12864_RD = 1;           //disable read,读失能        
        LCD12864_RS = 0;       //select command,选择命令
        LCD12864_RW = 0;       //select write,选择写模式
        _nop_();
        _nop_();

        DATA_PORT = cmd; //put command,放置命令
        _nop_();
        _nop_();

        LCD12864_RW = 1;           //command writing ,写入命令
}

/*******************************************************************************
* 函 数 名         : LcdSt7565_WriteData
* 函数功能                   : 写入一个数据到12864
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/

void LcdSt7565_WriteData(dat)
{        
        LCD12864_CS = 0;           //chip select,打开片选
        LCD12864_RD = 1;           //disable read,读失能        
        LCD12864_RS = 1;       //select data,选择数据
        LCD12864_RW = 0;       //select write,选择写模式
        _nop_();
        _nop_();

        DATA_PORT = dat;       //put data,放置数据
        _nop_();
        _nop_();

        LCD12864_RW = 1;           //data writing,写数据
}
/*******************************************************************************
* 函 数 名         : LCD12864_Init
* 函数功能                   : 初始化12864
* 输    入         : 无
* 输    出         : 无
* 说    明         : LCD12864的命令指令可以查看例程文件夹下的《ST7565p数据手册》
*                  * 的第51页的位置。
*******************************************************************************/

void Lcd12864_Init()
{
        uchar i;
        LCD12864_RSET = 0;
        for (i=0; i<100; i++);
        LCD12864_CS = 0;
        LCD12864_RSET = 1;
        
        //----------------Star Initial Sequence-------//
        //------程序初始化设置,具体命令可以看文件夹下---//

        //--软件初始化--//
        LcdSt7565_WriteCmd(0xE2);  //reset
        for (i=0; i<100; i++);           //延时一下

        //--表格第8个命令,0xA0段(左右)方向选择正常方向(0xA1为反方向)--//
        LcdSt7565_WriteCmd(0xA1);  //ADC select segment direction
        
        //--表格第15个命令,0xC8普通(上下)方向选择选择反向,0xC0为正常方向--//
        LcdSt7565_WriteCmd(0xC8);  //Common direction
                          
        //--表格第9个命令,0xA6为设置字体为黑色,背景为白色---//
        //--0xA7为设置字体为白色,背景为黑色---//
        LcdSt7565_WriteCmd(0xA6);  //reverse display

        //--表格第10个命令,0xA4像素正常显示,0xA5像素全开--//
        LcdSt7565_WriteCmd(0xA4);  //normal display
        
        //--表格第11个命令,0xA3偏压为1/7,0xA2偏压为1/9--//
        LcdSt7565_WriteCmd(0xA2);  //bias set 1/9
        
        //--表格第19个命令,这个是个双字节的命令,0xF800选择增压为4X;--//
        //--0xF801,选择增压为5X,其实效果差不多--//        
        LcdSt7565_WriteCmd(0xF8);  //Boost ratio set
        LcdSt7565_WriteCmd(0x01);  //x4
        
        //--表格第18个命令,这个是个双字节命令,高字节为0X81,低字节可以--//
        //--选择从0x00到0X3F。用来设置背景光对比度。---/
        LcdSt7565_WriteCmd(0x81);  //V0 a set
        LcdSt7565_WriteCmd(0x23);

        //--表格第17个命令,选择调节电阻率--//
        LcdSt7565_WriteCmd(0x25);  //Ra/Rb set
        
        //--表格第16个命令,电源设置。--//
        LcdSt7565_WriteCmd(0x2F);
        for (i=0; i<100; i++);

        //--表格第2个命令,设置显示开始位置--//
        LcdSt7565_WriteCmd(0x40);  //start line

        //--表格第1个命令,开启显示--//
        LcdSt7565_WriteCmd(0xAF);  // display on
        for (i=0; i<100; i++);

}

使用特权

评论回复
板凳
liliang9554| | 2023-2-3 23:30 | 只看该作者

#ifndef __ST7565_H
#define __ST7565_H

#include<reg51.h>
#include<intrins.h>

//---包含字库头文件
//#define CHAR_CODE


//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned int
#endif

//--定时使用的IO口--//
#define DATA_PORT P0
sbit LCD12864_CS   = P3^2;
sbit LCD12864_RSET = P3^3;
sbit LCD12864_RS   = P2^6;
sbit LCD12864_RW   = P2^7;
sbit LCD12864_RD   = P2^5;

//--定义全局函数--//
void LcdSt7565_WriteCmd(cmd);
void LcdSt7565_WriteData(dat);
void Lcd12864_Init();
void Lcd12864_ClearScreen(void);
uchar Lcd12864_Write16CnCHAR(uchar x, uchar y, uchar *cn);

#endif

使用特权

评论回复
地板
jlyuan| | 2023-2-3 23:31 | 只看该作者
没显示程序吧?也没12864的初始化程序

使用特权

评论回复
5
happy_10| | 2023-2-3 23:38 | 只看该作者
我记得普通板子上的12864就是这种的。

使用特权

评论回复
6
xxrs| | 2023-2-3 23:39 | 只看该作者
你的串口并口模式选择了吗?

使用特权

评论回复
7
yszong| | 2023-2-3 23:41 | 只看该作者
我现在用的就是 中颖的板子 给的就是这种16PIN

使用特权

评论回复
8
tpgf| | 2023-3-1 15:48 | 只看该作者
我没看太明白 楼主说的是这是两种不同封装的芯片是吗

使用特权

评论回复
9
nawu| | 2023-3-1 16:07 | 只看该作者
是不是16脚的和20脚的引脚定义不同 所以出现错误了啊

使用特权

评论回复
10
aoyi| | 2023-3-1 16:17 | 只看该作者
其实就是简单的串口发送数据 看看相应的初始化和硬件连接是否相符呢

使用特权

评论回复
11
zljiu| | 2023-3-1 16:34 | 只看该作者
楼主在程序开始有一个初始化函数 那个函数是初始化哪部分的啊

使用特权

评论回复
12
gwsan| | 2023-3-1 16:46 | 只看该作者
没有相应引脚的设置代码啊   时钟也没有吧

使用特权

评论回复
13
tfqi| | 2023-3-1 16:58 | 只看该作者
可以用示波器看一下啊  是不是总线上有波形呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

463

主题

5749

帖子

1

粉丝