📄 anyposition.c
字号:
#include<reg52.h>
#include<stdio.h>
unsigned data i;
unsigned char q;
unsigned char *p2,*pp; //建立数组指针
unsigned char wbyte;
unsigned char Column; //定义列
unsigned char Page; //定义页
sbit E=P3^2; //读写使能信号,1有效
sbit R_W=P3^1; //读写选择信号;1为读选通,0为写选通
sbit RS=P3^0;
sbit D_I=P3^0; //数据指令选择信号;1为数据操作,0为写指令或读状态
unsigned char data j;
unsigned char data k;
/********************扩充指令集画图********************/
unsigned char data z;//图形数组的页,为实际点阵行数
unsigned char data y;//图形数组的列,为实际点阵列数除以8
unsigned char data Column;//起始点设定:为在液晶中显示的实际起始列
unsigned char data Page;//起始点设定:为在液晶中显示的实际起始行
char code MyTu2[32][4]= /*图形数组,演示图形的任意位置显示*/
{
0xAA,0x8A,0xE8,0xAA,0x00,0x5D,0xFC,0x00,0x2A,0xFB,0xBF,0xAA,0x01,0x51,0x15,0x40,
0xAF,0xBF,0xFA,0xEA,0x05,0xDD,0x5D,0xD0,0x2E,0xF8,0x0F,0xBA,0x15,0x40,0x01,0x14,
0xBF,0x8E,0x00,0xFE,0x75,0x05,0x00,0x54,0x3A,0x03,0x00,0x6E,0x74,0x00,0x00,0x17,
0xFE,0x02,0xBE,0x3F,0x44,0x01,0xC4,0x15,0xEC,0x0F,0x82,0x3B,0x74,0x01,0x07,0x17,
0xFC,0x3B,0x8E,0x3F,0x54,0x41,0x5C,0x15,0xEC,0x63,0xA8,0x3B,0x54,0x11,0x00,0x17,
0xEE,0x0A,0x00,0x2F,0x54,0x01,0x00,0x57,0x3B,0x03,0x02,0x7E,0x11,0x01,0x00,0x54,
0xBB,0xC3,0x81,0xFE,0x1D,0xC0,0x05,0xDC,0x2E,0xFA,0x2F,0xBA,0x07,0x77,0x75,0x70,
0xAB,0xEB,0xFB,0xEA,0x01,0xD7,0x55,0xC0,0x2A,0xBF,0xFF,0xAA,0x00,0x17,0x74,0x00,
};
void WCOM(unsigned char d) //写指令程序
{
R_W=1;
D_I=0; //设置状态
Loop:
P1=0xFF;
E=1; //使能有效
q=P1; //将p1口状态读入
E=0; //关闭使能信号
if(q&0x80) //判断屏幕是否忙
{
goto Loop; //若忙,循环等待
}
R_W=0;
D_I=0; //写数据指令
P1=d; //将数据送入p1口
E=1; //使能信号开
E=0; //使能信号关
}
void Dat(unsigned char d)
{
R_W=1;
D_I=0; //读状态指令
Loop:
P1=0xFF;
E=1; //使能
q=P1;
E=0;
if(q&0x80)
{
goto Loop;
} //判忙
D_I=1; //送数据指令
R_W=0;
P1=d;
E=1; //使能信号开
E=0; //使能信号关
}
void Clearlcd()
{
D_I=0;
R_W=0;
P1=0x01;
WCOM(0x01); //清除显示
}
void Imim()
{
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
E=0;
WCOM(0x38); //功能设定
WCOM(0x08); //关显示指令
WCOM(0x06); //游标右移
Clearlcd(); //清屏
WCOM(0x0c); //开显示指令
}
void Tuxing()
{
unsigned char data v;
unsigned char data w;
unsigned char data x;
unsigned char data h;
WCOM(0x34); //功能设定
WCOM(0x36); //扩充功能设定
pp=p2;
pp=pp+16*y*2;
for(h=0;h<z/2;h++) //页循环
{
v=Column|0x80;
w=Page|0x80;
WCOM(w); //送入起始页地址
WCOM(v); //送入起始列地址
Page++; //准备对下一页进行操作
for(x=0;x<2*y;x++) //列循环
{
if(x<y)
{
wbyte=*p2;
Dat(wbyte); //循环送入图形数据
p2=p2+1;
}
else
{
wbyte=*pp;
Dat(wbyte); //循环送入图形数据
pp=pp+1;
}
}
}
}
void OneTuxing()
{
unsigned char data v;
unsigned char data w;
unsigned char data x;
unsigned char data h;
WCOM(0x34); //功能设定
WCOM(0x36); //扩充功能设定
for(h=0;h<z;h++) //页循环
{
v=Column|0x80;
w=Page|0x80;
WCOM(w); //送入起始页地址
WCOM(v); //送入起始列地址
Page++; //准备对下一页进行操作
for(x=0;x<y;x++) //列循环
{
wbyte=*p2;
Dat(wbyte); //循环送入图形数据
p2++;
}
}
}
void Clearlcd1()
{
unsigned char data Disp_Page;
unsigned char data i;
unsigned char data j;
for(i=0;i<64;i++) //共32页
{
Disp_Page=i|0x80; //设置页地址
WCOM(Disp_Page); //送入页地址
WCOM(0x80); //送入起始列地址
for(j=0;j<32;j++)
{
Dat(0x00); //清屏
}
}
}
/********************主程序********************/
void main()
{
Imim(); //初始化
Clearlcd1(); //扩充指令集清屏
z=32; //图形数组的页,为实际点阵行数
y=4; //图形数组的列,为实际点阵列数除以8
Column=5; //起始点设定:为在液晶中显示的实际起始列,一列占一个汉字
Page=0; //起始点设定:为在液晶中显示的实际起始行
p2=MyTu2;
OneTuxing(); //显示一个小的图标
while(1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -