⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 anyposition.c

📁 51单片机开发与应用技术详解(珍藏版)PPT及源码
💻 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 + -