【MSP430】16 * 16 汉字点阵

2020-07-03来源: eefocus关键字:MSP430  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

 

#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;

 

}

关键字:MSP430  16  *  汉字点阵 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic502087.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:MSP430:输入捕获
下一篇:低功耗模式下如何用看门狗监控程序跑飞

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MSP430实现计时器的源代码
和上一篇文章一样,用到了 TM1638。计时器初值设为 23:57:45,计时到 23:59:59 时重置为 0点 0分 0秒。(和上次的定时器一样,主函数中的delay是我自己写的,是为了便于调试,并没有真正起到延时1s的作用)源の代码:#include "TM1638.h"#include "msp430f6638.h"#include "stdint.h"uint8_t num[8];    //各个数码管显示的值uint8_t led_flag[8];const uint8
发表于 2020-07-25
MSP430f5529之PWM控制舵机程序
#include <msp430.h>                        //函数库int sum=0;                                  //全局变量int main(void){  volatile unsigned int i;     
发表于 2020-07-25
msp430超声波测距源程序 1602显示
单片机源程序如下:#include <msp430x14x.h>#include "cry1602.h"uchar tishi[]={"the distance is:"};uchar geshi[]={".cm"};//26.2cmuchar  num[]={"0123456789 "};uchar Edge=1;uint RiseCapVal;   //上升沿时刻捕获值存放变量//uint TA_Overflow_Cnt; //TA溢出次数存放变量,可能距离远超过65535unsigned long int
发表于 2020-07-25
MSP430单片机定时器TA中断 程序
程序1#include  <msp430x41x.h>void main(void){  WDTCTL = WDTPW + WDTHOLD;                       // 停止看门狗  FLL_CTL0 |= XCAP18PF;                         // 配置晶振负载电容  P1DIR
发表于 2020-07-25
msp430f5529 MCP4725程序
//**************************************//I2C起始信号//**************************************void I2C_Start(){    SDAOUT;                  //数据线设为输出方向    SDA1;                   &
发表于 2020-07-25
msp430f5529 RC522射频卡程序
;   SDA p2.2    SCK P2.7    MOSI P3.3    MISO p3.4    IRQ 不接    RST p2.3连接好上述引线后,能实现以下功能:1.PC发送字符A,读出卡的型号和UID信息。2.PC发送字符F,单次寻卡模式,接触一次显示一次卡的型号信息。*/#include "msp430.h"#include "PIN_DEF.H"#include "RC522.H"#include "UART_Func.h"//串口已
发表于 2020-07-25
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved