12864 串口显示,无法显示。

2019-07-15 11:41发布

求看下程序,12864串口传输,其他脚位没错,只接lcd的SCLK,CS,SID这三个脚。网上程序也对比过好多了,不知道程序哪里出错了,求指导。


#include <STC15F2K60S2.H>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

/***********lcd 引脚定义*******************/
sbit SID  = P1^5;                                        //串行数据线
sbit SCLK = P3^4;                                //时钟线
sbit CS   = P1^3;                                        //片选
sbit LED  = P5^5;
/*****************************************/


void delay_ms(unsigned int ms)
{
        unsigned int  i,j;
        for(i=0;i<ms;i++)
                for(j=0;j<110;j++)
                        ;
}



/*串行发送一个字节*/
void send_byte(uchar byte)
{
        uchar i;
       
        for(i=0;i<8;i++)
        {
                SCLK  = 0;                        //上升沿触发
                if((byte << i) & 0x80)
                        SID = 1;
                else
                        SID = 0;
               
                SCLK  = 1;
                _nop_();
               
        }
}

/*写指令*/
void write_com(uchar com)
{
        delay_ms(3);                        //该用检测忙
       
        send_byte(0xf8);                //1111 1000 MCU到LCD
        delay_ms(3);                       
       
        send_byte(com & 0xf0);                        //发送高字节
        delay_ms(3);                       
        send_byte((com << 4) & 0xf0);
        delay_ms(5);
}
/*写数据*/
void write_data(uchar data1)
{
        delay_ms(3);                        //该用检测忙
       
        send_byte(0xfa);                                //1111 1010  显示数据
        delay_ms(3);                       
        send_byte(data1 & 0xf0);
        delay_ms(3);                       
        send_byte((data1 << 4) & 0xf0);
        delay_ms(5);
}
void lcd_init()
{
       
       
        delay_ms(200); //启动等待
       
        write_com(0x30);                //基本指令集   一次传8位
        write_com(0x01);                //清除显示DDRAM
        write_com(0x02);                //地址归0
        delay_ms(50);
       
        write_com(0x0c);                //显示状态开关 开显示,显示光标,显示位反白闪动
        write_com(0x80);                //显示地址设为第一行首位
        delay_ms(50);
       
       
       
}

void chinese_display(uchar line,uchar row,uchar data_h,uchar data_l)
{
        write_com(0x01);
        switch(line)
        {
                case 1:
                        {
                                write_com(0x80+row);
                                write_data(data_h);
                                write_data(data_l);
                                break;
                        }
                case 2:
                        {
                                write_com(0x90+row);
                                write_data(data_h);
                                write_data(data_l);
                                break;
                        }
                case 3:
                        {
                                write_com(0x88+row);
                                write_data(data_h);
                                write_data(data_l);
                                break;
                        }
                case 4:
                        {
                                write_com(0x98+row);
                                write_data(data_h);
                                write_data(data_l);
                                break;
                        }
        }
}

void num_display(uchar line,uchar row,uchar num)
{
        write_com(0x01);
        switch(line)
        {
                case 1:
                        {
                                write_com(0x80+row);
                                write_data(0x30+num);
                                break;
                        }
                case 2:
                        {
                                write_com(0x90+row);
                                write_data(0x30+num);
                                break;
                        }
                case 3:
                        {
                                write_com(0x88+row);
                                write_data(0x30+num);
                                break;
                        }
                case 4:
                        {
                                write_com(0x98+row);
                                write_data(0x30+num);
                                break;
                        }
        }
}
void main()
{
       
        lcd_init();
        LED = 0;
       
        delay_ms(100);

        num_display(1,1,3);
        delay_ms(200);
       
                       
}


这是接法 这是接法
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
hobbye501
1楼-- · 2019-07-15 15:58
 精彩回答 2  元偷偷看……
小可乐cc
2楼-- · 2019-07-15 19:46
hobbye501 发表于 2017-3-13 16:01
大概看了一下 程序没啥问题 可能是管教或者是时序没处理好吧 你可以再调试一下试试,我这里有参考你可以看看

找到问题了,给的原理图有问题,里边的SID标号朋友他写错了,导致数据一直没办法传过去。
qingchi1020
3楼-- · 2019-07-15 20:28
12864vo口不能悬空吧,得接调节电阻
尼尔
4楼-- · 2019-07-16 01:35
人家那是串口显示,你的是并口,OK

一周热门 更多>