【MSP430】16 * 16 汉字点阵

/*****************************EC实验室********************************/
/*********************************************************************
  名称:595控制4汉字点阵屏
  内容:屏+5V、GND连接电源5V
        P40-P43分别连接A、B、C、D,用于控制16行,通过2路HC138控制
        SCK时钟连接P53
        LATCH锁存连接P54
        R1红色数据信号连接至P55
        G1绿色数据信号连接至P56,如果使用单红色屏此信号无需连接
        OE使能端一般接GND,可以用IO引脚PWM控制亮度
        或者使用此引脚控制拖尾现象。
  现象:使用普通速度51系列单片机。1个汉字显示屏,向左流动显示多句话,重复循环显示。
**********************************************************************/
#include<msp430x14x.h>

#define  T_STR_H   P5OUT |= BIT4
#define  T_STR_L   P5OUT &= ~BIT4
#define  R1_H   P5OUT |= BIT5
#define  R1_L   P5OUT &= ~BIT5
#define  G1_H   P5OUT |= BIT6
#define  G1_L   P5OUT &= ~BIT6
#define  T_CLK_H   P5OUT |= BIT3
#define  T_CLK_L   P5OUT &= ~BIT3
#define  OE_H   P5OUT |= BIT7
#define  OE_L   P5OUT &= ~BIT7



void InputByte( unsigned  char DataR1);
void Input2Byte( unsigned  char DataR1,unsigned  char DataG1);
void Delay(unsigned int t);
void Led_init();
void display();




unsigned char MoveBitNum,MoveBitNumtemp,IncNum;//移动位数,临时移动位数,大于一个字节增加字节数
unsigned int HzNum;//汉字个数
unsigned char buff[10];



/*-----------------------------------------------
             16x16汉字取模数据
------------------------------------------------*/
unsigned char hztest[][32]=    //取模选择字节倒序 ,正序得出的字是反的,可以在软件中设置自动倒叙
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //前面一屏大小的空字符,不显示,这里根据屏的大小修改,这个是1个汉字屏
                                                                                 //所以写入1个汉字
/*--  文字:  请  --*/
/*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x02,0x02,0x02,0xE4,0x3F,0x04,0x02,0xC0,0x1F,0x00,0x02,0xE7,0x7F,0x04,0x00,
0xC4,0x1F,0x44,0x10,0xC4,0x1F,0x44,0x10,0xD4,0x1F,0x4C,0x10,0x44,0x14,0x40,0x08,

/*--  文字:  关  --*/
/*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x08,0x10,0x08,0x10,0x04,0x00,0x00,0xFC,0x1F,0x80,0x00,0x80,0x00,0x80,0x00,
0xFF,0x7F,0x80,0x00,0x40,0x01,0x40,0x01,0x20,0x02,0x10,0x04,0x0C,0x18,0x03,0x60,
/*--  文字:  大  --*/
/*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0x7F,0x80,0x00,0x80,0x00,
0x40,0x01,0x40,0x01,0x20,0x02,0x20,0x02,0x10,0x04,0x08,0x08,0x04,0x10,0x03,0x60,

/*--  文字:  灯  --*/
/*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x00,0x08,0x00,0xC8,0x7F,0x08,0x04,0x2A,0x04,0x1A,0x04,0x0A,0x04,0x09,0x04,
0x08,0x04,0x08,0x04,0x08,0x04,0x14,0x04,0x24,0x04,0x22,0x04,0x02,0x05,0x01,0x02,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //尾部的一屏的空字符,用于清屏,参数和屏大小有关。
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};


/******************************警示程序*********************************/
void WARNING_START()
{
  Led_init();
}

void WARNING_STOP()
{
  P5SEL=0X00;
  P5DIR=0X00;                         // CCR0 interrupt enabled
  OE_H;
}
/*******************************LED相关接口初始化*********************************/
void Led_init()
{
  P5SEL=0X00;
  P5DIR=0XFF;
  P4SEL=0X00;
  P4DIR=0XFF;
  
  
  MoveBitNum=0;
  MoveBitNumtemp=0;
  IncNum=0;
  HzNum=0;
  for(int i=0;i<10;i++)
  {
    buff[i]=0;
  }
}


/*-----------------------------------------------
             向595写入一个字节 单红色
------------------------------------------------*/
void InputByte( unsigned  char DataR1) //写一个字节
{ 
unsigned  char i;
for(i=8; i>0; i--)
{
  if(!(DataR1&0x01)==1)
    R1_H;
  else
    R1_L;                 
 T_CLK_L;
 T_CLK_H;
 DataR1 = DataR1 >> 1; 
 } 
}
/*-----------------------------------------------
                    延时程序
------------------------------------------------*/
void Delay(unsigned int t)
{
 while(--t);
}


/*-----------------------------------------------
                      主程序
------------------------------------------------*/
void display()
{
 static unsigned char count;//16行扫描数据,范围0-15
 static unsigned int i,  j;
 static unsigned char temp;

 i++;
 if(i==15)//更改流动速度,1T单片机和12T单片机速度大约5-8倍,注意更改参数
   {
   i=0;
   MoveBitNum++;
 if(MoveBitNum==16)//每次移动完一个汉字大小后循环
    {
      MoveBitNum=0;
	  HzNum+=1;    //调用下一个汉字
	  if(HzNum>=5)//需要显示的汉字个数,包括前面的一屏空字符的个数,后面清屏的空字符不包含在内,这里是(汉字个数+1)
	     HzNum=0;   //完全显示完后循环调用
    }
  }


 Delay(1);//控制扫描频率
 for(j=0;j<2;j++) //取每个汉字的前2个字节,
	{             //汉字个数+1
	 buff[j+j]=hztest[HzNum+j][count+count];  //每次移动完一个汉字后,选择下一个汉字
	 buff[j+j+1]=hztest[HzNum+j][count+count+1];
	}

  if(MoveBitNum<8)                   //  判读移动距离是大于一个字节还是小于一个字节,因为一个字节左移右移最大只能8位
	  { IncNum=0; MoveBitNumtemp=MoveBitNum; }
  else
	  { IncNum=1; MoveBitNumtemp=MoveBitNum-8;}//大于8就减去8得到的数值还是小于8

 T_STR_L;       //锁存无效
  for(j=0;j<2;j++)          //按bit的方式移动缓冲区的内容,然后输出到595,即取出的数值每个字节左移一定的位数,
	  {                                     //后面左移出的数据整合到前面的字节中,保持数据的连续性	     
	   temp=(buff[j+IncNum]>>MoveBitNumtemp)|(buff[j+1+IncNum]<<(8-MoveBitNumtemp));//这句比较重要,需要自行拿出2个字节的数据模拟分析
       InputByte(temp);//输出到595
	  }//8个字节传输完锁存输出
  OE_H;
  P4OUT=15-count;//用P0口的前4位控制16行,屏内部通过4-16译码器工作,循环扫描16行
  T_STR_H;      //锁存有效,此时一行的数据显示到屏上
  OE_L;

 
 count++;
 if(count==16)
    count=0;
 
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值