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

📄 lcd_t6963c.c

📁 本代码以AVR单片机作为CPU实现对内含T6963C的160*128液晶屏的操作
💻 C
字号:
//LCD命令地址
#define address_dictate_LCD      0x7001
//LCD数据地址
#define address_data_LCD         0x7000

//reverse  光标标志


//读取状态字 
unsigned char state_LCD_read() 
{ 
  unsigned char state_LCD;
  unsigned char *p_dictate_LCD=(unsigned char *)address_dictate_LCD; 
  state_LCD=*p_dictate_LCD;
  return state_LCD; 
} 

//判断指令数据读写状态 
void judge_state_readwrite_dictatedata() 
{ 
  while((state_LCD_read()&0x03)!=3) 
    ;    
} 

//判断数据自动读状态 
void judge_state_automatismread_data() 
{ 
  while((state_LCD_read()&0x04)!=4) 
    ; 
} 

//判断数据自动写状态 
void judge_state_automatismwrite_data() 
{ 
  while((state_LCD_read()&0x08)!=8) 
    ; 
} 

//指令写入函数 
void write_dictate(unsigned char command) 
{ 
  unsigned char *p_dictate_LCD=(unsigned char *)address_dictate_LCD;
  judge_state_readwrite_dictatedata();
  *p_dictate_LCD=command; 
} 

//数据读出函数
unsigned char read_data()
{
  unsigned char onedata;
  unsigned char *p_data_LCD=(unsigned char *)address_data_LCD;
  judge_state_readwrite_dictatedata();
  onedata=*p_data_LCD;
  return onedata;
}
  
//数据写入函数 
void write_data(unsigned char onedata) 
{ 
  unsigned char *p_data_LCD=(unsigned char *)address_data_LCD;
  judge_state_readwrite_dictatedata();
  *p_data_LCD=onedata;
} 

//数据自动写入函数 
void automatismwrite_data(unsigned char onedata) 
{ 
  unsigned char *p_data_LCD=(unsigned char *)address_data_LCD;
  judge_state_automatismwrite_data();  
  *p_data_LCD=onedata;
} 

//一字节参数指令写入函数 
void write_dictate_oneparameter(unsigned char parameter,unsigned char command) 
{ 
  addr_cs(1);
  write_data(parameter); 
  write_dictate(command); 
} 

//两字节参数指令写入函数 
void write_dictate_twoparameter(unsigned char parameter1,unsigned char parameter2,unsigned char command) 
{ 
  addr_cs(1);
  write_data(parameter1); 
  write_data(parameter2); 
  write_dictate(command); 
} 

//清除屏幕(清所有8K存储空间)
void clear_screen() 
{  
  unsigned int i; 
  write_dictate_twoparameter(0x00,0x00,0x24);   //设置显示存储器首地址 
  write_dictate(0xb0);                          //设置自动写状态 
  for(i=10240;i>0;i--) 
    automatismwrite_data(0x00); 
  write_dictate(0xb2);                          //关闭自动写状态   
} 

//划横线
void line_x(unsigned x_line)
{
  register unsigned char i;
  register unsigned int  address_display;
  address_display=x_line*0x14+0x0800;         //计算显示存储器地址
  for(i=0;i<20;i++)
  {
    write_dictate_twoparameter((address_display&0xff),(address_display>>8),0x24);
    write_dictate_oneparameter(0xff,0xc0);  
	address_display++;
  }
}

//ASCII码写入函数 
//x:0~19;  y:0~127
void write_asc(unsigned char x,unsigned char y,unsigned char ascii,unsigned char reverse) 
{ 
  register unsigned char i,j;
  register unsigned int address_display;
  unsigned char account_ascii;
  const unsigned char *p_ascii_sign;
  const unsigned char *p_ascii_lattice;
  address_display=y*0x14+x+0x0800;         //计算显示存储器地址
  for(;;)
  {
    i=0;
	account_ascii=sizeof(ascii_model)/sizeof(ascii_model[0]);
	while(i<account_ascii)
	{
	  p_ascii_sign=ascii_model[i].ascii_sign;
	  if(*p_ascii_sign==ascii)
	  {   
        p_ascii_lattice=ascii_model[i].ascii_lattice;
		for(j=0;j<16;j++)                  //计数值16 
        {
          write_dictate_twoparameter((address_display&0xff),(address_display>>8),0x24);
		  if(reverse==0)
		  {
            write_dictate_oneparameter(*(p_ascii_lattice++),0xc0);               //写入西文字符字模
		  }
		  else
		  {
		    write_dictate_oneparameter(~*(p_ascii_lattice++),0xc0);              //写入西文字符字模
		  }	
          address_display+=20;             //修改显示存储器地址,显示下一列(共16列) 
        }
	    break;
	  }
	  else
	    i++;
	}
	break;  
  }
}

//汉字写入函数 
//x_hz:0~19;  y_hz:0~127 
void write_chinese(unsigned char x,unsigned char y,unsigned char hz0,unsigned char hz1,unsigned char reverse) 
{ 
  register unsigned char i,j;
  register unsigned int address_display;
  unsigned char account_hz;
  const unsigned char *p_zimo;
  address_display=y*0x14+x+0x0800;
  for(;;)
  {
	i=0;
	account_hz=sizeof(zimo_hz)/sizeof(zimo_hz[0]);
	while(i<account_hz)
	{ 
	  if((hz0==zimo_hz[i].hzcode[0]&&hz1==zimo_hz[i].hzcode[1])||(i==account_hz-1))
	  {
		p_zimo=zimo_hz[i].hz_dianzhen;
		for(j=0;j<16;j++)                                     //计数值16 
        { 
          write_dictate_twoparameter((address_display&0xff),(address_display>>8),0x24);  //设置显示存储器地址 
	      if(reverse==0)
          {
	        write_dictate_oneparameter(*(p_zimo++),0xc0);     //写入汉字字模左部 
            write_dictate_oneparameter(*(p_zimo++),0xc0);     //写入汉字字模右部 
          }
	      else
	      {
	        write_dictate_oneparameter(~*(p_zimo++),0xc0);    //写入汉字字模左部 
            write_dictate_oneparameter(~*(p_zimo++),0xc0);    //写入汉字字模右部 
	      }
	      address_display+=20;                  //修改显示存储器地址,显示下一列(共16列) 
        } 
		break;
	  }
	  else         
	    i++;
	} 
	break;  
  }
}

//显示函数
void display(unsigned char reverse)
{
  unsigned char x_screen,y_screen;  //字符在LCD的显示行,列位置 
  unsigned char *p;                 //显示字符形码的内存映射地址
  unsigned char ascii,chinese0,chinese1;
  x_screen=*p_address;
  y_screen=*(p_address+1);
  while(*p_content!=0)
  {
    if(*p_content<=128)//显示ascii
    {
	  ascii=*p_content;
      write_asc(x_screen++,y_screen,ascii,reverse);
      p_content++;
    }
    else               //显示汉字
    {
	  chinese0=*p_content;
	  chinese1=*(p_content+1);
	  write_chinese(x_screen,y_screen,chinese0,chinese1,reverse);
	  p_content=p_content+2;
	  x_screen=x_screen+2;
	}
  }
}

⌨️ 快捷键说明

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