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

📄 demo.c

📁 MB90092汉字字符叠加芯片驱动程序
💻 C
字号:
#include <AT89X55.H>
#include <intrins.h>
#include "demo.h"
#include "demo_funs.h"

UCHAR synchronization=SYN_INTERNAL,demo_choice=0;
void (*DemoFunction[DEMO_SUM])() ={
  DemoLogo,DemoAll,DemoFontSize,DemoCount,DemoMoveText,DemoPicture,DemoPic
};

/*********************************************************************************************************
** 函数名称: Delay_ms
** 功能描述: 延时ms毫秒 (不精确)
** 日 期:   2004年12月29日
********************************************************************************************************/
void Delay_ms (UINT ms)
{
	UINT i,j,k;
	for(k=0; k<ms; k++)
      for(i=48; i>0; i--)
        for(j=10; j>0; j--);
}

/*********************************************************************************************************
** 函数名称: MB90092_WriteByte
** 功能描述: 向MB90092 写一个字节数据
** 日 期:   2004年12月29日
********************************************************************************************************/
void MB90092_WriteByte (UCHAR _data)
{
	UCHAR i;

	ACC=_data;
	CS=0x00;
	for (i=8;i>0;i--){
	  CLK=0;
	  SIN = ACC_0;
	  CLK=1;
	  ACC>>=1;	
    }
	CS=0x01;
}

/*********************************************************************************************************
** 函数名称: MB90092_ClearXY
** 功能描述: 清掉屏幕上面坐标(x,y)处的字符,y=0x00~0x0B and x=0x00~0x17 for main screen
** 日 期:   2004年12月29日
********************************************************************************************************/
void  MB90092_ClearXY (UCHAR x,UCHAR y)
{
	UCHAR byte1,byte2;
	
	if (x>0x17||y>0x0B) return;           //invalid col number or row number

	byte1=((y>>2)&0x3)+0x80;
	byte2=((y<<5)&0x60)+x;

	MB90092_WriteByte(byte1);             //command 0,设置写入地址,行和列
	MB90092_WriteByte(byte2);

	MB90092_WriteByte(0x88);              //command1-1,定义字符颜色,背景颜色
	MB90092_WriteByte(0x00);
	
	MB90092_WriteByte(0x90+62/128);       //command2-1,写入一个空格字符,地址62为空格符点阵
	MB90092_WriteByte(62%128);
}

/*********************************************************************************************************
** 函数名称: MB90092_ClearRow
** 功能描述: 清掉屏幕上面的第y行字符,y=0x00~0x0B for main screen
** 日 期:   2004年12月29日
********************************************************************************************************/
void  MB90092_ClearRow (UCHAR y)
{
	UCHAR x;
	
	if (y>0x0B) return;                   //invlid row number
	
	for (x=0;x<0x18;x++)
	  MB90092_ClearXY (x,y);
}

/*********************************************************************************************************
** 函数名称: MB90092_ClearScreen
** 功能描述: 清屏
** 日 期:   2004年12月29日
********************************************************************************************************/
void  MB90092_ClearScreen ()
{
	UCHAR i;
	for (i=0;i<0x0C;i++)
	  MB90092_ClearRow (i);
}

/*********************************************************************************************************
** 函数名称: MB90092_DisColor
** 功能描述: MB90092颜色初始化
** 日 期:   2004年12月29日
********************************************************************************************************/
void  MB90092_DisColor (UCHAR y)
{
	UCHAR temp1,temp2;
	
	temp1=((y>>2)&0x3)+0x84;
	temp2=((y<<5)&0x60)+1;

	MB90092_WriteByte(temp1);             //command 0,设置写入地址,行和列
	MB90092_WriteByte(temp2);

	MB90092_WriteByte(0x88);              //ff控制是否特显
	MB90092_WriteByte(0x00);              //command1-1,设置字符颜色,背景颜色
	
	MB90092_WriteByte(0x90);              //command2-1,设置字符点阵在外rom的地址
	MB90092_WriteByte(0x00);
}

/*********************************************************************************************************
** 函数名称: MB90092_DisChar
** 功能描述: 在屏幕坐标(x,y)处显示一个字符,该字符的点阵存储地址为addr,为一24x32的矩形区域
** 参  数:   x,y为屏幕坐标,addr为字符点阵在外rom的存储地址,mul为字符尺寸,bc为字符背景颜色,
             cc为字符颜色,ff控制是否特显.
** 日 期:   2004年12月29日
********************************************************************************************************/
void  MB90092_DisChar (UCHAR x,UCHAR y,int addr,UCHAR mul,UCHAR bc,UCHAR cc,UCHAR ff)
{
	UCHAR temp1,temp2,color;

	if (x>0x17||y>0x0B) return;           //invalid col number or row number
	
	temp1=((y>>2)&0x3)+0x80;
	temp2=((y<<5)&0x60)+x;

	MB90092_WriteByte(temp1);             //command 0,设置写入地址,行和列
	MB90092_WriteByte(temp2);

	MB90092_WriteByte(0xB0|mul);          //command 6,mul->字符尺寸控制(datasheel82),设置一整行
	MB90092_WriteByte(0x20|y);

	if (synchronization==SYN_EXTERNAL){
	  cc=7;
	  bc=0;
	}
	color=((cc<<4)&0x70)|bc;

	MB90092_WriteByte(0x88|ff);           //ff控制是否特显
	MB90092_WriteByte(color);             //command1-1,设置字符颜色,背景颜色
	
	MB90092_WriteByte(0x90+addr/128);     //command2-1,设置字符点阵在外rom的地址
	MB90092_WriteByte(addr%128);
}

/*********************************************************************************************************
** 函数名称: MainScreen_Init
** 功能描述: MB90092主屏初始化
** 日 期:   2004年12月29日
********************************************************************************************************/
void  MainScreen_Init (UCHAR bc)
{
	UCHAR i;

	CS=0;
	Delay_ms(10);                         //程序开始时,要输入CS四次去清除上电复位,然后所作的设置才是有效的。
	CS=1;
	Delay_ms(10);
	CS=0;
	Delay_ms(10);
	CS=1;
	Delay_ms(10);
	CS=0;
	Delay_ms(10);
	CS=1;
	Delay_ms(10);
	CS=0;
	Delay_ms(10);
	CS=1;
	Delay_ms(10);

	MB90092_WriteByte(0xA0);              //command 4,首先选择内同步
	MB90092_WriteByte(0x00);
      	
	MB90092_WriteByte(0xAD);              //command 5
	MB90092_WriteByte(0x10);              //KID=0;APC与颜色有关;GYZ=0;W3--W0为行间距;10101 KID APC GYZ0 BH2 BH1 BH0 W3 W2 W1 W0
              	
	MB90092_WriteByte(0xBC);              //command 7
	MB90092_WriteByte(0x2A);              //垂直开始位置设定

	MB90092_WriteByte(0xC0);              //command 8
	MB90092_WriteByte(0x18);              //水平开始位置设定
        
	MB90092_WriteByte(0xC8);              //command 9,GRM位设置普通模式或者扩展图形模式
	MB90092_WriteByte(0x20);
              	
	MB90092_WriteByte(0xD1);              //command 10,设置普通模式/扩展图形模式,闪烁,字符背景,字符单色/彩色,背景单色/彩色
	MB90092_WriteByte(0x38|bc);
       
	MB90092_WriteByte(0xA2|synchronization);//command 4,内/外同步选择
	MB90092_WriteByte(0x2B);

	for (i=0;i<0x0B;i++)
	  MB90092_DisColor (i);
	MB90092_ClearScreen ();
}

/*********************************************************************************************************
** 函数名称: ScanKey
** 功能描述: 接收按键
** 日 期:   2004年12月29日
********************************************************************************************************/
UCHAR ScanKey ()
{
	UCHAR i;

	if(EXT==0){
      synchronization=SYN_EXTERNAL;
      while (EXT==0);
	  MB90092_WriteByte(0xA2|synchronization);//command 4,内/外同步选择
	  MB90092_WriteByte(0x2B);
      return 1;
	 }

	if(INT==0){
      synchronization=SYN_INTERNAL;
      while (INT==0);
	  MB90092_WriteByte(0xA2|synchronization);//command 4,内/外同步选择
	  MB90092_WriteByte(0x2B);
	  return 1;
	}
	
	if(MODE==0){
	  demo_choice=(++demo_choice)%DEMO_SUM;
      while (MODE==0);
	  for (i=0;i<0x0B;i++)
	    MB90092_DisColor (i);
	  MB90092_ClearScreen ();
	  switch (demo_choice){
		case 1:
	      MB90092_WriteByte(0xAA);        //command 5,设置行间距为0
	      MB90092_WriteByte(0x15);  

	      MB90092_WriteByte (0xD1);       //command 10,字符显示背景(solid-fill)
          MB90092_WriteByte (0x38|B_COLOR_BLACK);
		  break;
	    case 0:
		case 2:
		case 3:
		case 4:
		case 5:
		case 6:
	      MB90092_WriteByte(0xAD);        //command 5,设置行间距为0
	      MB90092_WriteByte(0x10);              

		  MB90092_WriteByte (0xD1);       //command 10,字符显示背景(solid-fill)
          MB90092_WriteByte (0x38|B_COLOR_WHITE);
		  break;
	  }
	  return 1;
	}
	return 0;
}		

main ()
{
	CLK=1;                                //先将CLK脚置高
	MainScreen_Init (7);
	MB90092_ClearScreen ();

	while (1){
	  DemoFunction[demo_choice] ();
	  ScanKey ();
	  Delay_ms (10);
	}
	while (1);
}

⌨️ 快捷键说明

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