初级会员

- 积分
- 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];
}
}> |
|