【MSP430】16 * 16 汉字点阵

2019-07-14 03:45发布

/*****************************EC实验室********************************/ /********************************************************************* 名称:595控制4汉字点阵屏 内容:屏+5V、GND连接电源5V P40-P43分别连接A、B、C、D,用于控制16行,通过2路HC138控制 SCK时钟连接P53 LATCH锁存连接P54 R1红 {MOD}数据信号连接至P55 G1绿 {MOD}数据信号连接至P56,如果使用单红 {MOD}屏此信号无需连接 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写入一个字节 单红 {MOD} ------------------------------------------------*/ 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; }