OpenEdv-开源电子网

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

stm32如何让lcd12864显示变量

[复制链接]

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-7-31
在线时间
4 小时
发表于 2015-9-17 16:23:50 | 显示全部楼层 |阅读模式
5金钱
网上移植了一下大神的程序,可以显示字符串了,但是不懂怎么显示变量,如温度等等。求大神

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

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-7-31
在线时间
4 小时
 楼主| 发表于 2015-9-17 16:24:46 | 显示全部楼层
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include <12864.h>
#include "BMP.h"    //存储图片
#define time  50    //宏定义,字符显示的时间差

float a;
/*-----------------待显示的字符串------------------------*/
u8  Table0[]="    ";    //一行最多显示八个汉字,一个汉字两个字节
u8  Table1[]="测控技术与仪器  ";
u8  Table2[]="         "; //一行最多显示16个数字,一个数字一个字节
u8  Table3[];
int main(void)
{

Stm32_Clock_Init(9);  //系统时钟设置
delay_init(72);       //延时初始化
uart_init(72,115200);

lcd12864_Init();
a+=1;
Table3[0]=a;




//显示内容
Display_LCD_String(0 , Table0,time);
delay_ms(100);
Display_LCD_String(1 , Table1,time);
delay_ms(100);    
Display_LCD_String(2 , Table2,time);
delay_ms(100);
Display_LCD_String(3 , Table3,time);
delay_ms(100);

}
回复

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-7-31
在线时间
4 小时
 楼主| 发表于 2015-9-17 16:29:00 | 显示全部楼层
#include "sys.h"
#include "delay.h"
#include <12864.h>

/********lcd12864初始化********/
void lcd12864_Init(void)
{
RCC->APB2ENR|=1<<4; //使能PORTC时钟

GPIOC->CRL&=0X000FFFFF;//CS(RS)-PC5,SID(RW)-PC6,CLK(EN)-PC7
GPIOC->CRL|=0X33300000;//推挽输出
GPIOC->ODR |= (1<<5)|(1<<6)|(1<<7)|(1<<8);//输出1


delay_ms(2);
  lcd12864_SendCMD(0x30);  //30--基本指令动作,功能设定0011 0000
  delay_ms(5);
  lcd12864_SendCMD(0x0c);  //光标右移画面不动0000 1100
  delay_ms(5);
  lcd12864_SendCMD(0x01);  //清屏0000 0001
  delay_ms(5);              //清屏时间较长
  lcd12864_SendCMD(0x06);  //显示打开,光标开,反白关0000 0110

}


/*********发送数据到LCD**********/
void lcd12864_SendByte(u8 zdata)
{
  u16 i;
  for(i=0; i<8; i++)
    {
  
  if((zdata << i) & 0x80) 
       SID=1;
  else   
       SID=0;
       SCLK=1;
     SCLK=0;
  }
}

/********读取LCD数据**********/
u8 lcd12864_ReceiveByte(void)
{
   u8 i,temp1,temp2,value;
   temp1=0;
   temp2=0;
   for(i=0;i<8;i++)
      {
    temp1=temp1<<1;
    SCLK=0;
   SCLK=1;
    SCLK=0;
 if(PCout(6)==1)
   {
     temp1++;
}
  }
   for(i=0;i<8;i++)
      {
    temp2=temp2<<1;
    SCLK=0;
   SCLK=1;
    SCLK=0;
 if(PCout(6)==1)
   {
      temp2++;
   }
  }
    temp1=0xf0&temp1;
  temp2=0x0f&temp2;
  value=temp1+temp2;
      return   value ;
}
/*****lcd12864检测忙标志*********/

void lcd12864_Check_Busy(void)
{
do
lcd12864_SendByte(0xfc);   //11111,RW(1),RS(0),0
while(0x80&lcd12864_ReceiveByte());
}

/**********发送命令到LCD**********/
void lcd12864_SendCMD(u8 cmdcode)

   
   CS=1;
   lcd12864_Check_Busy();
   lcd12864_SendByte(0xf8);
   lcd12864_SendByte(cmdcode & 0xf0);
   lcd12864_SendByte((cmdcode << 4) & 0xf0);
   delay_ms(2);
   CS=0;
}

/********发送显示内容到LCD**********/
void lcd12864_SendDat(u8 Dispdata)
{  
  CS=1;
  lcd12864_Check_Busy();
  lcd12864_SendByte(0xfa);   //11111,RW(0),RS(1),0
  lcd12864_SendByte(Dispdata & 0xf0);
  lcd12864_SendByte((Dispdata << 4) & 0xf0);
  delay_ms(2);
  CS=0;
}

/*******读取LCD显示内容**********/
u8 lcd12864_ReadData(void)
{
  lcd12864_Check_Busy();
  lcd12864_SendByte(0xfe);    //11111,RW(1),RS(1),0 LCD->MCU
  return  lcd12864_ReceiveByte();

}

/********文本区清除********/
void lcd12864_Clear_TXT( void )
{
     u8 i;
     lcd12864_SendCMD(0x30);      //8BitMCU,基本指令集合
     lcd12864_SendCMD(0x80);      //AC归起始位
     for(i=0;i<64;i++)
  {
       lcd12864_SendDat(0x20);
  }
}

