LCD9648驱动

main.c内容

#include "reg51.h"
#include "LCD9648.h" 
#include "stdio.h"

typedef unsigned int u16;
unsigned char seg_buf[10];
unsigned char seg_string[10];
void main()
{
	LCD_Init();
	Clear();
	while(1)
	{
		sprintf(seg_string,"  %02d-%02d-%02d",(u16)21,(u16)2,(u16)8);
		Seg_Tran(seg_string,seg_buf);
		Displine_num(0,seg_buf);
		sprintf(seg_string,"  %02d:%02d:%02d",(u16)11,(u16)17,(u16)3);
		Seg_Tran(seg_string,seg_buf);
		Displine_num(2,seg_buf);
		
	}
}

LCD9648.C

#include "LCD9648.h" 

unsigned char lcd0[18][16]=
{   
	/*--  文字:  0  --*/
	{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,},
	/*--  文字:  1  --*/
	{0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,},
	/*--  文字:  2  --*/
	{0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,},
	/*--  文字:  3  --*/
	{0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00,},
	/*--  文字:  4  --*/
	{0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24,},
	/*--  文字:  5  --*/
	{0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00,},
	/*--  文字:  6  --*/
	{0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,},
	/*--  文字:  7  --*/
	{0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00,},
	/*--  文字:  8  --*/
	{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,},
	/*--  文字:  9  --*/
	{0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00,},
	/*--  文字:  :  --*/
	{0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,},
	/*--  文字:  -  --*/
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,},
	/*--  文字:     --*/
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},
	/*--  文字:  .  --*/
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,},
	/*--  文字:  T  --*/
	{0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,},
	/*--  文字:  A  --*/
	{0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,},
	/*--  文字:  °C  F--*/
	{0xC6,0x36,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,},
	/*--  文字:  U  --*/
	{0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,}

};

//函数名:字符串到数码管段码的转换函数
//入口参数:seg_string(10个字节)待转换的字符串,将转换完的段码存到buf(8个字节)里
//返回值:无;
//函数功能:将seg_tran一一转换为数码管段码存储到seg_buf中
void  Seg_Tran(unsigned char *seg_string,unsigned char *seg_buf)
{
	unsigned char i=0;//buf【i】:buf0-buf7
	unsigned char j=0;//seg_string[j]:j0-7
	unsigned char temp;//字符串转化为段码的中间变量

	for(i=0;i<=10;i++,j++)
	{
		switch(seg_string[j])
		{
			case '0': temp  = 0; break;
			case '1': temp  = 1; break;
			case '2': temp  = 2; break;
			case '3': temp  = 3; break;
			case '4': temp  = 4; break;
			case '5': temp  = 5; break;
			case '6': temp  = 6; break;
			case '7': temp  = 7; break;
			case '8': temp  = 8; break;
			case '9': temp  = 9; break;
			case '.': temp = 13; break;
			case '-': temp = 11; break;
			case ' ': temp = 12; break;
			case ':': temp = 10; break;
			case 'A': temp = 15; break;
			case 'F': temp = 16; break;
			case 'U': temp = 17; break;
			case 'T': temp = 14; break;
			default : temp = 12; break;
		}
		seg_buf[i] = temp;//将转换后的段码传递给buf	
	}

}

/*
*每行显示6个汉字,一页可显示3行
*/
void Delay10ms(unsigned int c)   //误差 0us
{
    while(c--);
}

void SendDataSPI(unsigned char dat)
{  
   unsigned char i;
   for(i=0; i<8; i++)                       
   {  
      if( (dat&0x80)!=0 ) 
	  	SDA = 1;
      else
		 SDA = 0;
      dat <<= 1;
      SCL = 0;
   	  SCL = 1;                       
   }
}

void WriteComm(unsigned char i)
{
    CS0 = 0;
    RS  = 0;
    SendDataSPI(i);
    CS0 = 1;
}
void WriteData(unsigned char i)
{
    CS0 = 0;
    RS  = 1;
    SendDataSPI(i);
    CS0 = 1;
}

void LCD_Init(void)
{
	RST=1;  
	Delay10ms(1000);  
	RST=0;
	Delay10ms(1000);
	RST=1;
	Delay10ms(1000);

	WriteComm(0xe2);                  //软件复位	 
	WriteComm(0xc8);				  //0xC8普通方向选择选择反向,0xC0为正常方向
	WriteComm(0xa0);                  //0xA0段方向选择正常方向(0xA1为反方向
	WriteComm(0x2f);
	WriteComm(0x26);
	WriteComm(0x81);                  //背景光对比度
	WriteComm(0x10);                  //0x10设置列高地址
	WriteComm(0xaf);                  //开启显示
	//WriteComm(0xa4);
}


void Clear(void)
{
	unsigned char i,j;       
	WriteComm(0x40);
	for(i=0; i < 9; i++)//一共九页
	{
		WriteComm(0xb0+i);//页地址
		WriteComm(0x10);//列地址
		WriteComm(0x00);//列地址   
		for(j = 0; j < 96; j++)
		 {
			 WriteData(0x00);       
		  }
	}               
}
/*
void Clear_Lcd(void)
{
	unsigned char i,j;
	for(i = 0; i < 6; i++)
	{
		WriteComm(0x40);
		WriteComm(0XB0+i);
		WriteComm(0x10);
		WriteComm(0x00);
		for(j = 0; j < 96; j++)
		{
			WriteData(0xff);
			Delay10ms(1000);                                                               
		}       
	}

	for(i = 0; i < 7; i++)
	{
		WriteComm(0XB0+i);
		WriteComm(0x10);
		WriteComm(0x00);
		for(j = 0; j < 96; j++)
		{
				WriteData(0x00);
				Delay10ms(1000);                                                               
		}       
	}
}
*/


//功能:两行显示一个字符 
//输入参数:共j个font[]字符显示在i行
void Displine_font(unsigned char i,unsigned char j,unsigned char *font0,unsigned char *font1 )   //行扫屏
{
    unsigned char k;
    WriteComm(0x40);  //set scroll line         设置滚动一行
    WriteComm(0xb0+i);//set page address         设置页地址
    WriteComm(0x10); //column  msb                列最高位
    WriteComm(0x00); //column  lsb                列最低位
    for(k=0;k<j;k++)
    {
		WriteData(font0[k]);
		Delay10ms(100);
    }
	WriteComm(0x40);  //set scroll line         设置滚动一行
    WriteComm(0xb0+i+1);//set page address         设置页地址
    WriteComm(0x10); //column  msb                列最高位
    WriteComm(0x00); //column  lsb                列最低位
    for(k=0;k<j;k++)
    {
		WriteData(font1[k]);
		Delay10ms(100);
    }
}


//功能:两行显示一个数字 
//输入参数:数字seg_buf[]显示在i行
void Displine_num(unsigned char i,unsigned char *seg_buf)   //行扫屏
{
    unsigned char k,m;
    WriteComm(0x40);  //set scroll line         设置滚动一行
    WriteComm(0xb0+i);//set page address         设置页地址
    WriteComm(0x10); //column  msb                列最高位
    WriteComm(0x00); //column  lsb                列最低位
    for(m=0;m<10;m++)
	for(k=0;k<8;k++)
    {
		WriteData(lcd0[seg_buf[m]][k]);
		Delay10ms(100);
    }
	WriteComm(0x40);  //set scroll line         设置滚动一行
    WriteComm(0xb0+i+1);//set page address         设置页地址
    WriteComm(0x10); //column  msb                列最高位
    WriteComm(0x00); //column  lsb                列最低位
    for(m=0;m<10;m++)
	for(k=8;k<16;k++)
    {
		WriteData(lcd0[seg_buf[m]][k]);
		Delay10ms(100);
    }
}

LCD9648.H

#ifndef _LCD9648_h
#define _LCD9648_h
#include "reg51.h"

sbit CS0  = P0^0;                //片选
sbit RST  = P0^1;                //复位
sbit RS   = P2^7;                 //数据命令选择端
sbit SCL  = P2^6;                //SCL时钟端
sbit SDA  = P2^5;                //SDA数据端


//函数名:字符串到数码管段码的转换函数
//入口参数:seg_string(10个字节)待转换的字符串,将转换完的段码存到buf(8个字节)里
//返回值:无;
//函数功能:将seg_tran一一转换为数码管段码存储到seg_buf中 
void  Seg_Tran(unsigned char *seg_string,unsigned char *seg_buf);
void Delay10ms(unsigned int c);   //误差 0us
void SendDataSPI(unsigned char dat);
void WriteComm(unsigned char i);
void WriteData(unsigned char i);
void LCD_Init(void);
void Clear(void);
//void Clear_Lcd(void);
void Displine_font(unsigned char i,unsigned char j,unsigned char *font0,unsigned char *font1 );   //行扫屏;  //行扫屏
void Displine_num(unsigned char i,unsigned char *seg_buf);   //行扫屏

#endif

显示效果

 

 

  • 9
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值