OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3293|回复: 4

STM32F103控制LCD12864 在特定位置反白(萌新求助)

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-6-28
在线时间
1 小时
发表于 2019-6-28 10:41:44 | 显示全部楼层 |阅读模式
1金钱
LCD12864三点式串行输入//=========================
#ifndef __12864_H
#define __12864_H
#include "sys.h"

#define uchar unsigned char
#define uint  unsigned int

#define CLEAR_SCREEN 0x01   
#define AC_INIT      0x02   
#define CURSE_ADD    0x06   
#define FUN_MODE     0x30   
#define DISPLAY_ON   0x0c   
#define DISPLAY_OFF  0x08   
#define CURSE_DIR    0x14   

#define SET_CG_AC    0x40   
#define SET_DD_AC    0x80

#define LCD_CS          GPIOB, GPIO_Pin_6  //PA0
#define LCD_DATA        GPIOB, GPIO_Pin_7  //PA1
#define LCD_CLK         GPIOB, GPIO_Pin_8  //PA2
// #define LCD_PSB         GPIOA, GPIO_Pin_3  
#define LCD_RST         GPIOB, GPIO_Pin_9  

void SendByte(uchar Dbyte);
void WriteCommand(uchar Cbyte );
void WriteData(uchar Dbyte );
uchar ReceiveByte(void);
void CheckBusy(void);
void LCD_GPIO_Config(void);
void lcd_init(void);
void LcmClearTXT( void );
void LcmClearBMP( void );
void LCD_ShowString(uchar row,uchar col,uchar *puts);
void PutBMP(uchar *puts);  
void DisplayDots(uchar DotByte);

#endif



#include "12864.h"
#include "delay.h"        


#define uchar unsigned char
#define uint  unsigned int






uchar const TABLE[]=
   {   
    0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,         
    0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,         
    0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,        
    0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,      
  };


void SendByte(uchar Dbyte)   
{   
      uchar i;   
      for(i=0;i<8;i++)   
      {   
                         GPIO_ResetBits(LCD_CLK);
                        if(Dbyte&0x80)
                                 GPIO_SetBits(LCD_DATA);
                         else
                                 GPIO_ResetBits(LCD_DATA);
                         Dbyte=Dbyte<<1;      
                   delay_us(10);        
                        GPIO_SetBits(LCD_CLK);
                        delay_us(10);        
                        GPIO_ResetBits(LCD_CLK);
                         delay_us(10);
      }   
}  


uchar ReceiveByte(void)
{
      uchar i,temp1,temp2;
     temp1 = 0;
      temp2 = 0;
      for(i=0;i<8;i++)
      {
            temp1=temp1<<1;
            GPIO_ResetBits(LCD_CLK);
                    delay_us(10);
            GPIO_SetBits(LCD_CLK);
                   delay_us(10);
            GPIO_ResetBits(LCD_CLK);
            if(GPIO_ReadInputDataBit(LCD_DATA)) temp1++;
      }
      for(i=0;i<8;i++)
      {
            temp2=temp2<<1;
            GPIO_ResetBits(LCD_CLK);
                    delay_us(5);
            GPIO_SetBits(LCD_CLK);
                   delay_us(5);
            GPIO_ResetBits(LCD_CLK);
            if(GPIO_ReadInputDataBit(LCD_DATA)) temp2++;
      }
      return ((0xf0&temp1)+(0x0f&temp2));
}


void CheckBusy(void)
{
      do  SendByte(0xfc);         
     while(0x80&ReceiveByte());        
}


void WriteCommand(uchar Cbyte )   
{   
         GPIO_SetBits(LCD_CS);      
         delay_ms(1);
         SendByte(0xf8);              
         SendByte(0xf0&Cbyte);         
        SendByte(0xf0&Cbyte<<4);     
         GPIO_ResetBits(LCD_CS);
        delay_ms(2);
}


