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

📄 lcd.c

📁 一个关于AVR单片机的例程
💻 C
字号:
// Project :12864 LCD Display
// Writer : you hu
// ICC-AVR application builder :2005-7-12 
// Target : M128
// Crystal: 8.0000Mhz
// Description : display photo  32*32 big

#include <iom128v.h>
#include <macros.h>
#include "lcd.h"
#include "photo.h"
typedef unsigned char uchar;
typedef unsigned int uint;

unsigned char flag;

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 LCD_Clean(void)
{
  unsigned char page=0,y;                //定义表示页和列的局部变量
  
  for(page=0;page<8;page++)
     {
	                                     //LCD左半屏的操作
	   check_busy(0);
	   L_command=LCD_PAGE+page;          //设置LCD左半屏页地址
	   check_busy(0);
	   L_command=LCD_Y; 
	                                     //LCD右半屏的操作
	  check_busy(1);
	   R_command=LCD_PAGE+page;          //设置LCD右半屏页地址
	  check_busy(1);
	   R_command=LCD_Y;
	   
	   for(y=0;y<64;y++)
	      {
            L_data=0x00;
			R_data=0x00;
		  }  
	 }
}
                                         
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 = (1<<XMM2)|(1<<XMM1)|(1<<XMM0); //外存储高位地址屏蔽,释放端口C
 port_init();
 MCUCR = 0x80;                          //外部SRAM使能
}

void ch_pos(unsigned char cs,unsigned char n)   //屏选和页码设置函数
{
  if(cs)
      {
	   check_busy(1);
       R_command=LCD_PAGE+n;                   //设置LCD右半屏页地址
       check_busy(1);                  
       R_command=LCD_Y;
	  }
  else
      {
	   check_busy(0);
       L_command=LCD_PAGE+n;                   //设置LCD右半屏页地址
       check_busy(0);                  
       L_command=LCD_Y;
	  } 
}	   	  
void write_photo(unsigned char cs)  
{
  uchar i,j;
  for(j=0;j<3;j++)
  { 
   if(cs)  ch_pos(1,2*j);                   //右屏页码处理
   else    ch_pos(0,2*j); 	                //左屏页码处理
   for(i=0;i<64;i++)
    {
	 
	 if(cs)
	    {
		 R_data=p3[2*j][i];                 //右半屏显示
		} 
     else 
	    {
		 L_data=p3[2*j][i];                 //左半屏显示
		}  
	} 
   if(cs)  ch_pos(1,2*j+1);                //右屏页码处理
   else    ch_pos(0,2*j+1);                //左屏页码处理
   for(i=0;i<64;i++)
    { 
	 if(cs) 
	    {
	     R_data=p3[2*j+1][i];               //右半屏显示
		}
     else   
	    {
		 
	     L_data=p3[2*j+1][i];               //左半屏显示
		}  
    }
  }  
}
 
void main(void)
{
  init_devices();
  LCD_Clean();
  LCD_Init();
 write_photo(0);
  write_photo(1);
}

⌨️ 快捷键说明

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