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
显示效果