void WriteData(uchar Dbyte )   
{   
      GPIO_SetBits(LCD_CS);  
     delay_ms(1);  
      SendByte(0xfa);              
      SendByte(0xf0&Dbyte);        
      SendByte(0xf0&Dbyte<<4);     
      GPIO_ResetBits(LCD_CS);   
      delay_ms(2);
}


void LCD_GPIO_Config(void)
{
         GPIO_InitTypeDef  GPIO_InitStructure;  
         

               RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; //对结构体的GPIO_Pin对象赋值,声明要操作的是1,2,3,4端口
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//对结构体的GPIO_Mode对象赋值,声明IO口的模式是输出
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//对结构体的GPIO_OType对象赋值,声明IO口的结构是推挽输出
         GPIO_Init(GPIOB, &GPIO_InitStructure);
         GPIO_ResetBits(GPIOB,GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9);
}


void lcd_init(void)  
{
        LCD_GPIO_Config();
        delay_ms(5);
    //  GPIO_ResetBits(LCD_PSB); //L 串口方式   
        GPIO_ResetBits(LCD_RST); // 复位端,低电位有效        
        delay_ms(100);
        GPIO_SetBits(LCD_RST);         
        delay_ms(5);


        WriteCommand(0x30);      
        WriteCommand(0x30);         
        WriteCommand(0x0C);         
        WriteCommand(0x01);      
        delay_ms(20);
        WriteCommand(0x06);     
}


void LcmClearTXT( void )   
{   
     uchar i;   
     WriteCommand(0x30);      
     WriteCommand(0x80);      
     for(i=0;i<64;i++)   
     WriteData(0x20);   
}   



void LcmClearBMP( void )   
{   
     uchar i,j;   
     WriteCommand(0x34);      
     WriteCommand(0x36);      
     for(i=0;i<32;i++)            
     {   
        WriteCommand(0x80|i);      
        WriteCommand(0x80);         
        for(j=0;j<32;j++)           
          WriteData(0);   
     }   
}   

void LCD_ShowString(uchar row,uchar col,uchar *puts)   
{   
     WriteCommand(0x30);      
     WriteCommand(TABLE[8*row+col]);      
     while(*puts != '\0')     
     {   
       if(col==8)            
       {              
         col=0;   
         row++;   
       }   
       if(row==4) row=0;      
       WriteCommand(TABLE[8*row+col]);   
       WriteData(*puts);      
       puts++;   
       WriteData(*puts);   
       puts++;   
       col++;   
     }   
}


void PutBMP(uchar *puts)   
{   
    uint x=0;   
    uchar i,j;   
    WriteCommand(0x34);        
    WriteCommand(0x36);        
    for(i=0;i<32;i++)               
    {   
       WriteCommand(0x80|i);        
       WriteCommand(0x80);        
       for(j=0;j<32;j++)         
       {            
         WriteData(puts[x]);   
         x++;   
       }   
    }   
}   


void DisplayDots(uchar DotByte)   
{   
   uchar i,j;   
   WriteCommand(0x34);      
   WriteCommand(0x36);         
   for(i=0;i<32;i++)               
   {   
     WriteCommand(0x80|i);        
     WriteCommand(0x80);        
     for(j=0;j<32;j++)         
     {           
       WriteData(DotByte);                     
     }   
     DotByte=~DotByte;   
   }   
}  



最佳答案

查看完整内容[请看2#楼]

不难的,自己努力下
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-6-28 10:41:45 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-6-28
在线时间
1 小时
 楼主| 发表于 2019-6-28 16:28:35 | 显示全部楼层
求求各位大佬相助,拜托
回复

使用道具 举报

2

主题

582

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2690
金钱
2690
注册时间
2014-5-23
在线时间
188 小时
发表于 2019-6-29 13:10:49 | 显示全部楼层
特定位置取反显示就是反白
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
发表于 2020-2-2 19:03:49 | 显示全部楼层
awsawzj 发表于 2019-6-29 13:10
特定位置取反显示就是反白

可以看下原理图的连线
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-20 04:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表