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

📄 lcd_picure.c

📁 在12864上显示图片!!hehe ,很有成就感的
💻 C
📖 第 1 页 / 共 2 页
字号:
#include < reg52.h >
#include < intrins.h >

#define lcd_Data      P0  //数据口
		sbit LCD_RS = P2^2;       //数据命令选择端
        sbit LCD_RW = P2^1; 	  //读写控制
        sbit LCD_EN = P2^0;       //使能端
        sbit lcd_Data7=P0^7;

unsigned char count1,count2,lcd_x,lcd_y,data1,data2,i,j;

void initial(void);
void clear_LCD(void);
char read_data(void);
void send_data(unsigned char dat);
void send_cmd(unsigned char cmd);
void lcd_check_busy(void);
void display1(unsigned char x_addr,unsigned char dat1,unsigned char dat2);
void display2(unsigned char x_addr,unsigned char data1);
//void picture_display(const unsigned char *s);
void picture_display(unsigned char s1,unsigned char s2);
void set_dot(unsigned char x,unsigned char y);
void line(unsigned char start_x,unsigned char start_y,unsigned char end_x,unsigned char end_y);

unsigned char temp;
void main(void)
{
  initial();
  temp=0x80;
  lcd_x=0x90;
  lcd_y=0x80;
  while(1)
  {

        lcd_y=0x80;                     //设置液晶下半部分坐标
        lcd_x=0x90;
        _nop_();_nop_();_nop_();
        for(i=0;i<32;i++)           //写入液晶下半图象部分
        {
            picture_display(0x00,0x00);
            lcd_y++;                    //y轴地址加1
        }
        lcd_y=0x80;                     //设置液晶下半部分坐标
        lcd_x=0x91;
        _nop_();_nop_();_nop_();
        for(i=0;i<32;i++)           //写入液晶下半图象部分
        {
            picture_display(0x00,0x00);
            lcd_y++;                    //y轴地址加1
        }
        lcd_y=0x80;                     //设置液晶下半部分坐标
        lcd_x=0x92;
        _nop_();_nop_();_nop_();
        for(i=0;i<32;i++)           //写入液晶下半图象部分
        {
            picture_display(0x00,0x00);
            lcd_y++;                    //y轴地址加1
        }
        lcd_y=0x80;                     //设置液晶下半部分坐标
        lcd_x=0x93;
        _nop_();_nop_();_nop_();
        for(i=0;i<32;i++)           //写入液晶下半图象部分
        {
            picture_display(0x00,0x00);
            lcd_y++;                    //y轴地址加1
        }
        lcd_y=0x80;                     //设置液晶下半部分坐标
        lcd_x=0x94;
        _nop_();_nop_();_nop_();
        for(i=0;i<32;i++)           //写入液晶下半图象部分
        {
            picture_display(0x00,0x00);
            lcd_y++;                    //y轴地址加1
        }
        lcd_y=0x80;                     //设置液晶下半部分坐标
        lcd_x=0x95;
       _nop_();_nop_();_nop_();
        for(i=0;i<32;i++)           //写入液晶下半图象部分
        {
            picture_display(0x00,0x00);
            lcd_y++;                    //y轴地址加1
        }
        lcd_y=0x80;                     //设置液晶下半部分坐标
        lcd_x=0x96;
        _nop_();_nop_();_nop_();
        for(i=0;i<32;i++)           //写入液晶下半图象部分
        {
            picture_display(0x00,0x00);
            lcd_y++;                    //y轴地址加1
        }
        lcd_y=0x80;                     //设置液晶下半部分坐标
        lcd_x=0x97;
        _nop_();_nop_();_nop_();
        for(i=0;i<32;i++)           //写入液晶下半图象部分
        {
            picture_display(0x00,0x00);
            lcd_y++;                    //y轴地址加1
        }
        lcd_y=0x80;                     //设置液晶下半部分坐标
        lcd_x=0x98;
        _nop_();_nop_();_nop_();
        for(i=0;i<32;i++)           //写入液晶下半图象部分
        {
            picture_display(0x00,0x00);
            lcd_y++;                    //y轴地址加1
        }
        lcd_y=0x80;                     //设置液晶下半部分坐标
        lcd_x=0x99;
        _nop_();_nop_();_nop_();
        for(i=0;i<32;i++)           //写入液晶下半图象部分
        {
            picture_display(0x00,0x00);
            lcd_y++;                    //y轴地址加1
        }
        lcd_y=0x80;                     //设置液晶下半部分坐标
        lcd_x=0x9a;
        _nop_();_nop_();_nop_();
        for(i=0;i<32;i++)           //写入液晶下半图象部分
        {
            picture_display(0x00,0x00);
            lcd_y++;                    //y轴地址加1
        }
        lcd_y=0x80;                     //设置液晶下半部分坐标
        lcd_x=0x9b;
        _nop_();_nop_();_nop_();
        for(i=0;i<32;i++)           //写入液晶下半图象部分
        {
            picture_display(0x00,0x00);
            lcd_y++;                    //y轴地址加1
        }
        lcd_y=0x80;                     //设置液晶下半部分坐标
        lcd_x=0x9c;
        _nop_();_nop_();_nop_();
        for(i=0;i<32;i++)           //写入液晶下半图象部分
        {
            picture_display(0x00,0x00);
            lcd_y++;                    //y轴地址加1
        }
        lcd_y=0x80;                     //设置液晶下半部分坐标
        lcd_x=0x9d;
        _nop_();_nop_();_nop_();
        for(i=0;i<32;i++)           //写入液晶下半图象部分
        {
            picture_display(0x00,0x00);
            lcd_y++;                    //y轴地址加1
        }
        lcd_y=0x80;                     //设置液晶下半部分坐标
        lcd_x=0x9e;
        _nop_();_nop_();_nop_();
        for(i=0;i<32;i++)           //写入液晶下半图象部分
        {
            picture_display(0x00,0x00);
            lcd_y++;                    //y轴地址加1
        }
        lcd_y=0x80;                     //设置液晶下半部分坐标
        lcd_x=0x9f;
       _nop_();_nop_();_nop_();
        for(i=0;i<32;i++)           //写入液晶下半图象部分
        {
            picture_display(0x00,0x00);
            lcd_y++;                    //y轴地址加1
        }
       line(1,30,120,5);

       line(5,5,50,50);

       line(80,10,30,50);

    while(1);
  }
}

/******************************************************/
/*******************    液晶显示     ******************/
/******************************************************/
void lcd_check_busy(void)
{
	 _nop_();_nop_();_nop_();
	  LCD_RS =0;//RC5
	 _nop_();_nop_();_nop_();
	  LCD_RW =1;//RC4
	  while(1)
	  {
	    LCD_EN=1;//RC3
	    _nop_();_nop_();_nop_();
	    if(lcd_Data7==0)break;
	   _nop_();_nop_();_nop_();
	  } 
      LCD_EN=0;
}

void send_cmd(unsigned char cmd)
{
	  lcd_check_busy();
	 _nop_();_nop_();_nop_();
	  LCD_RS=0;
	 _nop_();_nop_();_nop_();
	  LCD_RW=0;
	 _nop_();_nop_();_nop_();
	  LCD_EN=1;
	 _nop_();_nop_();_nop_();
	  lcd_Data=cmd;
	 _nop_();_nop_();_nop_();
	  LCD_EN=0;               //停止工作
}

void initial(void)
{
	 _nop_();_nop_();_nop_();
	  send_cmd(0x30);//基本指令集;
	 _nop_();_nop_();_nop_();
	  send_cmd(0x0c);//整体显示,关光标,不闪烁;
	 _nop_();_nop_();_nop_();
	  send_cmd(0x01);//清DDRAM;
	 _nop_();_nop_();_nop_();
	  send_cmd(0x02);//DDRAM地址归位;
	 _nop_();_nop_();_nop_();
	  send_cmd(0x80);//设定DDRAM 7位地址000,0000到地址计数器AC;
	 _nop_();_nop_();_nop_();
	  send_cmd(0x04);//指定在资料写入或读取时,光标的移动方向,
	                          //DDRAM的地址计数器(AC)加一;
	 _nop_();_nop_();_nop_();
	  send_cmd(0x0c);//整体显示,开光标,开闪烁;

}

void clear_LCD(void)
{
	  send_cmd(0x01);
     _nop_();_nop_();_nop_();
	  send_cmd(0x34);
     _nop_();_nop_();_nop_();
	  send_cmd(0x30);
}

char read_data(void)
{
	 unsigned char read_data;
	 lcd_check_busy();
	 LCD_RS=1;
_nop_();_nop_();_nop_();
	 LCD_RW=1;
_nop_();_nop_();_nop_();
	 LCD_EN=1;
_nop_();_nop_();_nop_();
	 read_data=lcd_Data;
	 LCD_EN=0;
	 return (read_data);
}

void send_data(unsigned char dat)
{
	  lcd_check_busy();
	  LCD_RS =1;
_nop_();_nop_();_nop_();
	  LCD_RW =0;
_nop_();_nop_();_nop_();
	  LCD_EN =1;
_nop_();_nop_();_nop_();
	  lcd_Data =dat;
_nop_();_nop_();_nop_();
	  LCD_EN =0;
}

void display1(unsigned char x_addr,unsigned char data1,unsigned char data2)
{
	  send_cmd(x_addr);//1xxx,xxxx设定DDRAM7位地址xxx,xxxx到地址计数器AC;
	  send_data(data1);
	  send_data(data2);
}


void display2(unsigned char x_addr,unsigned char data1)
{
	 send_cmd(x_addr);//1xxx,xxxx设定DDRAM7位地址xxx,xxxx到地址计数器AC;
	 send_data(data1);
}

void picture_display(unsigned char s1,unsigned char s2)
{
	  //unsigned char dat1,dat2;
	  lcd_check_busy();
	  send_cmd(0x34);                     //扩充指令集,绘图显示关闭
	  _nop_();_nop_();_nop_();
//	  send_cmd(0x80);
	  send_cmd(lcd_y);                    
	  send_cmd(lcd_x);
//	  i=read_data();
//	  j=read_data();
//	  s2 =(s2|j);
//	  s1 =(s1|i);
	_nop_();_nop_();_nop_();
	  send_data(s1);
	_nop_();_nop_();_nop_();
	  send_data(s2);
	_nop_();_nop_();_nop_();
	  send_cmd(0x36);                     //扩充指令集,绘图显示关闭
	_nop_();_nop_();_nop_();
	  send_cmd(0x30);                     //恢复到基本指令集
}
/*
void set_dot(unsigned char x,unsigned char y)
{
  unsigned char x1,x2;
  if(y>31)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -