关于串口12864液晶屏

2019-03-24 18:00发布

求助一下串口12864的读操作怎么弄? 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
d907814868
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

谢谢,不过你确定这是用的串口?

一周热门 更多>