打印
[STM32]

不带字库LCD12864显示问题?

[复制链接]
1617|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
329197399|  楼主 | 2014-7-4 21:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
把程序下载进去没有任何显示,程序如下:#include<stm32f4xx.h>

#define uint unsigned int
#define uchar unsigned char

void Delay(uint z);

//我用的是 D.8 D.9 D.10 D.11
#define RS      GPIO_Pin_11
#define RW      GPIO_Pin_12
#define EN      GPIO_Pin_13
#define CS1     GPIO_Pin_14   
#define CS2     GPIO_Pin_15

/*--  文字:  欢  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
/*--  宽度不是8的倍数,现调整为:宽度x高度=16x12  --*/
uchar huan[] = {0x02,0x00,0xFA,0x00,0x0B,0xE0,0x8C,0x20,0x58,0x40,0x51,0x00,
                 0x21,0x00,0x21,0x00,0x52,0x80,0x52,0x80,0x84,0x40,0x08,0x20,};

void RCC_Configuration(void)   //推挽输出模式 ,管脚配置,不多解释,库函数有
{  
  GPIO_InitTypeDef GPIO_InitStructure;       

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);  
  GPIO_InitStructure.GPIO_Pin = RS|RW|EN|CS1|CS2;         
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                         
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|
                                GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;                 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                         
  GPIO_Init(GPIOD, &GPIO_InitStructure);
}

/*写指令函数*/
void LCD_write_cmmand(uchar cmd)
{
      GPIO_ResetBits(GPIOB,RS);
      GPIO_ResetBits(GPIOB,RW);
      GPIO_ResetBits(GPIOB,EN);
      
      GPIO_Write(GPIOD, cmd);
      Delay(5);
      GPIO_SetBits(GPIOB,EN);
      Delay(5);
      GPIO_ResetBits(GPIOB,EN);
}

/*写数据函数*/
void  LCD_write_data(uchar dat)
{
      GPIO_SetBits(GPIOB,RS);
      GPIO_ResetBits(GPIOB,RW);
      GPIO_ResetBits(GPIOB,EN);
      
      GPIO_Write(GPIOD, dat);
      Delay(5);
      GPIO_SetBits(GPIOB,EN);
      Delay(5);
      GPIO_ResetBits(GPIOB,EN);
}

void set_page(uchar page)              //设置页,要那一页直接是那个数字就行了
{                                      //总共有8页,一页是8行点阵点,即128*8
    page = 0xb8 | page;                //页得首地址为0xB8 1011 1XXX
    LCD_write_cmmand(page);
}

void set_line(uchar startline)         //设置显示的起始行
{
     startline = 0xc0 | startline;     //起始行地址为0xc0
     LCD_write_cmmand(startline);          //设置从哪一行开始,共0--63 11XX XXXX
}

void set_column(uchar column)          //设置显示的列
{
    column = column & 0x3f;            //列的最大值为64,因为分成两个屏了
    column = 0x40 | column;            //列的首地址为0x40; 01XX XXXX
    LCD_write_cmmand(column);              //设置列位置
}

void setonoff(uchar onoff)   //显示开关函数,1为开,0为关
{
    onoff = 0x3e | onoff;    //0x3e是关显示,0x3f是开显示0011 111X onoff只能为0或者1;
    LCD_write_cmmand(onoff);
}

void selectscreen(uchar screen)        //选屏
{
    switch(screen)
    {
      case 0:                          //全屏
        GPIO_ResetBits(GPIOB,CS1);
        GPIO_ResetBits(GPIOB,CS2);
      break;  
      case 1:                          //选左半屏
        GPIO_ResetBits(GPIOB,CS1);
        GPIO_SetBits(GPIOB,CS2);
      break;               
      case 2:                          //选右半屏  
        GPIO_SetBits(GPIOB,CS1);
        GPIO_ResetBits(GPIOB,CS2);
      break;
      default:
      break;
    }
}

void clearscreen(uchar screen)    //清屏
{
    uchar i,j;
    selectscreen(screen);
    LCD_write_cmmand((0xb8)+0);
    LCD_write_cmmand((0x40)+0);
    for(i=0;i<8;i++)                     //控制页数0--7,共8页
    {
        set_page(i);  
        for(j=0;j<64;j++)                //控制列数0-63,共64列
        {
          LCD_write_data(0x00);               //写入0,地址指针自加1
        }
    }
}

/*LCD初始化函数*/
void LCD_init()            //lcd的初始化
{
    // LCD_busy();         //忙检测
    Delay(100);
    selectscreen(0);       //两个屏都选
    setonoff(0);           //关显示
    selectscreen(0);       //选屏
    setonoff(1);           //开显示
    clearscreen(0);        //清屏
    set_line(0);           //开始行为0
    // set_column(0);      //开始列为0
    //  set_page(0);       //开始页为0
}

/*显示函数*/
void display(uchar ss,uchar page,uchar column,uchar *p)   
{
    uchar i;
    selectscreen(ss);      //选屏
    Delay(2);
    set_page(page);        //写上半页
    set_column(column);    //控制列
    for(i=0;i<16;i++)      //控制16列的数据输出,因为一个汉字是16*16点阵的
    {
      LCD_write_data(p[i]);     //汉字的上半部分
      //LCD_write_data(*p);
    }
    set_page(page+1);      //写下半页
    set_column(column);    //控制列
    for(i=0;i<16;i++)      //控制16列数据的输出
    {
      LCD_write_data(p[i+16]);  //汉字的下半部分
    }
}

/*主函数*/
void main()
{
    LCD_init();                //lcd初始化
//    clearscreen(0);
//    set_line(0);
    while(1)
    {
      display(0,0,4,huan);     //欢
    }
}

/*延时函数*/
void Delay(uint z)
{
  uint x,y;
  for(x=z;x>0;x--)
    for(y=110;y>0;y--);
}

相关帖子

沙发
zhaoyu2005| | 2014-7-4 21:58 | 只看该作者
对比度先调好吧,如果是已经显示的电路,只是改了程序,那就找程序的问题

使用特权

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

本版积分规则

14

主题

35

帖子

0

粉丝