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

📄 12232.c

📁 12232显示器驱动程序, 可用于各类嵌入式单片机
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
#include <absacc.h>
#include <stdio.h>

    #define W_CM XBYTE[0x8000];  //;写指令代码地址A,CSA CSB高电平有效!
    #define R_SM XBYTE[0x8200];  //;读状态字地址A
    #define W_DM XBYTE[0x8100];  //;写显示数据地A
    #define R_DM XBYTE[0x8300];  //;读显示数据地址A
    #define W_CS XBYTE[0x9000];   // ;写指令代码地址B
    #define R_SS XBYTE[0x9200];   // ;读状态字地址B
    #define W_DS XBYTE[0x9100];   //;写显示数据地址B
    #define R_DS XBYTE[0x9300];   //;读显示数据地址B

#define disp_on 0xaf   //显示关闭
#define disp_off 0xae   //显示打开
#define disp_start_line 0xc0   //显示起始地址
#define page_addr_set 0xb8   //页地址
#define col_addr_set 0x00   //列地址
#define status_busy 0x80   //0=ready
#define moderwite 0xee   //写模式
#define dynamic_driver 0xa4  //动态驱动
#define adc_select 0xa0   //clockwise
#define clk32 0xa9   //刷新时钟设置1/32
#define clk16 0xa8   //刷新时钟设置1/16
#define reset 0xe2   //软件复位
#define uchar unsigned char
#define uint unsigned int


//设汉字的数据
uchar code num[11][16]=
  {
    0x00,0xe0,0x10,0x08,0x08,0x10,0xe0,0x00,0x00,0x0f,0x10,0x20,0x20,0x10,0x0f,0x00,   //0
    0x00,0x10,0x10,0xfb,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3f,0x20,0x20,0x00,0x00,    //1
    0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,    //2
    0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0e,0x00,    //3
    0x00,0x00,0xc0,0x20,0x10,0xf8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3f,0x24,0x00,    //4
    0x00,0xf8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0e,0x00,     //5
    0x00,0xe0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0f,0x11,0x20,0x20,0x11,0x0e,0x00,     //6
    0x00,0x38,0x08,0x08,0xc8,0x38,0x08,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,     //7
    0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1c,0x22,0x21,0x21,0x22,0x1c,0x00,     //8
    0x00,0xe0,0x10,0x08,0x08,0x10,0xe0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0f,0x00,     //9
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,      //.
    };



//判断主窗口忙
 void wait_readym(void)
  {
    data uchar status;
	status=R_SM;
	_nop_();
	while (status&status_busy);
  }


//判断从窗口忙
  void wait_readys(void)
   {
     data uchar status;
	 status=R_SS;
	 _nop_();
	 while (status&status_busy);
   }



//发指令instruction到主窗口
  void send_mi(uchar instruction)
   {
     wait_readym();//判断忙
	XBYTE[0x8000]=instruction;   // 写指令
   }


  //发数据到主窗口
  void send_md(uchar c)
   {
     wait_readym();   //判断忙
	 XBYTE[0x8100]=c;     //写数据
   }


 //发指令到从窗口
 void send_si (uchar instruction)
  {
    wait_readys();  //判断忙
	XBYTE[0x9000]=instruction;//写指令
  }

//发数据到从窗口
  void send_sd (uchar c)
   {
     wait_readys();   //判断忙
	 XBYTE[0x9100]=c;
   }

//12232lcd初始化
 void lcd_init(void)
  {
   send_mi(reset);     //复位
   send_si(reset);

   send_mi(disp_off);     //关闭显示
   send_si(disp_off);

   send_mi(dynamic_driver);     //动态驱动
   send_si(dynamic_driver);

   send_mi(adc_select);     //clockwise
   send_si(adc_select);

   send_mi(moderwite);      //写模式结束
   send_si(moderwite);

   send_mi(col_addr_set);        //归回零列,设定起始行首
   send_mi(disp_start_line);
   send_si(col_addr_set);
   send_si(disp_start_line);

   send_mi(disp_on);      //开显示
   send_si(disp_on);
  }


//清屏函数
 void lcd_clr(void)
  {
    uchar i,page;
	for (page=0;page<4;page++)
	  {
	    send_mi(page_addr_set|page);
		send_si(page_addr_set|page);
		send_mi(0X00);
		send_si(0X00);
		for (i=0;i<62;i++)
		  {
		    send_md(0x00);
			send_sd(0x00);
		   }
	   }
	}


//同时设置主(右)从(左)显示页为0-3页
 void set_page(uchar page)
   {
     send_mi(page_addr_set|page);
	 send_si(page_addr_set|page);
   }

//同时设置主(右)从(左)显示列为0-61列
 void set_address(uchar address)
  {
    send_mi(address&0x7f);
    send_si(address&0x7f);
  }


  void putchar_l(uchar c)
   {
     send_md(c);
    }


  void putchar_r(uchar c)
   {
     send_sd(c);
    }


//画图函数, col横坐标,layer,表示上下层,width是图形的可宽度,高固定为16 bmp图形指针
 void draw_bmp(uchar col,uchar layer,uchar width,uchar *bmp)
   {
     uchar x;
	 uchar address;
	 uchar p=0;
     uchar page=0;
	 uchar window=0;
         uchar wid=width;
	 if(layer) page=2;
	 for(x=col;x<col+width;x++)
	   {


	     if(x>121)return;       //防止显示乱码
		 if(x>60)
		  {
		    window=1;
	        address=x%60;
		  }
		else
		  {
		   address=x;
		   }

		set_page(page);
		set_address(address);

		if (window)
		  {
		    putchar_r(bmp[p]);
		   }
		 else
		   {
		     putchar_l(bmp[p]);
		   }

		 set_page(page+1);
		 set_address(address);

		 if(window)
		   {
            putchar_r(bmp[p+width]);
		    }
		  else
		    {
			 putchar_l(bmp[p+width]);
			 }
		   p++;
                   width=wid;
		   }
		}


//延时程序
 void delay(uchar i)
  {
    uchar j,k;
	for(k=i;k<255;k++)
	  for(j=0;j<255;j++)
	   { j++;
             j--;
           }

   }

//主函数
  void main(void)
   {  uchar i;
      uchar j=0;
      uchar k;
     //P0=0xff;
	 //P1=0xff;
	 //P2=0xff;
	 //P3=0xff;
	 delay(100);
	// lcd_init();         //初始化屏幕
    // lcd_init();
	 lcd_init();
	 lcd_clr();         //清屏
           i=27/10;
           k=27%10;
           //m=(27.3-i*10-k)/0.1;
             draw_bmp(j,0,8,num[i]);
              j=j+8;
             draw_bmp(j,0,8,num[k]);
              j=j+8;
             draw_bmp(j,0,8,num[10]);
             draw_bmp(2,1,8,num[8]);
              //j=j+8;
             //draw_bmp(j,0,8,num[m]);


           //draw_bmp(1,0,8,num[10]);
       //for(;;);

	}



⌨️ 快捷键说明

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