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

📄 lcd12864.c

📁 PIC18F4580计算频率的程序
💻 C
字号:
#include<PIC18.h>
#include "def.h"
#include "lib.h"

/*
将整型数据分离开
*/
void data_change(uint data)
{
 uint a=data;
 display_data[0]=(uchar)(a%10);
 a/=10;
 display_data[1]=(uchar)(a%10);
 a/=10;
 display_data[2]=(uchar)(a%10);
 a/=10;
 display_data[3]=(uchar)(a%10);
 }
 

/*
串行发送一个字节数据
*/
void data_send(uchar data)
{
 uchar i,s,temp;
  s=data; 
    sclk=0; 
      for(i=0;i<8;i++) 
       {
       	sclk=0; 
        delay(1);
        temp=s&0x80; 
        if(temp)
         {lcd_di=1;} 
        else 
        {lcd_di=0;} 
        sclk=1;    
        s=s<<1;   
       } 
       
}
 
/*************************************************/ 
//写命令,串行模式 
/*************************************************/ 
void w_com(unsigned char x) 
{ 
   a0=0; 
   cs1=0; 
   data_send(x); 
} 
 
/*************************************************/ 
//写数据,串行模式 
/*************************************************/ 
void wdata(unsigned char dat) 
{ 
   a0=1; 
   cs1=0;                                  
   data_send(dat); 
} 
 

  
void display_map(
        const uchar *mapdata,//显示图形时的数据指针
        uchar startpage,//起始页面
        uchar endpage,//终止页面
        uchar startsege,//起始列
        uchar endsege//终止列
        )
{ 
    uchar  seg,page,const *data= mapdata;; 
    for(page= startpage;page<= endpage;page++)  //写页地址共 8 页  0xb0----0xb8 
    {   
      lcd_setpage(page);                      
      lcd_setpage( startsege);             
      for(seg=startsege;seg<=endsege;seg++)//写列 
       wdata(*mapdata++); 
    } 
} 

void display_ascii(	uchar dispnum,//需要显示的字符数
                    const uchar **dispdata,//指向显示内容地址的指针
                    uchar startpage,//起始页面
                    uchar startsege//起始列
      )//显示ASCII码
{
	        uchar num,i;
			lcd_setpage(startpage);    //设置起始页面和起始位置
			lcd_setcol(startsege); 
			  for(num=0;num<dispnum;num++)
			     {
			     for(i=0;i<=4;i++)  //一个字符有效数据共5列
			     wdata(*(*( dispdata+num)+i));
			     wdata(0x00);       //补充空余的3列
			     wdata(0x00);
			     wdata(0x00);
			     }
}

void display_hanzi(	uchar dispnum,//需要显示的字符数
                    const uchar **dispdata,//指向显示内容地址的指针
                    uchar startpage,//起始页面
                    uchar startsege//起始列
                  )
{
	    uchar num,i;
          for(num=0;num<dispnum;num++)
			     {
			     	lcd_setpage(startpage);//写上半行
			     	lcd_setcol(startsege+num<<4);
			     	for(i=0;i<16;i++)
                    wdata(*(*(dispdata+num)+i));
                      //wdata(0xff);
			     	lcd_setpage(startpage+1);//页面更改,写下半行
			     	lcd_setcol(startsege+num<<4);
			     	for(i=16;i<32;i++)
			     		wdata(*(*(dispdata+num)+i));
                     //wdata(0xff);
			     }
	}
 /*
 用于将SO128*64液晶屏复位
 */
void lcd_rst(void)
 {
  rst=0;
  delay(10);
  rst=1;
 }
 /*
lcd打开还是关断    1:打开 0:关断
 */
void lcd_openclose(uchar i)
 {
  w_com(0xae|(i&0x01));
 }

 /*
 用于设置页面,0-8,其中第8页只有一行
 */
void lcd_setpage(uchar i)
 {
  w_com((i&0x0f)|0xb0);
 } 
 /*
 用于设置起始行,从0到63,不考虑页面
 */
void lcd_setrow(uchar row)
 {
  w_com((row&0x3f)|0x40);
 }
 /*
 用于设置开始列,从0-131,其中127后是不能显示的
 分高低两个字节写入
 */ 
void lcd_setcol(uchar i)
 {
  w_com((i>>4)|0x10);
  w_com(i&0x0f);
 }
/*
列顺序翻转,左右翻转0:正常  1:翻转
*/
void lcd_colrev(uchar i)
 {
  w_com(0xa0|(i&0x01));
 }
 /*
 行顺序翻转,上下翻转 0:正常 1;翻转
 */
void lcd_rowrev(uchar i)
 {
  w_com(0xc0|((i<<3)&0x08));
 }
 /*
 设置对比度 0-7  5V电压下 设置为4比较好
 */
void lcd_setrat(uchar i)
 {
  w_com(0x20|(i&0x07)); 
  }
 /*
 设置亮度 0-64;5V电压下设置为0X20比较适中 0x20=32
 */
void lcd_setvol(uchar vol)
 {
  w_com(0x81);
  w_com(vol);
 }
 /*
 黑白翻转 0正常 1翻转
 */
void lcd_nomrev(uchar nomrev)
 {
  w_com(0xa6|(nomrev&0x01));
 }
void lcd_clear(void)
{
   uchar page,seg;
 for(page=0xb0;page<0xb9;page++)  //写页地址共 8 页  0xb0----0xb8 
   {   
      lcd_setpage(page);                       
      w_com(0x10); //列地址,高低字节两次写入,从第 0 列开始 
      w_com(0x00);              
      for(seg=0;seg<133;seg++)//写 128 列 
      { wdata(0x00); } 
      }
 }
 void lcd_init(void)
 {
     lcd_rst();
     lcd_openclose(1);
     lcd_setpage(0);
     lcd_setrow(0);
     lcd_setcol(0);
     lcd_nomrev(0);
     lcd_rowrev(1);
     lcd_colrev(0);
     lcd_setvol(32);
     lcd_setrat(4);
     w_com(0x2f);//电源打开
     lcd_clear();
 }

⌨️ 快捷键说明

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