📄 lcd.c
字号:
#include <C8051F020.h>
#define uint unsigned int
#define uchar unsigned char
#define x1 0x80
#define x2 0x88
#define y 0x80
#define comm 0
#define dat 1
sbit cs = P0^0; //串行口使能,高电平有效(作RS时,1为数据,0为指令)
sbit std = P0^1; //串口数据(作R/W时,1为读,0为写)
sbit sclk = P0^2; //串口时钟,高电平有效
sbit psb = P0^3; //H=并口; L=串口;
sbit rst = P0^4; //复位,低电平有效
void wr_lcd (uchar dat_comm,uchar content);
void delay (uint us);
Read_Data();
uchar code tab6[]={
/*-- 调入了一幅图像:这是您新建的图像 --*/
/*-- 宽度x高度=128x64 --*/
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,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,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,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x20,0x00,0x40,0x00,0x00,
0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x20,0x00,0x60,0x00,0x00,
0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,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,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,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,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,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
};
/*---------------系统初始化------------*/
void SysInitial()
{
uint i;
EA=0;
WDTCN=0xDE; //关闭看门狗
WDTCN=0xAD;
EA=1;
OSCXCN = 0x67; // 先选择外捕振荡器,频率为11.0592MHZ ,晶体振荡器方式1.6MHz<f≤3.2MHz
for (i=0; i < 256; i++) ; // 再延时(>1ms),
while (!(OSCXCN & 0x80)) ; // 等待外部晶振稳定
OSCICN = 0x88; // 选择外部晶振,允许时钟丢失检测
XBR0=0x00; //使能交叉开关
XBR1=0x00;
XBR2=0x42;
P3MDOUT=0xff;
P0MDOUT=0xff;
P2MDOUT=0xff;
P74OUT=0xff; //P4-P7脚设为推挽 作为输出用
}
/*------------------LCD初始化-----------------*/
void init_lcd (void)
{
rst=0; //复位
delay(100);
rst=1; //复位无效
psb=0; //H:并行 L:串行
wr_lcd (comm,0x30); //30---基本指令动作
wr_lcd (comm,0x01); //清屏,地址指针指向00H
delay (100); //清屏需较长时间
wr_lcd (comm,0x06); //光标右移,整体不移动
wr_lcd (comm,0x0c); //整体显示关,光标显示开,关反白闪烁
}
/*----------------显示图形-----------------*/
void img_disp (uchar code *img)
{
uchar i,j;
for(j=0;j<32;j++) //上半屏
{
for(i=0;i<8;i++)
{
wr_lcd (comm,0x34); //8位控制端口,选择扩充指令集
wr_lcd (comm,y+j); //选择图形区Y轴坐标
wr_lcd (comm,x1+i); //选择图形区X轴坐标
wr_lcd (comm,0x30); //选择基本指令集
wr_lcd (dat,img[j*16+i*2]); //写图形数据
wr_lcd (dat,img[j*16+i*2+1]);
}
}
for(j=32;j<64;j++) //下半屏
{
for(i=0;i<8;i++)
{
wr_lcd (comm,0x34);
wr_lcd (comm,y+j-32);
wr_lcd (comm,x2+i);
wr_lcd (comm,0x30);
wr_lcd (dat,img[j*16+i*2]);
wr_lcd (dat,img[j*16+i*2+1]);
}
}
wr_lcd (comm,0x36); //写入数据后选择图形显示
}
/*--------------显示点阵----------------*/
void lat_disp (uchar data1,uchar data2)
{
uchar i,j,k,x;
x=x1;
for(k=0;k<2;k++)
{
for(j=0;j<16;j++)
{
for(i=0;i<8;i++) //偶数行显示的点阵
{
wr_lcd (comm,0x34); //8位控制端口,选择扩充指令集
wr_lcd (comm,y+j*2);
wr_lcd (comm,x+i);
wr_lcd (comm,0x30); //选择基本指令集
wr_lcd (dat,data1); //写入数据
wr_lcd (dat,data1);
}
for(i=0;i<8;i++) //奇数行显示的点阵
{
wr_lcd (comm,0x34);
wr_lcd (comm,y+j*2+1);
wr_lcd (comm,x+i);
wr_lcd (comm,0x30);
wr_lcd (dat,data2);
wr_lcd (dat,data2);
}
}
x=x2;
}
wr_lcd (comm,0x36); //写入数据后选择显示
}
/*------------画点-------------*/
void Locat_Dot(uchar x_loc, uchar y_loc)
{
uchar Line,Column;
uchar move;
uint ori_data;
uint dot_data;
uchar value1,value2;
uint temp1,temp2,s;
uchar x;
uint n=0x80;
y_loc = 63 - y_loc ;
Column = x_loc/16;
Line = y_loc;
delay(100);
if(y_loc<16)
{
x=0x98;
Line=31-Line;
}
if((y_loc>=16)&&(y_loc<32))
{
x=0x88;
Line=31-Line;
}
if((y_loc>=32)&&(y_loc<48))
{
x=0x90;
Line=63-Line;
}
if(y_loc>=48)
{
x=0x80;
Line=63-Line;
}
wr_lcd (comm,0x34);
wr_lcd (comm,y+Line);
wr_lcd (comm,x+Column);
wr_lcd (comm,0x30);
wr_lcd (dat,0xaa);
wr_lcd (dat,0xbb);
wr_lcd (comm,0x36);
wr_lcd (comm,0x34);
wr_lcd (comm,y+Line);
wr_lcd (comm,x+Column);
delay(200);
s=Read_Data(); //虚读
delay(500);
temp1=Read_Data(); //实读
delay(500);
temp2=Read_Data();
delay(500);
ori_data=(temp1<<8)|temp2;
delay(200);
ori_data=0x0000;
move = x_loc%16;
dot_data = 0x8000>>move;
delay(500);
dot_data = dot_data | ori_data;
delay(200);
value1 = dot_data/256;
value2 = dot_data%256;
delay(200);
wr_lcd (comm,0x34);
wr_lcd (comm,n+Line);
wr_lcd (comm,x+Column);
wr_lcd (comm,0x30);
wr_lcd (dat,value1);
wr_lcd (dat,value2);
wr_lcd (comm,0x36);
delay(200);
}
/*--------------清DDRAM------------------*/
void clrram (void)
{
wr_lcd (comm,0x30);
wr_lcd (comm,0x01);
delay (180);
}
/*---------------------------------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
uchar a,i,j;
delay (50); //延时,等待内部动作完成
a=content;
cs=1;
sclk=0;
std=1;
for(i=0;i<5;i++) //写入5个1,作为启动位
{
sclk=1;
sclk=0;
}
std=0;
sclk=1;
sclk=0;
if(dat_comm) //判断写数据还是写命令
std=1; //data
else
std=0; //command
sclk=1;
sclk=0;
std=0; //写入1个0
sclk=1;
sclk=0;
for(j=0;j<2;j++) //分别写入高四位和低四位
{
for(i=0;i<4;i++)
{
a=a<<1;
std=CY;
sclk=1;
sclk=0;
}
std=0; //写入4个0
for(i=0;i<4;i++)
{
sclk=1;
sclk=0;
}
}
}
/*-----------------读出值--------------------*/
Read_Data()
{
uchar b1=0,b2=0;
uchar result,i,j;
cs=1;
sclk=0;
std=1;
for(i=0;i<5;i++) //写入5个1,作为启动位
{
sclk=1;
sclk=0;
}
std=1;
sclk=1;
sclk=0;
std=1;
sclk=1;
sclk=0;
std=0; //写入1个0
sclk=1;
sclk=0;
P0MDOUT=0xfd;
for(j=0;j<8;j++) //分别读出高四位和低四位
{
b1=b1<<1;
sclk=1;
sclk=0;
if(std)
b1++;
}
for(i=0;i<8;i++)
{
b2=b2<<1;
sclk=1;
sclk=0;
if(std)
b2++;
}
b2=b2>>4;
result=(0xf0&&b1)|(0x0f&&b2);
P0MDOUT=0xff;
return(result);
/* for(j=0;j<2;j++)
{
for(i=0;i<4;i++)
{
b=b|(uchar)std;//b:读回的状态值
if(j==1&&i==3);
else b=b<<1;
sclk=1; //sclk=1;
sclk=0; //sclk=0;
}
for(i=0;i<4;i++)
{
sclk=1; //sclk=1;
sclk=0; //sclk=0;
}
}
return(b); */
cs=0;
}
/*-----------------------------------*/
void delay (uint us) //delay time
{
while(us--);
}
/*------------------主程序--------------------*/
void main ()
{
SP=0x5f;
SysInitial();
init_lcd ();
while (1)
{
clrram();
delay(8000);
lat_disp (0x00,0x00);
delay(8000);
img_disp (tab6);
delay(8000);
Locat_Dot(6,36);
delay(8000);
Locat_Dot(6,34);
delay(8000);
Locat_Dot(6,32);
delay(8000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -