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

📄 1.c

📁 点阵显示汉字
💻 C
📖 第 1 页 / 共 2 页
字号:
set_DR();
set_CLK();
data<<=1;
}
clr_DR();
}
//送橙色数据
void Send_Byte_DR_DG(uchar data)
{
uchar i=0;
for(i=0;i<8;i++)
{
clr_CLK();

if((data&0x80)==0)
{
clr_DG();
clr_DR();
}
else//列控制  该位所在列的二极管得正电位 在允许接地的情况下发光!!!
{
set_DR();
set_DG();
}
set_CLK();
data<<=1;
}
clr_DR();
clr_DG();
}
//将汉字符装入显示寄存器
void putin (uchar point)//字符载入函数
{  
    uchar i;//定义变量用于数据提取指针
    for(i=0;i<16;i++)
	{ 
	     Ledplay[i][bn]=data[point][2*i];                          //行储存转化为列储存
	     Ledplay[i][bn+1]=data[point][(2*i)+1];                     //行储存转化为列储存
	}
	bn+=2;
}

//将数字符装入显示寄存器
void putin1 (uchar point)//字符载入函数  载入第point个汉字
{
	uchar i;//定义变量用于数据提取指针
    for(i=0;i<16;i++)
	{ 
	     Ledplay[i][bn]=data1[point][i];
	}
	bn++;
}
//显示存器清空(0x00)
void clearRAM (void)
{//寄存器清空函数
	uchar a,b;//定义变量用于清空数据指针fyhh
	for(b=0;b<17;b++)
	{
	  for(a=0;a<42;a++){//指向40个寄存器
		Ledplay[b][a]=0;//将指向的寄存器清空
	  }
	}
}
//清屏
void clearping(void)
{unsigned char j;
 clr_STB();	
     for(j=0;j<20;j++)//20*8列都不显示红‘绿色
	 Send_Byte_DR_DG(0x00);//8位的各个所在列都不显示红‘绿色
     set_STB();//锁存
}
//显示一次板面汉字
void DisPlay_onetime(unsigned char colour)
//colour=0\1\2分别为红\绿\橙色显示
{
  uchar i,j;	
  for(i=0;i<16;i++)//扫描16行 
  {
     clr_STB();	 
        for(j=0;j<20;j++)//每一片点阵出现的第一个汉字从第|Jmax-20|列(从输入端开始数)开始入x=20时每一片点阵出现的第一个汉字从第0个字位开始入
	 {                   //*本版面最多能显示10个字,即20列(Ledplay的前20 列)其他汉字通过移动(把20列以后的字信号移到前20列范围内,即版内)
	  switch(colour)
	 {
	  case 0: Send_Byte_DR(Ledplay[i][j]);
	        break;
	 case 1: Send_Byte_DG(Ledplay[i][j]);
	       break;  
	 case 2: Send_Byte_DR_DG(Ledplay[i][j]);
	        break;
	 default:break;
	  }
	 }
	set_G();
	delay_nus(2);
    set_STB();//锁存
	PORTB=ROW[i];//i行控制位   共阴的二极管允许了接地
	clr_G();//行控制有效
	delay_nus(displayTime);
  }
  delay_nus(200);
  set_G();
 }
 //下面函数功能为把信号(汉字)前移
 void left_move(void)
{
  uchar data0,data1,i,j;
  for(i=0;i<16;i++)
  {
    for(j=0;j<(howmany0+hanzishu)*2;j++)//如41=(howmany0+hanzishu)*2+1
	{
	   data0=Ledplay[i][j];
	   data1=Ledplay[i][j+1];
	   Ledplay[i][j]=(data0<<1)|(data1>>7);//从第二个字符起它的信号始终没有掉失,
	}                                     //只不过是把第一列的信号给了上一16*16的第16列‘
  }									      //第一个字符(字体失去的那个字,所以第一是变动的。那个字体开始掉失那个字就为第一)始终从第一列
}     							          //信号开始失掉
	                                      //两个for中的参数: 16是规格格式,41是扫描41列(0->40),显示10空字10汉字则要40列
                                          //多出的一列是为了用其最高位来补Ledplay[i][39](最后一列)的最低位(最后一列<<1有了最低们这个空位)
                                          //则要用多出的一列(0x00)的最最位来补(这列也可以以程序默认来补,即可删这行)。
                                          //若程序每次把汉字移动两列则要用二列来补。
void left_MOVE_display(unsigned char colour)
{  
     static uint king=0;
     uint i=0,k;
	 king=0;
	 bn=0;// 全局 列变量
	 clearRAM();//使 Ledplay[i][j]所指空间清0
	 for(k=0;k<howmany0;k++){putin(position);}  //实质上是使 Ledplay[i][j]填入空字                    *****************************
	 for(k=0;k<hanzishu;k++){putin(k);}//在这函数中通过clearRAM()0后"重新"载入字符
	 while(1)
	 {//开始移动
	 for(i=0;i<shopshow;i++)//动态显示一段时间
	 {
     DisPlay_onetime(colour);//*************************************************************
	 }
	 left_move();
	 king++;
	 if(king>159+16*18)
	 break;
	}//停止移动
	/*for(i=0;i<600;i++)//静止显示一段时间***************************
	{
	 DisPlay_onetime(colour);
	}*/
}
//不理想
/*void right_move(void)
{
  uchar data0,data1,i,j;
  for(i=0;i<16;i++)
  {
    for(j=0;j<(howmany0+hanzishu)*2+1;j++)//如41=(howmany0+hanzishu)*2+1
	{
	   data0=Ledplay[i][j];
	   data1=Ledplay[i][j+1];
	   Ledplay[i][j+1]=(data0<<7)|(data1>>1);//从第二个字符起它的信号始终没有掉失,
	}                                     //只不过是把第一列的信号给了上一16*16的第16列‘
  }									      //第一个字符(字体失去的那个字,所以第一是变动的。那个字体开始掉失那个字就为第一)始终从第一列
}   
void right_MOVE_display(unsigned char colour)
{  
     static uint king=0;
     uint i=0,k;
	 king=0;
	 bn=0;// 全局 列变量
	 clearRAM();//使 Ledplay[i][j]所指空间清0
	 for(k=0;k<howmany0;k++){putin(position);}  //实质上是使 Ledplay[i][j]填入空字                    *****************************
	 for(k=0;k<hanzishu;k++){putin(k);}//在这函数中通过clearRAM()0后"重新"载入字符
	 while(1)
	 {//开始移动
	 for(i=0;i<shopshow;i++)//动态显示一段时间
	 {
     DisPlay_onetime(colour);//*************************************************************
	 }
	 right_move();
	 king++;
	 if(king>143)
	 break;
	}//停止移动
	//for(i=0;i<600;i++)//静止显示一段时间***************************
	//{
	// DisPlay_onetime(colour);
	//}//
}  	*/				
//下面数功能为把信号移
void UP_move(void)
{
  uchar i,j;
  for(j=0;j<(howmany0+hanzishu)*2;j++)
  {
    for(i=0;i<16;i++)
	{
	Ledplay[i][j]=Ledplay[i+1][j];//让本列的下一行的来取代自已的位置,来实现下一行信号下移的功能,第16行下移后的空位由多出的一行(0x00)
	}                             //来补,这是Ledplay有17行的所以了。
	if(j<(howmany0+hanzishu)*2-10)
	Ledplay[15][j]=Ledplay[0][j+10];//本程序开始时以10个空字占満版面,j=0时,把第6个字的信号给第一个字位最低行,j=1时把第7个字信号给第2个字
	}                                //第10列即第6个字
}                              
void UP_MOVE_display(unsigned char colour)
{  
     static uint up=0;
     uint i=0,k=0;
	 up=0;
	 bn=0;
	 clearRAM();
	 for(k=0;k<howmany0;k++){putin(position);}//实质上是使 Ledplay[i][j]所指空间清0
	 for(k=0;k<hanzishu;k++){putin(k);}//在这函数中通过clearRAM()0后"重新"载入字符
	 while(1)
	 {
	 for(i=0;i<shopshow+6;i++)	 
     DisPlay_onetime(colour);	 
	 UP_move();
	 up++;
	 if(up==32*3)
	 break;
	}
	/*for(i=0;i<300;i++)
	{
	 DisPlay_onetime(colour);
	}*/
}
/***************************************************************************************************
                                       上面32*80大点阵驱动程序
****************************************************************************************************/

//端口初始化
void port_init(void)
{
 PORTB = 0x00;
 DDRB  = 0xff;
 PORTD = 0x01;
 DDRD  = 0x01;
}

void init_devices(void)
{
 CLI(); //禁止所有中断
 port_init();
 SEI();//开全局中断
}
//主函数
void main(void)
{
 char i,j;
 init_devices();
 clearping();
 while(1)
  {
  // right_MOVE_display(greed);
   
   left_MOVE_display(greed);
   UP_MOVE_display(oringe);
  }
}

⌨️ 快捷键说明

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