关于串口12864液晶屏

2019-03-24 18:00发布

求助一下串口12864的读操作怎么弄? 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
在学习的路上
1楼-- · 2019-03-24 23:41
坛里有好多资料的,你自己搜一下就出来很多的
人民币的幻想
2楼-- · 2019-03-25 03:52
 精彩回答 2  元偷偷看……
人民币的幻想
3楼-- · 2019-03-25 06:17
#include "12864.h"
#include "delay.h"
#include <string.h>
#include <intrins.h>
//uint8_t  Lcd_Con_X_Y[4][2]={{0x80,0x80},{0x80,0x90},{0x88,0x80},{0x88,0x90}};        //LCD行反白显示坐标
/******************************************************************************
*****************************基本指令集***************************************
*清显示:0x01
*地址归位:0x02 0x03
*
*/
/*****************************************************************************/
//初始化LCM
void LCD_Init(bit Mode)
{
        LCD_RST=1;                      //RST低电平有效
        LCD_PSB=Mode;                                                //PSB=0串行模式 PSB=1并行模式
        LCM_SWriteDatOrCom (0,0x30);                //30---基本指令动作
        LCM_SWriteDatOrCom (0,0x01);                //清屏,地址指针指向00H
    delay_us(100);
        LCM_SWriteDatOrCom (0,0x06);                //光标的移动方向
        LCM_SWriteDatOrCom(0,0x0c);                //开显示,关游标
        LCD_BL=0;
}
//写指令或数据  (0,指令) (1,数据)串行时序
void LCM_SWriteDatOrCom(bit dat_comm,uint8_t content)
{
        uint8_t a,i,j;
    delay_us(50);
        a=content;
        LCD_RS=1;
        LCD_EN=0;
        LCD_RW=1;
        for(i=0;i<5;i++)
        {
                LCD_EN=1;
                LCD_EN=0;
        }
        LCD_RW=0;
        LCD_EN=1;
        LCD_EN=0;
        if(dat_comm)
                LCD_RW=1;                        //data
        else
                LCD_RW=0;                        //command
        LCD_EN=1;
        LCD_EN=0;
        LCD_RW=0;
        LCD_EN=1;
        LCD_EN=0;
        for(j=0;j<2;j++)
        {
                for(i=0;i<4;i++)
                {
                        a=a<<1;
                        LCD_RW=CY;
                        LCD_EN=1;
                        LCD_EN=0;
                }
                LCD_RW=0;
                for(i=0;i<4;i++)
                {
                        LCD_EN=1;
                        LCD_EN=0;
                }
        }
}
/*********************************************************/
/*                                                       */
/* 设定显示位置                                          */
/*                                                       */
/*********************************************************/
void LCD_Pos(uint8_t X,uint8_t Y)
{                          
   uint8_t  pos;
   if (X==1)
     {X=0x80;}
   else if (X==2)
     {X=0x90;}
   else if (X==3)
     {X=0x88;}
   else if (X==4)
     {X=0x98;}
   pos = X+Y ;

   LCM_SWriteDatOrCom(0,pos);     //显示地址
}
/*****************************************************************************/
void chn_disp (uint8_t code *chn)
{
        uint8_t i,j;
        LCM_SWriteDatOrCom  (0,0x30);
        LCM_SWriteDatOrCom  (0,0x80);
        for (j=0;j<4;j++)                         //4行
        {
                for (i=0;i<16;i++)                 //16列
                LCM_SWriteDatOrCom  (1,chn[j*16+i]);
        }
}
/*****************************************************************************/
//清屏函数
void LCD_Clr(void)
{
        LCM_SWriteDatOrCom (0,0x30);
        LCM_SWriteDatOrCom (0,0x01);
    delay_us(180);
}
/*****************************************************************************/
//向LCM发送一个字符串,长度64字符之内。
//应用:LCM_WriteString("您好!");
void LCM_WriteString(unsigned char *str)
{
        while(*str != '')
       {
                LCM_SWriteDatOrCom(1,*str++);
        }
        *str = 0;
}
////任意行反白/取消反白
//void con_disp (uint8_t _line,uint8_t enable)
// {
//   uint8_t i,j;
//   for(j=0;j<16;j++)                                        //每个中文字符占16个点
//  {
//     for(i=0;i<8;i++)                                   //8个中文字符宽度,即LCD的一行
//     {
//               LCM_SWriteDatOrCom(0,0x36);                        //扩充指令集
//               LCM_SWriteDatOrCom(0,Lcd_Con_X_Y[_line][1]+j);
//               LCM_SWriteDatOrCom(0,Lcd_Con_X_Y[_line][0]+i);
//               LCM_SWriteDatOrCom(0,0x30);
//                 if(enable==1)                                 //使能指定行反白
//                 {
//                       LCM_SWriteDatOrCom(1,0xff);
//                       LCM_SWriteDatOrCom(1,0xff);
//                 }
//                 else                                                 //还原指定反白行
//                 {
//                       LCM_SWriteDatOrCom(1,0x00);
//                       LCM_SWriteDatOrCom(1,0x00);
//                 }
//     }
//   }
//           LCM_SWriteDatOrCom(0,0x36);
//           LCM_SWriteDatOrCom(0,0x30);                          
// }
//void con_disp(uint8_t data1,uint8_t data2,uint8_t x0,uint8_t y0,uint8_t xl,uint8_t yl)
// {
//    u i,j;
//    for(j=0;j<yl;j++)
//    {
//      for(i=0;i<xl;i++)
//      {
//        LCM_SWriteDatOrCom(comm,0x34);//0x34
//        LCM_SWriteDatOrCom(comm,y0+j);
//        LCM_SWriteDatOrCom(comm,x0+i);
//        LCM_SWriteDatOrCom(comm,0x30);//0x30
//        LCM_SWriteDatOrCom(dat,data1);
//        LCM_SWriteDatOrCom(dat,data2);
//      }
//    }
//    LCM_SWriteDatOrCom(comm,0x36);//0x36
// }






#ifndef  __12864_H

#define  __12864_H

#include "reg52.h"

#include "integer.h"

#define delayNOP();  {_nop_();_nop_();_nop_();_nop_();};

/*****************************************************************************/

sbit LCD_PSB  = P1^3;                                //H=并口; L=串口;

sbit LCD_RST  = P3^6;                                //Reset Signal 低电平有效

sbit LCD_RS   = P1^0;                                //RS=1数据 RS=0命令 串行片选CS

sbit LCD_RW   = P1^1;                                //RW=1读取 RW=0写入        串行数据SID

sbit LCD_EN   = P1^2;                                        //使能信号      串行同步时钟CLK

sbit LCD_BL   =        P3^7;

sbit ACC0     = ACC^0;

sbit ACC7     = ACC^7;

/*****************************************************************************/

//函数声明

void LCM_WriteString(unsigned char *str) ;        //写字符  例:LCM_WriteString("您好!");

void LCM_SWriteDatOrCom(bit ,uint8_t );        //(0,指令) (1,数据)

void LCD_Init(bit Mode);

void LCD_Clr(void);                                //清屏

void chn_disp (uint8_t code *chn);

void LCD_Pos(uint8_t X,uint8_t Y);

//void con_disp (uint8_t _line,uint8_t enable);

/*****************************************************************************/

#endif


d907814868
4楼-- · 2019-03-25 10:00
人民币的幻想 发表于 2015-5-9 09:35
#include "12864.h"
#include "delay.h"
//#include "lcd_table.h"
/*************************************************************************************
需要实现
从数据线读数据函数(拼凑)
向数据线写数据函数(拼凑)
写命令/数据函数
点亮任意位置一个点
2015年4月14日完成
2015年4月17日修改
更换方法实现画点函数
实现一个[32][32]RAM缓冲区
格式如下
//[0]0 1 2 3 ... 31(字节)       
//[1]0 1 2 3 ... 31(字节)
//[2]0 1 2 3 ... 31(字节)       
//[3]0 1 2 3 ... 31(字节)       


将此缓冲区直接更新到GDRAM中即可
*************************************************************************************/
/*************************************************************************************
  LCD12864
  LCD_RS     PB1
  LCD_RW     PE3
  LCD_EN     PE4
  LCD_PSB    PE5
  LCD_RST    接到板子RST上
  LCD_D0     PE6
  LCD_D1     PF6
  LCD_D2     PF11
  LCD_D3     PG6
  LCD_D4     PG7
  LCD_D5     PG8
  LCD_D6     PG12
  LCD_D7     PG15
  LCD_BL     PB0
************************************************************************************/
uint8_t xdata LCD_GRAM[32][32];
//数据格式
//D7 D6 D5 D4 D3 D2 D1 D0
uint8_t  ReadByteFromLCD(void)
{
    uint8_t res=0;
        P0=0xFF;
        res=P0;
        return res;


}


void WriteByteToLCD(uint8_t byte)
{
   P0=byte;
}
/*************************************************************************************

************************************************************************************/
/*************************************************************************************
LCD判忙函数
1:忙
0:不忙
************************************************************************************/
uint8_t  LCD_Busy(void)
{
  uint8_t  res=0;
  LCD_RS = 0;
  LCD_RW = 1;
  LCD_EN = 1;
  delay_us(5);
  //读数据
  res=(ReadByteFromLCD()&0x80);
  LCD_EN = 0;       
  
  return res;
}
//写指令/数据到LCD
void  WriteToLCD(uint8_t mode,uint8_t byte)
{
   
        if(mode==LCD_CMD)//写指令
        {
          while(LCD_Busy());
          LCD_RS = 0;//指令
      LCD_RW = 0;//写
      LCD_EN = 0;
          delay_us(5);
          WriteByteToLCD(byte);//写
          delay_us(5);
          LCD_EN = 1;
          delay_us(5);
          LCD_EN = 0;
                     
        }else            //写数据
        {
           while(LCD_Busy());
           LCD_RS = 1;//数据
           LCD_RW = 0;
           LCD_EN = 0;
           delay_us(5);
           WriteByteToLCD(byte);//写
           delay_us(5);
          
           LCD_EN = 1;
           delay_us(5);
           LCD_EN = 0;          
        }
}
void  LCD12864_Init(void)
{
   LCD_PSB=1;
   WriteToLCD(LCD_CMD,0x34);//扩充指令操作
   delay_ms(100);
   WriteToLCD(LCD_CMD,0x30);//基本指令操作
   delay_ms(100);
   WriteToLCD(LCD_CMD,0x0C);//显示开,关光标
   delay_ms(100);
   WriteToLCD(LCD_CMD,0x01);//清LCD
   delay_ms(5);          
}
void LCD_Clear(void)
{
   WriteToLCD(LCD_CMD,0x01);//清LCD
   delay_ms(5);  
}
//设定显示位置
//x=0-3,y=0-7
//128*64=16*8*16*4
void LCD_SetCursor(uint8_t x,uint8_t y)
{                          
  if (x==1)
    {x=0x80;}
  else if (x==2)
    {x=0x90;}
  else if (x==3)
    {x=0x88;}
  else if (x==4)
    {x=0x98;}
  
  WriteToLCD(LCD_CMD,x+y);     //显示地址
}
void LCD_ShowString(uint8_t x,uint8_t y, uint8_t *s)
{
    LCD_SetCursor(x,y);
        while(*s!='')
        {
          WriteToLCD(LCD_DATA,*s++);
        }
        *s=0;
}
//画点函数
/*
                            GDRAM分布
                  256(16*16)                                         X
   |-----------------------------|-----------------------------------|
   |0                            |                                   |
   |      上半屏128*32           |      下半屏128*32                 |
  Y|32                           |                                   |
   |-----------------------------|-----------------------------------|
水平x坐标每隔16个点才有一个位址,因此改变某个点需要知道该点位于这16个点的哪个位置
垂直y坐标在大于31时处于下半屏,小于31处于上半屏
*/




//x:0-127
//y:0-63
//mode:1,画点
//mode:0,清空
void  LCD_DrawPoint(uint8_t x,uint8_t y,uint8_t mode)
{
    //判断处于哪行哪列
        uint8_t x_pos,x_bit;//x_pos用来判断处于位址,x_bit用来判断处于位址中的位置
    uint8_t y_pos,y_bit;//y_pos用来判断处于上半屏还是下半屏 y_bit用来判断位于哪行
//        uint8_t x_pos_temp;
//    if((x>127)||(y>63)||(x

谢谢,不过你确定这是用的串口?
dcexpert
5楼-- · 2019-03-25 11:34
 精彩回答 2  元偷偷看……
人民币的幻想
6楼-- · 2019-03-25 14:40
d907814868 发表于 2015-5-9 09:53
谢谢,不过你确定这是用的串口?

我发的第二个程序是串行模式的,STC89C52RC驱动

一周热门 更多>