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

📄 lcd.c

📁 12C887 的驱动程序
💻 C
字号:
#include <iom128v.h>
#include <macros.h>
#include "lcd.h"
typedef unsigned char uchar;
typedef unsigned int uint;

void port_init(void)
{
 //访问外部ram的总线端口
 PORTA = 0x00;
 DDRA  = 0x00; 
 PORTC = 0x00; 
 DDRC  = 0xFF;
}
	  
void check_busy(uchar cs)               
{ 
  uchar temp;
  while(temp)          
   { 
     if(cs)
        temp=R_staus&0X80;               //将忙状态读到temp中进行确定
	 else
	    temp=L_staus&0X80;
	}
}


void lcdcommand(uchar cs,uchar com)
{ 
 if(cs)
   {	
    check_busy(1);
    R_command=com;
   }
  else
   { 	
    check_busy(0);
    L_command=com;
   }
}

/*************************向LCD写数据函数*************************/

void lcddatas(char cs,uchar dd)
{  
 if(cs)
   {
    check_busy(1);
    R_data=dd;
   }
 else
   {
    check_busy(0);
    L_data=dd;
    }
}

/**************************** LCD清屏函数*******************************/

void LCD_Clean(void)
{
 unsigned char x,y;	 	
 for(x=0xb8;x<=0xbf;x++)                                 //一页一页的写
   {	
     lcdcommand(0,x); 
     lcdcommand(1,x);                                    //设定X方向地址,X地址不能自增。要靠程序加
     lcdcommand(0,LCD_Y);                                //设置Y的初始地址,Y可自加
     lcdcommand(1,LCD_Y);
     for(y=0;y<64;y++)
       {  	
         lcddatas(0,0x00);
         lcddatas(1,0x00);                               //Y地址可以自增
       }		      
    }
}
                                         
void LCD_Init(void)                     //LCD初始化子函数
{
  /*首先关闭12864的显示*/
  check_busy(0);                        //LCD左半屏正在工作,等待......
  L_command=LCD_OFF;                    //先关闭LCD左半屏的显示
  check_busy(1);                        //LCD右半屏正在工作,等待......
  R_command=LCD_OFF;                    //先关闭LCD右半屏的显示
  
  /*开启12864的显示*/
  check_busy(0);
  L_command=LCD_ON;                     //打开LCD左半屏的显示
  check_busy(1);
  R_command=LCD_ON;                     //打开LCD右半屏的显示
  
  /*设置LCD显示的起始行*/
  check_busy(0);
  L_command=LCD_X;                      //LCD左半屏起始行为0
  check_busy(1);
  R_command=LCD_X;                      //LCD右半屏起始行为0
}

void init_devices(void)
{
 XMCRA = 0x00;                          //外部存储器控制
 XMCRB = 0x00; //外存储高位地址屏蔽,释放端口C
 port_init();
 MCUCR = 0x80;                          //外部SRAM使能
}

/**********************************LCD字符显示函数(8*8)**********************************************/

void displaychar_left(uchar *array,uchar x,uchar y)        
 {
  uchar i;
  lcdcommand(0,LCD_PAGE+x);
  lcdcommand(0,LCD_Y+y);
  for(i=0;i<8;i++)
    {
	 lcddatas(0,*(array+i));
	}
 }


void displaychar_right(uchar *array,uchar x,uchar y)        
{
  uchar i;
  lcdcommand(1,LCD_PAGE+x);
  lcdcommand(1,LCD_Y+y);
  for(i=0;i<8;i++)
     {
	  lcddatas(1,*(array+i));
	  }
}

     
void display_char(uchar*array1,uchar*array2,uchar zong,uchar heng)         
{
  if((heng>=0)&&(heng<=7))       
	{displaychar_left(array1,zong,heng*8);	displaychar_left(array2,zong+1,heng*8);}
				 
  if((heng>=8)&&(heng<=15))        
    {displaychar_right(array1,zong,(heng-8)*8);	displaychar_right(array2,zong+1,(heng-8)*8);}
}

/****************************** LCD汉字显示函数(8*16)****************************************/

void displayL(uchar*array,uchar x,uchar y)            //array是点阵字模指针,x是指屏竖方向的坐标,y是指屏横方向上的坐标
{     
   uchar i;
   lcdcommand(0,0xb8+x);                              //设置显示本字符的初始地址                    
   lcdcommand(0,0x40+y);
   for(i=0;i<16;i++)                                  //每半个字代码为16元素的数组
     {	
      lcddatas(0,*(array+i));
	 						
     }

}


void displayR(uchar*array,uchar x,uchar y)            //array是点阵字模指针,x是指屏竖方向的坐标,y是指屏横方向上的坐标
{     
   uchar i;

   lcdcommand(1,0xb8+x);                             
   lcdcommand(1,0x40+y);

   for(i=0;i<16;i++)                                  //每半个字代码为16元素的数组
     {	
      lcddatas(1,*(array+i));		 						
     }

}	

void display_chinese(uchar*array1,uchar*array2,uchar zong,uchar heng)
{
  if((heng>=0)&&(heng<=3))         //左半屏显示
   {
    displayL(array1,zong*2,heng*16);	displayL(array2,zong*2+1,heng*16);
   }
  if((heng>=4)&&(heng<=7))         //右半屏显示
   {
    displayR(array1,zong*2,(heng-4)*16);	displayR(array2,zong*2+1,(heng-4)*16);
   }
}

⌨️ 快捷键说明

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