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

📄 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 chinese 
// 纵向取模方式 16*16字体

#include <iom128v.h>
#include <macros.h>
#include "chinese.h"
#include "lcd.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使能
}

 
/*******************cs为左右屏选,page为页数选择(0~15)********************************
 *******************y为水平位置选择(0~3),datas指针指向汉字存储的数组地址 ********************/

 
void write_chineseH(uchar cs,uchar page,uchar y,const unsigned char *datas) //上半部分显示
{
  uchar i;
  R_command=LCD_PAGE+page;                  //设置LCD右半屏页地址
  L_command=LCD_PAGE+page;                  //设置LCD左半屏页地址
  R_command=LCD_Y+y*16;                     //设置水平显示位置
  L_command=LCD_Y+y*16;
  for(i=0;i<16;i++)
    {
    if(cs) R_data=*datas;                   //右半屏显示
	else   L_data=*datas;                   //左半屏显示
	*datas++;
    }
}

void write_chineseL(uchar cs,uchar page,uchar y,const unsigned char *datas) //下半部分显示
{
 uchar i;
 check_busy(1);
 R_command=LCD_PAGE+page;                   //设置LCD右半屏页地址
 L_command=LCD_PAGE+page;                   //设置LCD左半屏页地址
 R_command=LCD_Y+y*16;                      //设置水平显示位置
 L_command=LCD_Y+y*16;
 for(i=0;i<16;i++)
  {
   if(cs) R_data=*datas;                    //右半屏显示
   else   L_data=*datas;                    //左半屏显示
   *datas++;
  }	
}

void main(void)
{
  init_devices();
  LCD_Clean();
  LCD_Init();
 write_chineseH(0,0,3,you1);
 write_chineseL(0,1,3,you2); 
 write_chineseH(1,0,0,hu1);
 write_chineseL(1,1,0,hu2);  
}

⌨️ 快捷键说明

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