📄 3510.c
字号:
/*================================================
3510i符液晶屏驱动演示程序
==================================================
RST BIT P1.0 ;复位
CS BIT P1.1 ;片选
SDATA BIT P1.2 ;串行数据
SCLK BIT P1.3 ;串行时钟
[注]:AT89C51的晶振频率为12MHz
============================================================================*/
// 产生汇编文件
#include <reg51.h>
#include <math.h>
//========= 变量类型标识的宏定义,大家都喜欢这么做 ==============
#define Uchar unsigned char
#define Uint unsigned int
#define CMD 0
#define DATA 1
sbit RST =P2^3;
sbit CS =P2^2;
sbit SDATA=P2^1;
sbit SCLK =P2^0;
sbit ACC0=ACC^0;
sbit ACC1=ACC^1;
sbit ACC2=ACC^2;
sbit ACC3=ACC^3;
sbit ACC4=ACC^4;
sbit ACC5=ACC^5;
sbit ACC6=ACC^6;
sbit ACC7=ACC^7;
Uchar code asci[];
Uchar code bmp[];
void LCD_Clear(bit color);
void test(void);
void test2(void);
void Delay400Ms(void);
void COLORSET(bit color);
void SENDLCM(Uchar Sdata, Uchar cd);
void Delay5Ms(void);
void DATAOVER(void);
void LCD_Initialize(void);
void test3(unsigned long kk);
void LCD_Drawbmp(bit color);
void LCD_Drawasc(Uchar x, Uchar y,Uchar n,Uchar color,Uchar pen);
void LCD_Drawhz(Uchar x, Uchar y,Uchar n,Uchar color,Uchar pen);
void LCD_DrawLine(Uchar x1, Uchar y1, Uchar x2, Uchar y2,Uchar color);
void LCD_DrawRectangle(Uchar x1, Uchar y1, Uchar x2, Uchar y2,Uchar color);
void LCD_Drawtime(Uchar x, Uchar y,Uchar n,Uchar color,Uchar pen);
void LCD_Drawdd(Uchar x, Uchar y,Uchar n,Uchar pen);
void LCD_DrawPoint(Uchar x, Uchar y,Uchar color);
/*
void LCD_Drawbmp(bit color)
{
Uchar x,y,*pic;
pic =bmp;
SENDLCM(0x2C,CMD );//memory write
if (color==1)
{
}
else
{
for(y = 0; y < 67; y ++)
for(x = 0; x < 98; x ++)
{
SENDLCM(*pic,DATA );
pic++;
}
}
DATAOVER();
}
*/
/*
//画点
void LCD_DrawPoint(Uchar x, Uchar y,Uchar color)
{
SENDLCM(0x2a,CMD );//column address set
SENDLCM(x,DATA );
SENDLCM(x,DATA );
DATAOVER();
SENDLCM(0x2B,CMD );//page address set
SENDLCM(y,DATA );
SENDLCM(y,DATA );
DATAOVER();
SENDLCM(0x2C,CMD ); //memory write
SENDLCM(color,DATA );
DATAOVER();
}
//画线
void LCD_DrawLine(Uchar x1, Uchar y1, Uchar x2, Uchar y2,Uchar color)
{
Uint x, y, t;
if((x1 == x2) && (y1 == y2))
LCD_DrawPoint(x1, y1,color);
else if(abs(y2 - y1) > abs(x2 - x1))
{
if(y1 > y2)
{
t = y1;
y1 = y2;
y2 = t;
t = x1;
x1 = x2;
x2 = t;
}
for(y = y1; y <= y2; y ++)
{
x = (y - y1) * (x2 - x1) / (y2 - y1) + x1;
LCD_DrawPoint(x, y,color);
}
}
else
{
if(x1 > x2)
{
t = y1;
y1 = y2;
y2 = t;
t = x1;
x1 = x2;
x2 = t;
}
for(x = x1; x <= x2; x ++)
{
y =(x - x1) * (y2 - y1) / (x2 - x1) + y1;
LCD_DrawPoint(x, y,color);
}
}
}
//画距形
void LCD_DrawRectangle(Uchar x1, Uchar y1, Uchar x2, Uchar y2,Uchar color)
{
LCD_DrawLine(x1, y1, x2, y1,color);
LCD_DrawLine(x2, y1, x2, y2,color);
LCD_DrawLine(x2, y2, x1, y2,color);
LCD_DrawLine(x1, y2, x1, y1,color);
}
*/
//************************
//清屏:color=1为4096色模式清屏
// :color=0为256色模式清屏
//************************
void LCD_Clear(bit color)
{
Uchar x, y;
SENDLCM(0x2a,CMD );//column address set
SENDLCM(0,DATA );
SENDLCM(97,DATA );
DATAOVER();
SENDLCM(0x2B,CMD );//page address set
SENDLCM(0,DATA );
SENDLCM(66,DATA );
DATAOVER();
SENDLCM(0x2C,CMD );//memory write
if (color==1)
{
for(y = 0; y < 67; y ++)
for(x = 0; x < 147; x ++)
SENDLCM(0,DATA );
}
else
{
for(y = 0; y < 67; y ++)
for(x = 0; x < 98; x ++)
SENDLCM(0,DATA );
}
DATAOVER();
}
//************************
//颜色模式设置:color=1为4096色模式
// :color=0为256色模式
//************************
void COLORSET(bit color)
{
if (color==1) {
SENDLCM(0x3a, CMD); //interface pixel format
SENDLCM(0x03, DATA); //0x03 为4096色,0x02为256色
DATAOVER();
}
else
{
SENDLCM(0x3a, CMD); //interface pixel format
SENDLCM(0x02, DATA); //0x03 为4096色,0x02为256色
DATAOVER();
SENDLCM(0x2d, CMD); //colour set
//red
SENDLCM(0x00, DATA);
SENDLCM(0x02, DATA);
SENDLCM(0x03, DATA);
SENDLCM(0x04, DATA);
SENDLCM(0x05, DATA);
SENDLCM(0x06, DATA);
SENDLCM(0x08, DATA);
SENDLCM(0x0f, DATA);
//green
SENDLCM(0x00, DATA);
SENDLCM(0x02, DATA);
SENDLCM(0x03, DATA);
SENDLCM(0x04, DATA);
SENDLCM(0x05, DATA);
SENDLCM(0x06, DATA);
SENDLCM(0x08, DATA);
SENDLCM(0x0f, DATA);
//blue
SENDLCM(0x00, DATA);
SENDLCM(0x03, DATA);
SENDLCM(0x06, DATA);
SENDLCM(0x0f, DATA);
DATAOVER();
}
}
//***********************
//3510i液晶初始化
//***********************
void LCD_Initialize(void)
{
Uint i;
P1=0xFF;
RST=0;
Delay5Ms();
RST=1;
CS=0;
SCLK=0;
SDATA=0;
SENDLCM(0x01, CMD); // LCD Software Reset
DATAOVER();
Delay5Ms();
SENDLCM(0xC6, CMD); // Initial Escape
DATAOVER();
SENDLCM(0xB9, CMD); // Refresh set
SENDLCM(0x00, DATA);
DATAOVER();
SENDLCM(0xB6, CMD); // Display Control
SENDLCM(128, DATA);
SENDLCM(128, DATA);
SENDLCM(129, DATA);
SENDLCM(84, DATA);
SENDLCM(69, DATA);
SENDLCM(82, DATA);
SENDLCM(67, DATA);
DATAOVER();
SENDLCM(0xB3, CMD); // Gray Scale Position
SENDLCM(1, DATA);
SENDLCM(2, DATA);
SENDLCM(4, DATA);
SENDLCM(8, DATA);
SENDLCM(16, DATA);
SENDLCM(30, DATA);
SENDLCM(40, DATA);
SENDLCM(50, DATA);
SENDLCM(60, DATA);
SENDLCM(70, DATA);
SENDLCM(80, DATA);
SENDLCM(90, DATA);
SENDLCM(100, DATA);
SENDLCM(110, DATA);
SENDLCM(127, DATA);
DATAOVER();
SENDLCM(0xB5, CMD); // Gamma Curve Set
SENDLCM(1, DATA);
DATAOVER();
SENDLCM(0xBD, CMD); // Power Control
SENDLCM(0x00, DATA);
DATAOVER();
SENDLCM(0xBE, CMD); // Power Control
SENDLCM(4, DATA);
DATAOVER();
SENDLCM(0x11, CMD); // Sleep out
DATAOVER();
SENDLCM(0xBA, CMD); // Power Control
SENDLCM(0x7F, DATA);
SENDLCM(0x03, DATA);
DATAOVER();
SENDLCM(0x36, CMD); // 扫描方式
SENDLCM(0xc0, DATA);
DATAOVER();
SENDLCM(0xB7, CMD); // Temperature gradient set
for(i=0; i<14; i++) {
SENDLCM(0, DATA);
}
DATAOVER();
SENDLCM(0x29, CMD); // Power Control
DATAOVER();
SENDLCM(0x03, CMD); // Booster Voltage ON
DATAOVER();
for(i=0; i<8; i++) { // Booster Voltage stabilisieren lassen
Delay5Ms();
}
SENDLCM(0x20, CMD); // Inversion control
DATAOVER();
SENDLCM(0x25, CMD); // Write contrast
SENDLCM(63, DATA);
DATAOVER();
}
//************************
//发送命令/数据到液晶
//************************
void SENDLCM(Uchar Sdata, Uchar cd)
{
CS=0;
SCLK=0;
if (cd==CMD)
SDATA=0;
else
SDATA=1;
SCLK=1;
ACC=Sdata;
SCLK=0;
SDATA=ACC7;
SCLK=1;
SCLK=0;
SDATA=ACC6;
SCLK=1;
SCLK=0;
SDATA=ACC5;
SCLK=1;
SCLK=0;
SDATA=ACC4;
SCLK=1;
SCLK=0;
SDATA=ACC3;
SCLK=1;
SCLK=0;
SDATA=ACC2;
SCLK=1;
SCLK=0;
SDATA=ACC1;
SCLK=1;
SCLK=0;
SDATA=ACC0;
SCLK=1;
}
//************************
//发送数据帧结束
//************************
void DATAOVER(void) {
CS=1; // CS wieder auf 1
}
// 短延时
void Delay5Ms(void)
{
Uint i = 5552;
while(i--);
}
//长延时
void Delay400Ms(void)
{
Uchar i = 5;
Uint j;
while(i--)
{
j=7269;
while(j--);
};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -