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

📄 mspf2ocm128c.c

📁 基于MSP430单片机的菜单级无限通信程序
💻 C
字号:
/**********************
//2008年9月3日,需要重新检查两个延时函数
命令:       
参照厂家给的程序
**************************/
#include "msp430x22x2.h"
#include "mspf2ocm128c.h"

uchar read_gt_data_32[32];

/***********************************************************************/

ulong get_chn16x16_addr_of_gt(uchar msb,uchar lsb)
{
	ulong addr=0x00000000;
	if(msb>=0xa1 && msb<=0xab && lsb>=0xa1)
		addr=(((ulong)msb-0xa1)*94+((ulong)lsb-0xa1))*32;
	else if(msb>=0xb0 && msb<=0xf7 && lsb>=0xa1)
		addr=(((ulong)msb-0xb0)*94+((ulong)lsb-0xa1))*32+0x69c0;
	return addr;
}

ulong get_eng8x16_addr_of_gt(uchar ASCIICode)
{
	ulong addr=0x0003b7c0;
	if(ASCIICode>=0x20 && ASCIICode<=0x7e)
	{
		if(ASCIICode>=0x60)
			addr=((ulong)ASCIICode-0x20+1)*16+addr;
		else
			addr=((ulong)ASCIICode-0x20)*16+addr;
	}
	return addr;
}

ulong get_eng8x8_addr_of_gt(uchar ASCIICode)
{
	ulong addr=0x0003bfc0;
	if(ASCIICode>=0x20 && ASCIICode<=0x7f)
		addr=((ulong)ASCIICode-0x20)*8+addr;
	return addr;
}

void send_byte_to_gt(uchar outdata)
{
	GT_DIR |= GT_SI + GT_SCLK;
	uchar i;
	for(i=0;i<8;i++)
	{
		GT_OUT &= ~GT_SCLK;
		if((outdata&0x80)==0x80)
			GT_OUT |= GT_SI;
		else
			GT_OUT &= ~GT_SI;
		GT_OUT |= GT_SCLK;
		outdata=outdata<<1;
	}
	//送完数据必须将时钟拉高,因为发送完地址后在下降沿接收数据,如果时钟不为高,在置高时会发送一个数据过去,导致出错
}

uchar get_byte_from_gt(void)
{
	uchar i,indata=0x00;
	GT_DIR |= GT_SCLK;
	GT_DIR &= ~GT_SO;
	for(i=0;i<8;i++)
	{
		indata=indata<<1;
		GT_OUT &= ~GT_SCLK;
		if(GT_IN & GT_SO)
			indata=indata|0x01;
		GT_OUT |= GT_SCLK;
	}
	return indata;
}

void highspeed_readdata_from_gt(ulong addr,uchar byte_number)
{
	uchar i;
	GT_DIR |= GT_CS;
	GT_OUT &= ~GT_CS;
	GT_OUT &= ~GT_CS;
	GT_OUT &= ~GT_CS;
	send_byte_to_gt(0x0b);
	send_byte_to_gt(addr>>16);
	send_byte_to_gt(addr>>8);
	send_byte_to_gt(addr);
	send_byte_to_gt(0xff);
	for(i=0;i<byte_number;i++)
		read_gt_data_32[i]=get_byte_from_gt();
	GT_OUT |= GT_CS;
}
/***********************************************************************/

void delay_nus(uint n)  //delay time
{
  while(n--)_NOP();
}

/*毫秒级延时*/
void delay_n_ms(uint n)
{
	int i;
	for(i=0;i<n;i++)
		delay_nus(140);
}

//..........串口写..........
void serial_write(uchar lcm_cmd_or_data)
{
  uchar i;
  OCM128_DIR |= OCM128_SCLK + OCM128_CS + OCM128_CDA;
  OCM128_OUT |= OCM128_SCLK;
  OCM128_OUT &= ~OCM128_CS;  //片使能
  for(i=0;i<8;i++)
  {
    if((lcm_cmd_or_data&0x80)==0x80)
	  OCM128_OUT |= OCM128_CDA;
    else
	  OCM128_OUT &= ~OCM128_CDA;
	OCM128_OUT &= ~OCM128_SCLK;		//注意时序
	OCM128_OUT |= OCM128_SCLK;		//注意时序
    lcm_cmd_or_data = lcm_cmd_or_data<<1;
  }
  OCM128_OUT |= OCM128_CS;//片禁能
  delay_n_ms(1); 
}

//..........写命令..........
void send_cmd(uchar lcm_cmd)
{
  OCM128_DIR |= OCM128_AO;
  OCM128_OUT &= ~ OCM128_AO;
  serial_write(lcm_cmd);
}
//..........写数据到DDRAM..........
void send_data(uchar lcm_data)
{
  OCM128_DIR |= OCM128_AO;
  OCM128_OUT |= OCM128_AO;
  serial_write(lcm_data);
}

/*写页地址*/
void set_page_address(unsigned char dat)
{
	send_cmd(dat|0xb0);   //Page Address Set:bit3--bit0:Page address 0--8
}

/*写列地址 topped at 83H*/
void set_column_address(unsigned char dat)
{
	send_cmd((dat>>4)|0x10);  //送列地址高四位
	send_cmd(dat&0x0f);       //送列地址低四位
}

/*初始化*/
void lcd_initial(void) 
{
	OCM128_DIR |= OCM128_RST;
	OCM128_OUT |= OCM128_RST;
	delay_n_ms(1);
	OCM128_OUT &= ~OCM128_RST;
	delay_n_ms(5);
        OCM128_OUT |= OCM128_RST;
	delay_n_ms(5);
	/*send_cmd(0xa0);
	send_cmd(0xc8);		//bit3:select COM output direction 0=normal 1=reverse 如:normal:com0--com63 ;reverse:com63--com0
	send_cmd(0xa2);		//lcd bias set:bit0 = 1:1/7 bias ;bit1 = 1: 1/9bias
	send_cmd(0x2c);		//d2:1=select internal power supply operating mode
	send_cmd(0x2e);		//Power Controller Set 
	send_cmd(0x2f);		//Power Controller Set
	send_cmd(0x25);		//voltage Regulator internal Resistor Ratio Set
	send_cmd(0x81);		//The Electronic Volume Mode Set
	send_cmd(0x18);		//Column Address Set :bit4 = 1: High bits;bit4 = 0: low bits;
	send_cmd(0xaf);		//Display ON/OFF :bit0=0:Off;bit0=1:On;
	send_cmd(0xe0);		//Column address increment :at write:+1;at read: 0
	send_cmd(0x40);		//set the display RAM start line address*/
         //////////////////////////////////////////////////////////////////////////
        send_cmd(0xdc);
        send_cmd(0xc8);
        send_cmd(0xa2);
        send_cmd(0xc8);
        send_cmd(0x2c);
        send_cmd(0x2e);
        send_cmd(0x2f);//
        send_cmd(0x25);//
        send_cmd(0xf8);//
        send_cmd(0x01);//
        send_cmd(0x81);//
        send_cmd(0x20);//
	send_cmd(0xaf);  //
	send_cmd(0xe0);  //
	send_cmd(0x40);  //
         //////////////////////////////////////////////////////////////////

	GT_DIR |= GT_CS + GT_SCLK;
	GT_OUT &= ~GT_CS;
	GT_OUT &= ~GT_SCLK;
	GT_OUT |= GT_CS;
	GT_OUT |= GT_SCLK;
}

//..........显示中文.............
void disp_chinese(uchar  *chn,uchar page_addr,uchar clm_addr,uchar x_number,uchar y_number,uchar white)
{
  uchar i,j,k;
  for(i=0;i<y_number;i++)
  {
    for(j=0;j<x_number;j++)
    {
      highspeed_readdata_from_gt(get_chn16x16_addr_of_gt(*(chn+i*x_number*2+j*2),*(chn+i*x_number*2+j*2+1)),32);
      
      set_page_address(page_addr+i*2);
      set_column_address(clm_addr+j*16);
	  if (white == 0)
	  {
		for(k=0;k<16;k++)
		{
      		send_data(read_gt_data_32[k*2]);
		}      
                set_page_address(page_addr+i*2+1);
                set_column_address(clm_addr+j*16);
                for(k=0;k<16;k++)
                {
      	          send_data(read_gt_data_32[k*2+1]);
                }
	  }
	  else if(white == 1)
	  {
		for(k=0;k<16;k++)
		{
      		send_data(~read_gt_data_32[k*2]);//这样写对不
		} 
                set_page_address(page_addr+i*2+1);
                set_column_address(clm_addr+j*16);
                for(k=0;k<16;k++)
                {
      	          send_data(~read_gt_data_32[k*2+1]);
                 }
	  }      
   
    }
  }
}

//..........显示8x16点阵字符.............
void disp_8x16character(uchar *eng,uchar page_addr,uchar clm_addr,uchar x_number,uchar y_number,uchar white)    // y_number 和x_number的为实际数减1
{
  uchar i,j,k;
  for(i=0;i<=y_number;i++)
  {
    for(j=0;j<=x_number;j++)
    {
      highspeed_readdata_from_gt(get_eng8x16_addr_of_gt(*(eng+i*x_number+j)),16);
      
      set_page_address(page_addr+i*2);
      set_column_address(clm_addr+j*8);
      if(white ==0)
      {
	for(k=0;k<8;k++)
	{
      	send_data(read_gt_data_32[k*2]);
	}      
        set_page_address(page_addr+i*2+1);
        set_column_address(clm_addr+j*8);
        for(k=0;k<8;k++)
        {
      	  send_data(read_gt_data_32[k*2+1]);
        }
      }
      else if(white == 1)
      {
        for(k=0;k<8;k++)
	{
      	send_data(~read_gt_data_32[k*2]);
	}      
        set_page_address(page_addr+i*2+1);
        set_column_address(clm_addr+j*8);
        for(k=0;k<8;k++)
        {
      	  send_data(~read_gt_data_32[k*2+1]);
        }
      }
    }
  }
}

//..........显示8x8点阵字符.............
void disp_8x8character(uchar *eng,uchar page_addr,uchar clm_addr,uchar x_number,uchar y_number)
{
  uchar i,j,k;
  for(i=0;i<y_number;i++)
  {
    for(j=0;j<x_number;j++)
    {
      highspeed_readdata_from_gt(get_eng8x8_addr_of_gt(*(eng+i*x_number+j)),8);
      set_page_address(page_addr+i);
      set_column_address(clm_addr+j*8);
      for(k=0;k<8;k++)
      {
      	send_data(read_gt_data_32[k]);
      }
    }
  }
}

void disp_8x8character1(uchar *eng,uchar page_addr,uchar clm_addr)
{
  uchar k;
  set_page_address(page_addr);
  set_column_address(clm_addr);
  for(k=0;k<8;k++)
  {
     	send_data(read_gt_data_32[k]);
   }
}

//..........显示点阵..........
void disp_lattice(uchar lcm_data1,uchar lcm_data2)
{
  uchar i,j;
  for(i=0;i<8;i++)
  {
    set_page_address(i);
    set_column_address(0x00);
    for(j=0;j<64;j++)
    {
      send_data(lcm_data1);
      send_data(lcm_data2);
    }
  }
}

//..........显示图形..........
void disp_graphics(uchar *gph)
{
  uchar i,j;
  for(i=0;i<8;i++)
  {
    set_page_address(i);
    set_column_address(0x00);
    for(j=0;j<128;j++)
    {
      send_data(*(gph+i*128+j));
    }
  }
}

⌨️ 快捷键说明

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