OpenEdv-开源电子网

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

用stm32驱动一块12864 但老是没显示 看了好长时间还是不行 刚接触这个 求各位大神解答一下 !!!!!! 代码有点长 。。。。。

[复制链接]

6

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2013-5-5
在线时间
0 小时
发表于 2013-5-5 10:41:46 | 显示全部楼层 |阅读模式
main函数
#include "stm32f10x.h"
#include "lcd12864.h"

int main(void)
{
  LCD_Init();
while(1)
{
LCD_Dis_Chinese(0,0,"天天向上");
LCD_Dis_Str(1,0,"mmmmmmm");
LCD_Dis_Digital(1,0,1234567);
}
}
12864 H文件
#ifndef __LCD12864_H
#define __LCD12864_H

#include "stm32f10x.h"
#define GPIO_LCD    GPIOE
#define RCC_APB2Periph_GPIO_LCD    RCC_APB2Periph_GPIOE

//片选
#define LCD_CS_1    GPIO_LCD->BSRR = GPIO_Pin_8 
#define LCD_CS_0    GPIO_LCD->BRR = GPIO_Pin_8
//数据
#define LCD_SID_1   GPIO_LCD->BSRR = GPIO_Pin_9 
#define LCD_SID_0   GPIO_LCD->BRR = GPIO_Pin_9
//同步时钟
#define LCD_CLK_1   GPIO_LCD->BSRR = GPIO_Pin_10
#define LCD_CLK_0   GPIO_LCD->BRR = GPIO_Pin_10
//复位 低电平复位 
#define LCD_RET_1   GPIO_LCD->BSRR = GPIO_Pin_11
#define LCD_RET_0   GPIO_LCD->BRR = GPIO_Pin_11
//并/串选择
#define LCD_PSB_1   GPIO_LCD->BSRR = GPIO_Pin_12
#define LCD_PSB_0   GPIO_LCD->BRR = GPIO_Pin_12

#define LCD_Write_Con_Cmd    (uint32_t)0xf8000000 // 串口发送时的  发送的指令第一个字节的
#define LCD_Write_Dis_Data   (uint32_t)0xfa000000 //  串口发送时的  发送的数据第一个字节的

void LCD_Port_Config(void);
void LCD_Init(void);
void LCD_Reset(void);
void LCD_Clear(void);
void LCD_Write(uint32_t inst, uint8_t ddata);
void LCD_Dis_Str(uint8_t row ,uint8_t col ,uint8_t *str);
void LCD_Dis_Chinese(uint8_t row, uint8_t col, uint8_t *str);
void LCD_Dis_Digital(uint8_t row, uint8_t col,uint32_t Dig_Data);
void delayms(uint16_t x);

#endif
12864 C文件
#include "lcd12864.h"

/****************************************************************************
【功能说明】简单的毫秒延时函数
****************************************************************************/
void delayms(uint16_t x)
{
         u16 i=0;
         while(x--)
   {        
i=12000;  
   while(i--);
        }
}
/****************************************************************************
【功能说明】I/O端口功能、方向设定
****************************************************************************/
void LCD_Port_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* 使能端口时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_LCD, ENABLE);

/* 配置所用管脚为推免输出,端口速度为50MHz*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIO_LCD, &GPIO_InitStructure);     
}

/****************************************************************************
【功能说明】 LCD写字节函数
入口参数    inst=cmd/data: 命令/数据标志(data:写显示数据 cmd:写控制指令) 
                         ddata : 命令/数据字节
****************************************************************************/

void LCD_Write(uint32_t inst, uint8_t ddata)
{
uint32_t temp = inst;
uint32_t i=0;
int8_t t;
temp |= ((uint32_t)(ddata & (uint8_t)0xf0) << 16) + ((uint32_t)(ddata & (uint8_t)0x0f) << 12);
LCD_CS_1;    //选中12864

//拉低CLK引脚,准备产生上升沿
LCD_CLK_0;
    

//串行传送24个二进制位
for(i=0;i<24;i++)                   
   {     
      if(temp & 0x80000000) 
  LCD_SID_1;    
      else                  
  LCD_SID_0;      
      //拉高CLK引脚,产生一个上升沿,最高位被传送到LCD模块中
      LCD_CLK_1;   
      t = 0x10;
  while(t--);   //延时 lcd读取数据
      
       //拉低CLK引脚,准备产生上升沿
      LCD_CLK_0;                     
     
      //左移一位,准备下一个待传送的位
      temp = temp<<1; 
   }
LCD_CS_0; //取消选中12864
}

/****************************************************************************
【功能说明】 
   LCD字符串显示函数:void LCD_Dis_Str(u8 x, u8 y, u8 *str);
   入口参数 row:   字符串起始显示位置的行
             col:   字符串起始显示位置的列
             str:   指向待显示字符串的字符指针,字符串以'\0'结尾
注:CGRAM 与中文字型的编码只能出现在adress counter 的起始位
DDRAM 8*16 字节的空间
Line1 80H 81H 82H 83H 84H 85H 86H 87H
Line2 90H 91H 92H 93H 94H 95H 96H 97H
Line3 88H 89H 8AH 8BH 8CH 8DH 8EH 8FH
Line4 98H 99H 9AH 9BH 9CH 9DH 9EH 9FH

Line5 A0H A1H A2H A3H A4H A5H A6H A7H
Line6 B0H B1H B2H B3H B4H B5H B6H B7H
Line7 A8H A9H AAH ABH ACH ADH AEH AFH
Line8 B8H B9H BAH BBH BCH BDH BEH BFH
****************************************************************************/
void LCD_Dis_Str(uint8_t row,uint8_t col,uint8_t *str)
{
    uint8_t addr, i = 0;
    //防止误操作(调试) 
    if(row > 3) row = 3;
    if(col > 7) col = 7;
    
    //根据x,y坐标确定显示缓冲区地址
    switch(row)                                     
     {
        case 0: addr = 0x80 + col; break;
        case 1: addr = 0x90 + col; break;
        case 2: addr = 0x88 + col; break;
        case 3: addr = 0x98 + col; break;
     }
    
//设置DDRAM地址
LCD_Write(LCD_Write_Con_Cmd, addr); 

while(*str)
   {           
     //下一行:从设置好的DDRAM地址开始写字符并准备好指向下一个字符的指针
      LCD_Write(LCD_Write_Dis_Data, *str++);
      i++;
      if(i==2)
       {
         i = 0;
         
          //每写俩字节DDRAM地址会自动增量,跟踪DDRAM的地址变化,以便换行调整
         addr++; 
         
         //当addr=88H,90H,98H,a0H时,说明DDRAM地址需要重新指定
         if( (addr&0x07) == 0 ) 
          {
            switch(addr)
             {
                case 0x88: addr = 0x90;   break;
                case 0x98: addr = 0x88;   break;
                case 0x90: addr = 0x98;   break;
                case 0xa0: addr = 0x80;   break;
             }
            //设置被重新指定了的DDRAM地址
            LCD_Write(LCD_Write_Con_Cmd, addr);                   
          }
       }
   }
}

void LCD_Dis_Chinese(uint8_t row, uint8_t col, uint8_t *str)
{
    uint8_t addr;
    //防止误操作(调试) 
    if(row > 3) row = 3;
    if(col > 7) col = 7;
    
    //根据x,y坐标确定显示缓冲区地址
    switch(row)                                     
     {
        case 0: addr = 0x80 + col; break;
        case 1: addr = 0x90 + col; break;
        case 2: addr = 0x88 + col; break;
        case 3: addr = 0x98 + col; break;
     }
    
//设置DDRAM地址
LCD_Write(LCD_Write_Con_Cmd, addr);                                           

while(*str)
   {           
     //下一行:从设置好的DDRAM地址开始写字符并准备好指向下一个字符的指针
      LCD_Write(LCD_Write_Dis_Data, *str++);

         addr++; 
         
         //当addr=88H,90H,98H,a0H时,说明DRAM地址需要重新指定
         if( (addr&0x07) == 0 ) 
          {
            switch(addr)
             {
                case 0x88: addr = 0x90;   break;
                case 0x98: addr = 0x88;   break;
                case 0x90: addr = 0x98;   break;
                case 0xa0: addr = 0x80;   break;
             }
            //设置被重新指定了的DDRAM地址
            LCD_Write(LCD_Write_Con_Cmd, addr);                   
          }
       
   }
}

/****************************************************************************
【功能说明】 LCD 清屏
****************************************************************************/
void LCD_Clear(void)
   LCD_Write(LCD_Write_Con_Cmd, 0x01);
   delayms(5);
}

/****************************************************************************
【功能说明】 LCD 重启
****************************************************************************/
void LCD_Reset(void)
   LCD_RET_0; 
   delayms(50);
   LCD_RET_1; 
   delayms(100);
}
/****************************************************************************
【功能说明】 初始化LCD子程序
****************************************************************************/
void LCD_Init(void)   
{
   //串口传输
   LCD_PSB_0;
   //端口配置 
   LCD_Port_Config();
   
   //LCD复位
   LCD_Reset();
   
   //基本指令集 8位数据
   LCD_Write(LCD_Write_Con_Cmd,0x30);
   delayms(1);
   //基本指令集 8位数据
   LCD_Write(LCD_Write_Con_Cmd,0x30);
   delayms(1);
   
   //显示打开,光标关,反白关
   LCD_Write(LCD_Write_Con_Cmd,0x0C); 
   delayms(1);
    //清屏
   LCD_Clear(); 
   
   //DDRAM 的地址计数器(AC)加1
   LCD_Write(LCD_Write_Con_Cmd,0x06);
                         
}
/******************************************************************************
【功能说明】 显示十进制数
   入口参数 row: 行
             col: 列
      Dig_Data:显示的十进制数
******************************************************************************/
void LCD_Dis_Digital(uint8_t row, uint8_t col,uint32_t Dig_Data)
{
uint8_t dd[11];
uint8_t i,j=9;
uint32_t temp;
temp = Dig_Data;
dd[10]=0;
for(i=10;(i>j)&(i>0);i--) 
   { 
     dd[i-1] = temp%10 + '0';
     temp=temp/10;
     if(temp) j--; 
   }
LCD_Dis_Str(row,col,&dd);
}







正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

6

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2013-5-5
在线时间
0 小时
 楼主| 发表于 2013-5-5 11:21:40 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥我用的是串口的输入。。。。。。。有串口输入的例程吗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-5 13:14:27 | 显示全部楼层
我们的串口例程,即有输入也有输出.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-20 14:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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