/********图片区清除************/
void lcd12864_Clear_BMP( void )
{
     u8 i,j;
     lcd12864_SendCMD(0x34);      //8Bit扩充指令集,即使是36H也要写两次
     lcd12864_SendCMD(0x36);      //绘图ON,基本指令集里面36H不能开绘图
     for(i=0;i<32;i++)            //12864实际为256x32
     {
           lcd12864_SendCMD(0x80|i);      //行位置
           lcd12864_SendCMD(0x80);      //列位置
           for(j=0;j<32;j++)            //256/8=32 byte
           lcd12864_SendDat(0);
     }
}

/*********设置显示位置*************/
void Display_LCD_Pos(u8 x,u8 y) 
{
   u8 pos;
   switch(x)
       {
      case 0: x=0x80;break;
    case 1: x=0x90;break;
      case 2: x=0x88;break;
    case 3: x=0x98;break;
     }
   pos=x+y;
   lcd12864_SendCMD(pos);
}
/******************************************
函数名称:Disp_HZ
功    能:控制液晶显示汉字
参    数:addr--显示位置的首地址
          pt--指向显示数据的指针
          num--显示字符个数
返回值  :无
********************************************/
void Disp_HZ(u8 X,const u8 * pt,u8 num)
{
    u8 i,addr;

    if (X==0) {addr=0x80;}
     else if (X==1) {addr=0x90;}
     else if (X==2) {addr=0x88;}
     else if (X==3) {addr=0x98;}
     lcd12864_SendCMD(addr); 
     for(i = 0;i < (num*2);i++) 
     lcd12864_SendDat(*(pt++)); 

/*********************************************************
函数名isplay_LCD_String()
返回值:无
功  能:显示字符串
*********************************************************/

void Display_LCD_String(u8 x,u8 *p,u8 time)
{
 u8 i,addr,num;
 num=sizeof p;
 switch(x)
     {
     case 0: addr=0x80;break;
     case 1: addr=0x90;break;
     case 2: addr=0x88;break;
     case 3: addr=0x98;break;
 }
  lcd12864_SendCMD(addr);
  for(i=0;i<(num*4);i++)
  {
  lcd12864_SendDat(*(p++));
  delay_ms(time);
 
 }

}
void display_binaliang(u8 x,float t,u8 time)
{
u8 addr;
 switch(x)
     {
     case 0: addr=0x80;break;
     case 1: addr=0x90;break;
     case 2: addr=0x88;break;
     case 3: addr=0x98;break;
 }
  lcd12864_SendCMD(addr);
lcd12864_SendDat(t);
delay_ms(time);
 
}
/*************************************************************
* 函数名称    :PutBMP 显示图片
**************************************************************/
void utBMP(u8 *puts)
{
     u16 x=0;
     u8 i,j;
     lcd12864_SendCMD(0x34);      //8Bit扩充指令集,即使是36H也要写两次
     lcd12864_SendCMD(0x36);      //绘图ON,基本指令集里面36H不能开绘图
     for(i=0;i<32;i++)            //12864实际为256x32
     {
           lcd12864_SendCMD(0x80|i);      //行位置
           lcd12864_SendCMD(0x80);      //列位置
           for(j=0;j<16;j++)      //256/8=32 byte
           {            //列位置每行自动增加
                lcd12864_SendDat(puts[x]);
                 x++;
           }
     }
     for(i=0;i<32;i++)            //12864实际为256x32
     {
          lcd12864_SendCMD(0x80|i);      //行位置
          lcd12864_SendCMD(0x88);      //列位置
           for(j=0;j<16;j++)      //256/8=32 byte
           {            //列位置每行自动增加
                 lcd12864_SendDat(puts[x]);
                 x++;
           }
     }
}

/*-------------------------------------------------
 LCD显示缓存
--------------------------------------------------*/
u16 LCD12864_Buffer[64][16] = {0};

const u8 m_ch4x5[][6] = 
{
{0x06,0x09,0x09,0x09,0x06,5}, // 0,字符宽度5点阵
{0x02,0x06,0x02,0x02,0x07,5}, // 1
{0x06,0x09,0x02,0x04,0x0F,5}, // 2
{0x06,0x09,0x02,0x09,0x06,5}, // 3
{0x02,0x06,0x0A,0x0F,0x02,5}, // 4
{0x0E,0x08,0x0E,0x01,0x0E,5}, // 5
{0x06,0x08,0x0E,0x09,0x06,5}, // 6
{0x0F,0x01,0x02,0x04,0x04,5}, // 7
{0x06,0x09,0x06,0x09,0x06,5}, // 8
{0x06,0x09,0x07,0x01,0x06,5}, // 9
{0x00,0x00,0x00,0x00,0x01,2}, // .
{0x00,0x01,0x00,0x01,0x00,2}, //:
{0x00,0x00,0x00,0x00,0x00,5},  // 空格






};
/*------------------------------------------------------------------------------
功能:画点
参数:
x:横坐标
y:纵坐标
color:颜色,0不显示,1显示
------------------------------------------------------------------------------*/
const u16 DrawDotsTable[] = {0x8000, 0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, 0x0100, 0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001};
void Draw_Dots(u8 x, u8 y, u8 color)
{
u8 i0, y0;
u16 value;

// 获得坐标
if ( y >= 32 )
{
y0 = y-32;
i0 = x/16+8;
}
else
{
y0 = y;
i0 = x/16;
}
value = DrawDotsTable[x%16];
if (color == 0)
{
LCD12864_Buffer[y0][i0] &= ~value;
}
else
{
LCD12864_Buffer[y0][i0] |= value;
}
}

/*------------------------------------------------------------------------------
功能:刷新显示
------------------------------------------------------------------------------*/
void Draw_Update(void)
{
u8 x, y;

for (y=0; y<64; y++)
{
lcd12864_SendCMD(0x80|y);
lcd12864_SendCMD(0x80);
for (x=0; x<16; x++)
{
lcd12864_SendDat(LCD12864_Buffer[y][x]>>8);
lcd12864_SendDat(LCD12864_Buffer[y][x]);
}
}
}

/*------------------------------------------------------------------------------
功能:显示清屏
------------------------------------------------------------------------------*/
void lcd12864_clear(void)
{
u8 x, y;

for (y=0; y<64; y++)
{
for (x=0; x<16; x++)
{
LCD12864_Buffer[y][x] = 0;
}
}
}

/*------------------------------------------------------------------------------
功能:显示4*5字符
参数:
x:写出横坐标
y:写出纵坐标
value:字符
------------------------------------------------------------------------------*/
void Draw_Char4x5(u8 x, u8 y, u8 value)
{
u8 i, j, p, z, a;

a = m_ch4x5[value][5];
for (i=0; i<5; i++)
{
p = 0x10>>(5-a);
for (j=0; j<a; j ++)
{
z = m_ch4x5[value];
if ( z & p )
{
Draw_Dots(j+x, i+y, 1);
}
p >>= 1;
}
}
}

/*--------------------------------------------------------
功能:显示一行4*5字符
参数:
x:写出横坐标
y:写出纵坐标
value:字符串
len:长度
---------------------------------------------------------*/
void Draw_Char4x5Line(u8 x, u8 y, u8 *value, u8 len)
{
u8 i;

for (i=0; i<len; i++)
{
Draw_Char4x5(x, y, value);
x += m_ch4x5[value][5];
}
}>
回复

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-7-31
在线时间
4 小时
 楼主| 发表于 2015-9-17 16:30:03 | 显示全部楼层
#ifndef __12864_H
#define __12864_H

#include "sys.h"

#define CS Cout(5)       //PC5 CS (RS) 串行片选信号 高电平:数据D0-D7将送入显示RAM;低电平:数据D0-D7将送入指令寄存器操作
#define SID Cout(6) //PC6 SID(RW) 串行数据接口  高电平:读数据;低电平:写数据
#define SCLK Cout(7)   //PC7 SCLK(EN)串行同步时钟


void lcd12864_Init(void); //LCD初始化
void lcd12864_SendByte(u8 zdata); //发送数据到LCD
u8   lcd12864_ReceiveByte(void); //读取LCD数据
void lcd12864_Check_Busy(void); //检测LCD忙状态
void lcd12864_SendCMD(u8 cmdcode); //发送命令给LCD
void lcd12864_SendDat(u8 Dispdata); //发送显示数据到LCD
u8   lcd12864_ReadData(void); //读取LCD显示内容
void lcd12864_Clear_TXT( void ); //清除LCD文本区
void lcd12864_Clear_BMP( void ); //清除LCD显示图片
void Display_LCD_Pos(u8 x,u8 y) ; //设置显示位置
void Disp_HZ(u8 X,const u8 * pt,u8 num); //控制液晶显示汉字
void Display_LCD_String(u8 x,u8 *p,u8 time);   //显示字符串
void utBMP(u8 *puts); //显示图片
void Draw_Dots(u8 x, u8 y, u8 color); //画点
void Draw_Update(void); //刷新显示
void lcd12864_clear(void); //lcd清屏
void Draw_Char4x5(u8 x, u8 y, u8 value); //显示4*5字符
void Draw_Char4x5Line(u8 x, u8 y, u8 *value, u8 len); //显示一行4*5字符


#endif
回复

使用道具 举报

3

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
金钱
373
注册时间
2015-3-7
在线时间
43 小时
发表于 2015-9-17 16:35:39 | 显示全部楼层
LCD上显示的字符。
LZ要把变量转换成字符格式,变量+0x30。
为人莫作千年计,三十河东四十西,莫欺少年穷。
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2018-3-25
在线时间
21 小时
发表于 2018-4-20 16:19:16 | 显示全部楼层
这资料够全的啊!呵呵!
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2018-4-20 16:27:57 | 显示全部楼层
和显示一样,无非就是变量变一次你就刷新一次,或者直接固定时间刷新一次。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 02:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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