汉字移动显示程序
Nokia 3310 LCD显示模块
Nokia 3310 LCD显示原创Nokia 3310手机的点阵LCD模块不仅小巧、省电、驱动容易,而且价钱也便宜。
因此,最近网上常见到不少朋友都在用单片机来驱动该模块,制做出很多作品。
在此,我要特别感谢神舟兄,是在他的热情帮助下,我才购得这款3310的液晶显示模块。
如果有朋友需要的话也可以和他联系(神舟emal:conglp@ )。
实验目标本实验我们就采用Atmega8或者Atmega48来驱动3310的LCD。
在LCD上显示和移动汉字;在LCD的最上一行显示“欢迎光临电子爱好者俱乐部!”,并且让这串汉字在LCD上从左至右不停地移动。
在LCD上显示英文字符串;在LCD的最底一行固定显示“”。
在LCD上显示位图。
在LCD的中间位置显示“AVR”和“实验室”两个位图。
本站商城提供该LCD模块邮购:/shop/index.asp实验器材Atmega8或者Atmega48芯片一只、3.3V稳压二极管一只、3310LCD点阵液晶显示屏。
Atmega8和Atmega48的管脚顺序完全相同,硬件可以直接替用。
实验电路图及工作原理由于3310LCD的工作电压范围是2.7-3.3V,因此实验中使用一个3.3V的稳压二极管D1将5V电源稳压为3.3V左右,为MCU和LCD供电。
MCU和LCD之间使用SPI接口传输数据。
LCD模块的引脚排列:从模块的背面看,管脚排列顺序从左至右分别为1至8脚。
如下图所示:注意:LCD模块的引脚即使用导线直接焊接上,也要用东西将金属引脚压下去,否则还是不能接触到内部电路实验源程序主程序:文件名是3310LCDTest.c#include <iom48v.h>#include <macros.h>#include "lcd.h"#include "bmp.h"/*******************************************/void main(void){OSCCAL=0x99;// 8M系统内部时钟校准//设置MCU的I/O口DDRB |= LCD_RST | LCD_DC | LCD_CE | SPI_MOSI | SPI_CLK| 0X02;SPSR |= BIT(SPI2X);// 设置SPI时钟倍速SPCR |= BIT(SPE)|BIT(MSTR);// 使能SPI接口,主机模式,4M时钟LCD_init(); //初始化LCD模块LCD_write_String(1,5,""); //显示英文字符串”“LCD_draw_map(0,2,AVR_bmp,40,24); //显示“AVR”位图LCD_draw_map(44,3,china_bmp,36,15); //显示”实验室“位图PORTB |= 0x02; //LED亮while(1){LCD_move_chi(0, 0, 25); //汉字移动显示}}LCD3310驱动程序:文件名3310LCD.c#include <iom48v.h>#include <macros.h>#include "lcd.h"#include "6x8.h"#include "chinese.h"/*---------------------------------------LCD_init: 3310LCD初始化编写日期:2004-8-10最后修改日期:2004-8-10----------------------------*/void LCD_init(void){PORTB &= ~LCD_RST;// 产生一个让LCD复位的低电平脉冲delay_1us();PORTB |= LCD_RST;PORTB &= ~LCD_CE ;// 关闭LCDdelay_1us();PORTB |= LCD_CE;// 使能LCDdelay_1us();LCD_write_byte(0x21, 0);// 使用扩展命令设置LCD模式LCD_write_byte(0xc8, 0);// 设置偏置电压LCD_write_byte(0x06, 0);// 温度校正LCD_write_byte(0x13, 0);// 1:48LCD_write_byte(0x20, 0);// 使用基本命令LCD_clear();// 清屏LCD_write_byte(0x0c, 0);// 设定显示模式,正常显示PORTB &= ~LCD_CE ;// 关闭LCD}/*----------------------------------------------------------------------- LCD_clear: LCD清屏函数编写日期:2004-8-10最后修改日期:2004-8-10-----------------------------------------------------------------------*/ void LCD_clear(void){unsigned int i;LCD_write_byte(0x0c, 0);LCD_write_byte(0x80, 0);for (i=0; i<504; i++)LCD_write_byte(0, 1);}/*----------------------------------------------------------------------- LCD_set_XY: 设置LCD坐标函数输入参数:X:0-83Y:0-5编写日期:2004-8-10最后修改日期:2004-8-10-----------------------------------------------------------------------*/ void LCD_set_XY(unsigned char X, unsigned char Y){LCD_write_byte(0x40 | Y, 0);// columnLCD_write_byte(0x80 | X, 0);// row}/*----------------------------------------------------------------------- LCD_write_char: 显示英文字符输入参数:c:显示的字符;编写日期:2004-8-10最后修改日期:2004-8-10-----------------------------------------------------------------------*/ void LCD_write_char(unsigned char c){unsigned char line;c -= 32;for (line=0; line<6; line++)LCD_write_byte(font6x8[c][line], 1);}/*----------------------------------------------------------------------- LCD_write_char: 英文字符串显示函数输入参数:*s:英文字符串指针;X、Y: 显示字符串的位置编写日期:2004-8-10最后修改日期:2004-8-10-----------------------------------------------------------------------*/ void LCD_write_String(unsigned char X,unsigned char Y,char *s){LCD_set_XY(X,Y);while (*s){LCD_write_char(*s);s++;}}/*----------------------------------------------------------------------- LCD_write_chi: 在LCD上显示汉字输入参数:X、Y:显示汉字的起始X、Y坐标;ch_with :汉字点阵的宽度num:显示汉字的个数;line:汉字点阵数组中的起始行数row:汉字显示的行间距编写日期:2004-8-11最后修改日期:2004-8-12-----------------------------------------------------------------------*/ void LCD_write_chi(unsigned char X, unsigned char Y,unsigned char ch_with,unsigned char num,unsigned char line,unsigned char row){unsigned char i,n;LCD_set_XY(X,Y);//设置初始位置for (i=0;i<num;){for (n=0; n<ch_with*2; n++)//写一个汉字{if (n==ch_with)//写汉字的下半部分{if (i==0) LCD_set_XY(X,Y+1);elseLCD_set_XY((X+(ch_with+row)*i),Y+1);}LCD_write_byte(china_char[line+i][n],1);}i++;LCD_set_XY((X+(ch_with+row)*i),Y);}}/*----------------------------------------------------------------------- LCD_write_chi: 汉字移动输入参数:X、Y:显示汉字的起始X、Y坐标;T:移动速度;编写日期:2004-8-13最后修改日期:2004-8-13-----------------------------------------------------------------------*/ void LCD_move_chi(unsigned char X, unsigned char Y, unsigned char T){unsigned char i,n,j=0;unsigned char buffer_h[84]={0};unsigned char buffer_l[84]={0};for (i=0; i<156; i++){buffer_h[83] = china_char[i/12][j];buffer_l[83] = china_char[i/12][j+12];j++;if (j==12) j=0;for (n=0; n<83; n++){buffer_h[n]=buffer_h[n+1];buffer_l[n]=buffer_l[n+1];}LCD_set_XY(X,Y);for (n=0; n<83; n++){LCD_write_byte(buffer_h[n],1);}LCD_set_XY(X,Y+1);for (n=0; n<83; n++){LCD_write_byte(buffer_l[n],1);}delay_nms(T);}}/*----------------------------------------------------------------------- LCD_draw_map: 位图绘制函数输入参数:X、Y:位图绘制的起始X、Y坐标;*map:位图点阵数据;Pix_x:位图像素(长)Pix_y:位图像素(宽)编写日期:2004-8-13最后修改日期:2004-8-13-----------------------------------------------------------------------*/ void LCD_draw_map(unsigned char X,unsigned char Y,unsigned char *map, unsigned char Pix_x,unsigned char Pix_y){unsigned int i,n;unsigned char row;if (Pix_y%8==0) row=Pix_y/8;//计算位图所占行数elserow=Pix_y/8+1;for (n=0;n<row;n++){LCD_set_XY(X,Y);for(i=0; i<Pix_x; i++){LCD_write_byte(map[i+n*Pix_x], 1);}Y++;//换行}}/*----------------------------------------------------------------------- LCD_write_byte: 使用SPI接口写数据到LCD输入参数:data:写入的数据;command :写数据/命令选择;编写日期:2004-8-10最后修改日期:2004-8-13-----------------------------------------------------------------------*/ void LCD_write_byte(unsigned char data, unsigned char command){PORTB &= ~LCD_CE ;// 使能LCDif (command == 0)PORTB &= ~LCD_DC ;// 传送命令elsePORTB |= LCD_DC ;// 传送数据SPDR = data;// 传送数据到SPI寄存器while ((SPSR & 0x80) == 0);// 等待数据传送完毕PORTB |= LCD_CE ;// 关闭LCD}o延时程序:文件名delay.c/*----------------------------------------------------------------------- 延时函数系统时钟:8M-----------------------------------------------------------------------*/ void delay_1us(void)//1us延时函数{asm("nop");}void delay_nus(unsigned int n)//N us延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void)//1ms延时函数{unsigned int i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n)//N ms延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1ms();}o lcd.h头文件//Mega48/8port B pinout for LCD.#define LCD_DC0x01//PB0#define LCD_CE0x04//PB2#define SPI_MOSI0x08//PB3#define LCD_RST0x10//PB4#define SPI_CLK0x20//PB5void LCD_init(void);void LCD_clear(void);void LCD_write_String(unsigned char X,unsigned char Y,char *s);void LCD_write_chi(unsigned char X, unsigned char Y,unsigned char ch_with,unsigned char num,unsigned char line,unsigned char row);void LCD_move_chi(unsigned char X, unsigned char Y, unsigned char T);void LCD_write_char(unsigned char c);void LCD_draw_map(unsigned char X,unsigned char Y,unsigned char *map,unsigned char Pix_x,unsigned char Pix_y);void LCD_write_byte(unsigned char data, unsigned char dc);void delay_1us(void);void delay_nus(unsigned int n);void delay_1ms(void);void delay_nms(unsigned int n);o点阵数据文件chinese.h文件:/*------------------------------------------------------------------------------;源文件 / 文字 : 欢迎光临电子爱好者俱乐部!;宽×高(像素): 12×13;字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/24字节;数据转换日期: 2004-8-12 14:22:30------------------------------------------------------------------------------*/const unsigned char china_char[][24]={{0x14,0x24,0xC4,0x3C,0x04,0x30,0x0E,0xE8,0x08,0x28,0x18,0x00,0x04,0x03, 0x00,0x09,0x0A,0x04,0x03,0x00,0x03,0x04,0x08,0x00},//汉字“欢”{0x10,0xF2,0x04,0x00,0xFC,0x84,0x82,0xFC,0x04,0x04,0xFC,0x00,0x0C,0x03, 0x04,0x04,0x09,0x08,0x08,0x0B,0x08,0x09,0x09,0x00},//汉字“迎”{0x20,0x24,0x28,0xF0,0x20,0x3E,0xE0,0x30,0x28,0x24,0x20,0x00,0x08,0x08, 0x04,0x03,0x00,0x00,0x07,0x08,0x08,0x08,0x0E,0x00},//汉字“光”{0xF8,0x00,0xFE,0x00,0x20,0x98,0x8E,0x98,0xA8,0x88,0x88,0x00,0x03,0x00, 0x0F,0x00,0x00,0x0F,0x04,0x07,0x04,0x04,0x0F,0x00},//汉字“临”{0x00,0xF8,0x28,0x28,0x28,0xFE,0x28,0x28,0x28,0xFC,0x08,0x00,0x00,0x03, 0x01,0x01,0x01,0x07,0x09,0x09,0x09,0x09,0x0C,0x00},//汉字“电”{0x40,0x42,0x42,0x42,0x42,0xF2,0x52,0x4A,0x46,0x62,0x40,0x00,0x00,0x00, 0x00,0x08,0x08,0x0F,0x00,0x00,0x00,0x00,0x00,0x00},//汉字“子”{0x30,0x54,0x54,0x5C,0xF4,0x5C,0x52,0x5A,0x56,0x52,0x30,0x00,0x08,0x08,0x04,0x0A,0x0B,0x05,0x05,0x0B,0x09,0x08,0x08,0x00},//汉字“爱”{0x88,0x78,0x0E,0x88,0x78,0x42,0x42,0xF2,0x4A,0x46,0x40,0x00,0x09,0x05, 0x02,0x03,0x04,0x00,0x08,0x0F,0x00,0x00,0x00,0x00},//汉字“好”{0x20,0x24,0x24,0xA4,0xFE,0xA4,0xB4,0xAC,0xA4,0x32,0x20,0x00,0x02,0x02, 0x01,0x0F,0x0A,0x0A,0x0A,0x0A,0x0F,0x00,0x00,0x00},//汉字“者”{0x20,0xF8,0x06,0x00,0xFE,0x52,0x52,0x52,0x52,0xFE,0x00,0x00,0x00,0x0F, 0x01,0x09,0x05,0x03,0x01,0x01,0x03,0x05,0x09,0x00},//汉字“俱”{0x00,0x60,0x5C,0xC4,0x44,0x44,0xFA,0xC2,0x42,0x60,0x40,0x00,0x04,0x02, 0x01,0x00,0x08,0x08,0x0F,0x00,0x01,0x02,0x04,0x00},//汉字“乐”{0x24,0xAC,0xB4,0xA6,0xB4,0xAC,0x24,0xFC,0x04,0x74,0x8C,0x00,0x00,0x0F, 0x04,0x04,0x04,0x0F,0x00,0x0F,0x02,0x04,0x03,0x00},//汉字“部”{0x00,0x38,0xFC,0xFC,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//汉字“!”};6x8.h文件:// 6 x 8 font// 1 pixel space at left and bottom// index = ASCII - 32const unsigned char font6x8[][6] ={{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },// sp { 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 },// ! { 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 },// " { 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 },// # { 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 },// $ { 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 },// % { 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 },// & { 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 },// ' { 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 },// ( { 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 },// ) { 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 },// *{ 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 },// , { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 },// - { 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 },// . { 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 },// / { 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E },// 0 { 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 },// 1 { 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 },// 2 { 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 },// 3 { 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 },// 4 { 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 },// 5 { 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 },// 6 { 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 },// 7 { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 },// 8 { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E },// 9{ 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 },// ; { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 },// < { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 },// = { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 },// > { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 },// ? { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E },// @ { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C },// A { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 },// B { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 },// C { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C },// D { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 },// E { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 },// F { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A },// G { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F },// H{ 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 },// J { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 },// K { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 },// L { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F },// M { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F },// N { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E },// O { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 },// P { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E },// Q { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 },// R { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 },// S { 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 },// T { 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F },// U { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F },// V { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F },// W{ 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 },// Y { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 },// Z { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 },// [ { 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 },// 55 { 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 },// ] { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 },// ^ { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 },// _ { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 },// ' { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 },// a { 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 },// b { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 },// c { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F },// d { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 },// e { 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 },// f{ 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 },// h { 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 },// i { 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 },// j { 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 },// k { 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 },// l { 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 },// m { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 },// n { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 },// o { 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 },// p { 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC },// q { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 },// r { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 },// s { 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 },// t { 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C },// u{ 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C },// w{ 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 },// x{ 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C },// y{ 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 },// z{ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 }// horiz lines};bmp.h文件/*------------------------------------------------------------------------------;源文件 / 文字 : AVR;宽×高(像素): 40×24;字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/120字节;数据转换日期: 2004-8-13------------------------------------------------------------------------------*/unsigned char AVR_bmp[]={0x00,0x00,0x00,0x80,0xF0,0xF0,0x70,0xF0,0xF0,0x80,0x00,0x00,0x00,0x30, 0xF0,0xF0,0xC0,0x00,0x00,0x00,0x00,0x00,0xC0,0xF0,0xF0,0x30,0x00,0xF0, 0xF0,0xF0,0x70,0x70,0x70,0x70,0x70,0xF0,0xE0,0xC0,0x00,0x00,0x00,0xC0, 0xF8,0xFF,0xFF,0xE3,0xE0,0xE3,0xFF,0xFF,0xFC,0xC0,0x00,0x00,0x01,0x0F, 0x7F,0xFE,0xF0,0x80,0xF0,0xFE,0x7F,0x0F,0x01,0x00,0x00,0xFF,0xFF,0xFF, 0x1C,0x1C,0x3C,0x7C,0xFC,0xEF,0xCF,0x07,0x00,0x00,0x06,0x07,0x07,0x01, 0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x07,0x06,0x00,0x00,0x00,0x00,0x03, 0x07,0x07,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x00,0x00, 0x00,0x00,0x01,0x07,0x07,0x07,0x04,0x00};/*------------------------------------------------------------------------------;源文件 / 文字 : 实验室;宽×高(像素): 36×15;字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/72字节;数据转换日期: 2004-8-13------------------------------------------------------------------------------*/unsigned char china_bmp[]={0x20,0x18,0x88,0x28,0x48,0x0C,0xE8,0x08,0x08,0x28,0x18,0x00,0x84,0xF4, 0x84,0xFC,0x40,0x20,0x50,0x4C,0x50,0x20,0x40,0x00,0x10,0x18,0x28,0xA8, 0x68,0x2C,0x28,0x68,0xA8,0x28,0x18,0x00,0x02,0x12,0x12,0x13,0x0A,0x06, 0x03,0x06,0x0A,0x12,0x02,0x00,0x04,0x14,0x12,0x0F,0x10,0x17,0x10,0x17, 0x18,0x17,0x10,0x00,0x10,0x10,0x15,0x15,0x15,0x1F,0x15,0x15,0x15,0x11, 0x10,0x00}。
LED显示汉字说明
2 显示原理及控制方式分析2.1 LED点阵模块结构八十年代以来出现了组合型LED点阵显示器模块,以发光二极管为像素,它用高亮度发光二极管芯阵列组合后,环氧树脂和塑模封装而成。
这种一体化封装的点阵LED 模块,具有高亮度、引脚少、视角大、寿命长、耐湿、耐冷热、耐腐蚀等特点。
LED 点阵规模常见的有4×4、4×8、5×7、5×8、8×8、16×16等等。
根据像素颜色的数目可分为单色、双基色、三基色等。
像素颜色不同,所显示的文字、图象等内容的颜色也不同。
单色点阵只能显示固定色彩如红、绿、黄等单色,双基色和三基色点阵显示内容的颜色由像素内不同颜色发光二极管点亮组合方式决定,如红绿都亮时可显示黄色,如果按照脉冲方式控制二极管的点亮时间,则可实现256或更高级灰度显示,即可实现真彩色显示。
图2.1示出最常见的8×8单色LED点阵显示器的内部电路结构和外型规格,其它型号点阵的结构与引脚可试验获得。
图2.1 8×8单色LED模块内部电路LED点阵显示器单块使用时,既可代替数码管显示数字,也可显示各种中西文字及符号.如5x7点阵显示器用于显示西文字母.5×8点阵显示器用于显示中西文,8x8点阵可以用于显示简单的中文文字,也可用于简单图形显示。
用多块点阵显示器组合则可构成大屏幕显示器,但这类实用装置常通过PC机或单片机控制驱动。
2.2 LED 动态显示原理LED点阵显示系统中各模块的显示方式:有静态和动态显示两种。
静态显示原理简单、控制方便,但硬件接线复杂,在实际应用中一般采用动态显示方式,动态显示采用扫描的方式工作,由峰值较大的窄脉冲电压驱动,从上到下逐次不断地对显示屏的各行进行选通,同时又向各列送出表示图形或文字信息的列数据信号,反复循环以上操作,就可显示各种图形或文字信息。
点阵式LED汉字广告屏绝大部分是采用动态扫描显示方式,这种显示方式巧妙地利用了人眼的视觉暂留特性。
16X16点阵LED显示屏(单片机)毕业设计论文
第一章
1.1 设计课题背景知识
单片微型计算机(single chip microcomputer)简称单片机,它是为各类专用控制器而设计的通用或专用微型计算机系统,高密度集成了普通计算机微处理器,一定容量的RAM和ROM以及输入/输出接口,定时器等电路于一块芯片上构成的。
单片机自20世纪70年代问世以来,以极其高的性价比受到人们的重视和关注,所以应用很广,发展很快。单片机的优点是体积小、重量轻、抗干扰能力强,对环境要求不高,价格低廉,可靠性高,灵活性好,开发较为容易。在现代工业控制和一些智能化仪器仪表中,越来越多的场所需要用点阵图形显示器显示汉字,汉字显示屏也广泛应用到汽车报站器,广告屏等。所以研究LED显示有实用的意义。
用点阵方式构成图形或文字,是非常灵活的,可以根据需要任意组合和变化,只要设计好合适的数据文件,就可以得到满意的显示效果。因而采用点阵式图文显示屏显示经常需要变化的信息,是非常有效的。
图文显示屏的颜色,有单色、双色、和多色几种。最常用的是单色图文屏。单色屏多使用红色或橘红色或橙色LED点阵单元。双色图文屏和多色图文屏,在LED点阵的每一个“点”上布置有两个或多个不同颜色的LED发光器件。换句话说,对应于每种颜色都有自己的显示矩阵。显示的时候,各颜色的显示点阵是分开控制的。事先设计好各种颜色的显示数据,显示时分别送到各自的显示点阵,即可实现预期效果。每一种颜色的控制方法和单色的完全相同,因此掌握了单色图文显示屏的原理,双色屏和多色屏就不难理解了。
第二章
2.1
LED点阵总体框图如图1.1所示,点阵电路大体上可以分成微机本身的硬件、显示驱动电路、控制信号电路三部分。控制电路部分包括一个51CUP和一些外围电路。在整个电路当中此控制电路部分相当于一个上位机,它负责控制整个电路以及相应的程序的运行、与PC机的串行通讯、以及给屏体电路部分发送命令。点阵显示屏体、以及它的行和列的各个驱动电路。由于两部分的电路在制板时可以放到一起,所以可以将其字库放到控制电路部分使用串行通讯方式来与屏体电路部分进行数据和命令的传送。
89S51单片机的16×16点阵汉字显示的设计
• 134•针对LED 点阵显示汉字需要占用单片机多个并行口的问题,提出了基于89S51单片机的16×16点阵汉字显示设计,利用74HC138和74HC595对单片机并行口进行扩展,从硬件设计、软件设计方案等关键环节,分别进行了详细讨论。
随着单片机技术的发展,LED 点阵屏作为文字和图形显示的新型媒体,由于亮度高、耗能低、色彩鲜艳、寿命长等特点,迅速出现在学校、医院、车站等场所。
但LED 点阵显示需要占用单片机多个并行口,而通用移位寄存器74HC595T 和译码器74HC138,可以实现对单片机IO 的扩展,从而节约了大量的并口资源。
本设计详细介绍了74HC138和74HC595芯片在1616×16点阵LED 显示屏的应用。
1 电路总体设计16×16点阵汉字显示电路如图1所示,它由一片16×16点阵LED 显示屏、两片74HC138构成的行控制单元、两片74HC595构成的列控制单元及AT89S51单片机构成。
列控制单元用于输入数据,而行控制单元用于逐行扫描。
图1 系统总体结构1.1 16×16点阵工作原理本设计采用的是共阴16×16点阵显示模块。
它由256只发光二极管按一定规律安装成方阵,从内部结构如图2所示,可以看出,总共有16行和16列,每行的发光二极管阴极相连,每列的发光二极管阳极相连。
在行和列的交叉处有一个发光二极管,要使其中任一个二极管发光,则其对应行为低电位,而对应的列为高电位即可。
1.2 行控制单元行控制单元的控制原理是:先使第一行Y 0为低电平,其余行为高电平,显示第一行数据;然后第二行Y 1为低电平,其余行电平,显示第二行数据。
按照这个规律每行以较快的速度不断进行刷新,由于发光二极管的余辉效应和人的视觉暂留现象两个因素,给人的印象就是一组静态的数据,不会产生闪烁感。
动态显示能够节省I/O 端口,且功耗低。
本设计采用74HC138三位译码器。
汉字显示16X16点阵2
16X16点阵汉字显示89C51(测试OK)1汉字显示的原理:我们以UCDOS中文宋体字库为例,每一个字由16行16列的点阵组成显示。
即国标汉字库中的每一个字均由256点阵来表示。
我们可以把每一个点理解为一个像素,而把每一个字的字形理解为一幅图像。
事实上这个汉字屏不仅可以显示汉字,也可以显示在256像素我们以显示汉字“大”为例,来说明其扫描原理:在UCDOS中文宋体字库中,每一个字由16行16列的点阵组成显示。
如果用8位的AT89C51单片机控制,由于单片机的总线为8位,一个字需要拆分为2个部分。
一般我们把它拆分为上部和下部,上部由8*16点阵组成,下部也由8*16点阵组成。
在本例中单片机首先显示的是左上角的第一列的上半部分,即第0列的p00---p 07口。
方向为p00到p07 ,显示汉字“大”时,p05点亮,由上往下排列,为p0.0 灭,p0.1 灭, p0.2 灭p0.3 灭, p0.4 灭, p0.5 亮,p0.6 灭,p0.7 灭。
即二进制00000100,转换为16进制为 04h.。
上半部第一列完成后,继续扫描下半部的第一列,为了接线的方便,我们仍设计成由上往下扫描,即从p27向p20方向扫描,从上图可以看到,这一列全部为不亮,即为00000000,16进制则为00h。
然后单片机转向上半部第二列,仍为p05点亮,为00000100,即16进制04 h.这一列完成后继续进行下半部分的扫描,p21点亮,为二进制00000010,即16进制02h.依照这个方法,继续进行下面的扫描,一共扫描32个8位,可以得出汉字“大”的扫描代码为:04H,00H,04H,02H,04H,02H,04H,04H04H,08H,04H,30H,05H,0C0H,0FEH,00H05H,80H,04H,60H,04H,10H,04H,08H04H,04H,0CH,06H,04H,04H,00H,00H由这个原理可以看出,无论显示何种字体或图像,都可以用这个方法来分析出它的扫描代码从而显示在屏幕上。
LCD1602中文资料(程序和使用说明)
在日常生活中,我们对液晶显示器并不陌生。
液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。
在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。
发光管和LED数码管比较常用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用。
在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。
因此,液晶显示器画质高且不会闪烁。
数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。
功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
10.8.1 液晶显示简介①液晶显示原理液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
②液晶显示器的分类液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。
除了黑白显示外,液晶显示器还有多灰度有彩色显示等。
如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。
③液晶显示器各种图形的显示原理:线段的显示点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。
STM32液晶屏驱动程序
附录2整个设计全部源程序:/*以下是32x64点阵LED电子显示屏的源程序,采用C语言编写,在Keil μVisionV2.38a(C51.Exe V7.06)以及MedWin3.0版环境下均测试通过。
*/ #include <AT89x51.H>unsigned int zimo,xx=0; //zimo是字模计数器,xx为分屏显示的时候的字数。
unsigned char yid,h; //yid为移动计数器,h为行段计数器unsigned char code hanzi[]; //汉字字模unsigned char BUFF[18],BUFF2[18]; //左移显示的缓存void qing(void); void xianshi(void);void fen(void); void zuo(void);void in_data(void); //调整数据void rxd_data(void); //左移发送数据void out_rxd(unsigned char *d); //分屏、上移发送数据char code sw[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x00}; /*8行段码*//***********主程序******************/void main(void){ unsigned char ee;SCON=0;P1=0;yid=0;zimo=0;while(1){ fen(); //分屏显示for(ee=30;ee>0;ee--)//清屏幕3秒{qing();}zuo(); //左移显示for(ee=30;ee>0;ee--){qing();}}}/**********清屏幕*******************/void qing (void){ unsigned char zz,xx=0x0ff;for (zz=33;zz>0;zz--){out_rxd(&xx);}P1=0xff; P1=0; //锁存为高,74HC595锁存信号P2=0; //清74LS138的使能端}/**********分屏显示***********/void fen(void){ do{ xianshi(); }while(xx++<=5); //调用单屏显示xx=0;}/************单屏显示*************/void xianshi(void){ unsigned char ii,jj; unsigned int kk,aa;for (kk=500;kk>0;kk--) //每屏显示500次{for(ii=1;ii<16;ii+=2) //每个汉字分8行扫描{for (jj=0;jj<8;jj++) //每次要发送8个汉字的2个字节,发送8次{ aa=(xx*8+jj)*32+ii;out_rxd(&hanzi[aa]); //从串口输出第1个字的第1字节。
LED点阵显示程序(带汉字移动)
}
}
/**********清屏幕*******************/
void qing (void)
{ unsigned char zz,xx=0x0ff;
for (zz=33;zz>0;zz--)
{out_rxd(&xx);}
else tempyid=yid-8;
temp=(BUFF2[s]>>tempyid)|(BUFF2[s+1]<<(8-tempyid));
SBUF=temp; //把BUFF中的字节从大到小移位相或后发送输出。
while(!TI);TI=0; //等待发送中断
}
yid=0;zimo=zimo+32; //后移一个字,
}
zimo=0;
}
/*************分屏显示的数据发送************/
void out_rxd(unsigned char *d) /*从串口发送数据*/
P1=0xff; P1=0; //锁存为高,74HC595锁存信号
P2=0; //清74LS138的使能端
}
/**********分屏显示***********/
void fen(void)
{ do{ xianshi(); }while(xx++<=5); //调用单屏显示
}
}
unsigned char code hanzi[]={/*自己的汉字编码请放在这里*/};
/*欢迎加入中国电子工程师在线 群号71880007*/
本文来自: 电子工程师之家�
全彩LED显示屏字库动态滚动方式的操作要求
全彩LED显示屏屏是集微电子技术、计算机技术、信息处理技术于一体的大型显示屏系统,它的自带字库显示动态效果主要是依靠硬件扫描驱动,因为这样的操作方法比较简单,但如果遇到一些特殊要求的动态显示就需要利用PC机和单片机控制的LED显示屏系统通讯方法进行显示。
这种方法可以对显示内容进行实时控制,从而实现诸如闪动、滚动、打字等多种动态显示效果。
该方法同时还可以调节动态显示的速度,同时用户也可以在PC机上进行显示效果的预览,显示内容亦可以即时修改而且通过标准模块还可以实现对显示系统的远程控制。
实现动态显示速度调节的方法通常是改变定时器的中断时间,但是当显示速度很慢的时候,该方法容易使整屏的刷新率降低,从而使显示内容出现闪烁。
因此,再设计全彩LED 显示屏时通常采用一种“软定时”方法,即在程序中命名一变量作为“软定时器”,以用来设定两次动态显示的时间间隔。
在对定时中断调用计数时,如果调用次数达到设定值,则改变显示内容。
为保证能够正常显示,“软定时器”的设定值必须大于整屏显示周期,在考虑到余量的情况,可将软定时器的设定值定在大于30ms。
如此循环计数,即可实现动态显示。
“软定时器”的设定值可以通过上位机PC机来改变,这样既可实现LED动态显示的速度调节,又可保持显示内容的流畅和无闪烁感。
LED全彩屏滚动显示要求需要显示的内容每隔一定时间向指定方向移动一列,这样显示屏可以显示更多的内容。
为此,需要在下次移动显示之前对显示缓冲区的内容进行更改,从而完成相应点阵数据的移位操作。
具体操作方法是:设置一个显示缓冲区包括两部分:一部分用来保存当前LED显示屏上显示的10个汉字点阵数据;另一部分为点阵数据预装载区,用来保存即将进入全彩LED显示屏的1个汉字的点阵数据。
滚动指针始终指向显示屏的最右边原点。
当滚动指针移动到需要显示的点阵数据存储区的第1个汉字的首地址时,显示缓冲区LED显示区为空白,而预装载区已保存了第1个待显示汉字的点阵数据。
单片机课程设计_16×16点阵式汉字显示
目录摘要 (1)Abstract (2)1设计原理 (3)1.1 MCS-51单片机的结构及编程方法 (3)1.2 16*16点阵LED原理 (5)1.3 3-8译码器原理 (6)2.设计方案介绍 (7)2.1 设计总体思路 (7)2.2 与题目相关的具体设计 (7)2.3程序设计流程图 (8)3.源程序,原理图和仿真图 (9)3.1程序清单(见附录) (9)3.2电路图 (9)3.2.1电路原理图 (9)3.2.2电路图分析 (9)3.3仿真图 (10)4性能分析 (11)5.总结和心得 (12)6.参考文献 (13)附录:程序代码 (14)摘要LED点阵显示屏作为一种新兴的显示器件,是由多个独立的LED发光二极管封装而成. LED点阵显示屏可以显示数字或符号, 通常用来显示时间、速度、系统状态等。
文章给出了一种基于MCS-51单片机的16×16 点阵LED显示屏的设计方案。
包括系统具体的硬件设计方案,软件流程图和部分汇编语言程序等方面。
在负载范围内, 只需通过简单的级联就可以对显示屏进行扩展,是一种成本低廉的图文显示方案。
关键词:MCS-51;LED;单片机AbstractAs a popular display device component, LED dot-matrix display board consists of several independent LED (Light Emitting Diode). The LED dot-matrix display board can display the number or sign, and it is usually used to show time, speed, the state of system etc. This paper introduces a kind of simple 16x16 LED display screen design process based on MCS-51 single chip minicomputer . The detail hardware scheme, software flow and assemble language programmer design and so on is followed. The display part can be cascaded to meet the need. The practice proves the design is low-cost and effective.Key words: MCS-51;LED;MCU1设计原理1.1 MCS-51单片机的结构及编程方法MCS-51单片机的组成: CPU(进行运算、控制)、RAM(数据存储器)、ROM(程序存储器)、I/O口(串口、并口)、内部总线和中断系统等。
8乘8(8x8)点阵汉字显示
单片机课程设计题目:8*8点阵汉字显示器专业班级:******姓名:******学号:*********一.摘要:用TOP-23088DH-U 8*8点阵块设计制作一个8*16点阵汉字显示器。
通过51单片机作为控制系统,由8255的A口为段数据口向两块点阵提供行数据,C口提供扫描列信息,通过74LS154译码后进行扫描,当点阵的行接高电平,列为低电平时,同时选通,则在该点的LED点亮。
由于实验箱上所提供的驱动电流太低,不足以点亮二极管,所以在电路中增加一个74LS254芯片,以提供点亮LED 所需的驱动电流。
同时在P1.0-P1.2口接3个开关,形成按键控制功能选择。
点阵模块图如下:如上图所示,本实验通过列扫描方式,扫描同时给行线送显示数据。
当扫描到某列,则该列选通,其他列截止,选通瞬间送显示数据,则所对应的二极管亮。
点阵依靠循环点亮每一列(或行),快速循环形成一屏图像,而每一屏快速交替,可进一步形成动画的效果。
二.设计任务和要求:(1)基本要求:1.能显示8*8的汉字,用两个8*8点阵,显示“大连”。
2.通过键盘控制可以改变显示的汉字与图形。
3.通过键盘控制,可以实现彩灯控制功能,发光管从内向外周期显示和相反显示。
(2)发挥要求:1.增加驱动电路,提高显示亮度。
三.方案选择和论证:3.1:方案论证:控制模块由8051、74LS154,8255组成,其中,采用51单片机制做一个最小系统,包含有时钟信号电路、复位电路等,154是4线转16线译码器,4线端接8255的PC.0-PC.3口,16线端低电平有效,控制点阵的16列,245是对列的驱动,8255的PA.0-PA.7用于将行扫描数据进行高速串-并转换,实验箱内部便可提供较大电流总够控制点阵的8行,这样,点阵的128个点中被选通的就亮。
显示模块由2块8×8点阵组成,通过相互并联转换成16×8点阵。
3.2:方案选择:(1).实验仪器(2).流程图:YNNYNYN(3).硬件连接开始不显示 K1是否按下?K2是否按下?K3是否按下?静态显示“大连”动态显示“大连”(由内向外再相反显示)静态显示“爱心”(图形)四.实际操作与调试:(1)实际制作使用keil 先对软件程序进行编译测试并进行proteus 仿真,调试成功后开始硬件部分。
汉字字模工具软件操作手册
[备注]
用户在使用试用版时,可使用汉字字模工具软件的所有功能,汉字和图片上都会有“X”出现。用户注册后即为正版软件, “X”会自动消失。 如果您是我们的用户,如果您在使用中发现软件有 Bugs 或您有更好建议,请发邮件给我们。我们将对您的意见保留,在 我们考证并认可的情况下,我们感谢您提出的宝贵意见并将修正或升级本软件!
2.安装说明 1)、运行 汉字字模点阵数据批量生成工具安装程序.exe。 2)、选中 我接受许可证协议中的条款(如果您觉得许可证协议条款内容不太合理,可以不接受,并退出安装程序)。 3)、单击下一步,进入下一个安装画面,输入用户名及公司名称。 4)、单击下一步,进入下一个安装画面,在这里直接单击 下一步 将把程序安装在默认路径下。单击 更改 按钮更改安
ቤተ መጻሕፍቲ ባይዱ
[注册]
用户在程序的帮助菜单里点击“注册软件”可得到机器码(Machine Number),用户把机器码寄给作者,并从作者处获得 注册码(License Number)。用户再回到帮助菜单点击“注册软件”利用作者提供的注册码进行注册。注册后,重新启动程 序即可正常使用本软件。详细的情况请参考帮助菜单里的注册说明。
所有汉字字模都生成。包含单个汉字字模的.c 文件和 bmp 文件(24 位位图文件),还包含一个含有所有字模 All.c 文件, 并把这个文件以记事本打开。
11. 字模数据取反。因为液晶的生产厂家或型号不同,导致字模数据 1 和 0 对应的显示也不同。按照常规思维,1 代表点
亮,而实际上有的液晶显示模块正好相反。本软件为了方便开发者编程,故提供字模数据取反的功能。为编程工作节 省了一步。
装路径。 5)、继续单击下一步,进入下一个安装画面,单击 安装 按钮进行软件的安装。 6)、单击 完成 按钮完成安装。
基于51单片机的16乘16点阵汉字显示设计
SendLeft(chinese[i+k]);
SendRight(chinese[num*16+i+k+15]);
ChooseColumn(i+1);
//
ChooseColumn(16-i);
DelayMs_12M(1); } } } }
//不需修改代码 只需前后加空格代码 //流动显示 需补充代码 //speed200 大概是 4 秒 一般取 4 //num<2000 void FlowDisplayBetter(uchar chinese[],uchar num,uchar speed) {
sbit upa=P2^1; sbit upb=P2^2; sbit upc=P2^3; sbit upg=P2^0;
sbit downa=P0^6; sbit downb=P0^7; sbit downc=P2^7; sbit downg=P1^0;
uchar code chinese1[]; uchar code chinese2[]; uchar code chinese3[]; uchar code title[]; uchar code collectiveShow1[]; uchar code testCode[];
main() {
Init(); while(1) {
//
SendLed(0x00);
DisplayChinese(chinese2,3,60);
FlowDisplay(title,14,3);
FlowDisplayBetter(testCode,3,3);
DelayMs_12M(10);
//
SendLed(0xff);
16x16点阵显示汉字并移动原理图程序
16x16点阵显示汉字并移动原理与源程序(简单)周渴望南阳理工学院QQ6本次设计中首先在做了8x8点阵汉子显示基础之上做的,其实点阵原理很简单,就像数码管动态显示一样简单,只要你分清楚行控制,与列控制,某段时间某列可以点亮,哪几行亮,动态扫描一个循环自然组成不同的图像。
这里取模方式是先最左边的一列选通,然后控制控制两个74ls164分别点亮16行中的几行,然后是从左向右第二列依次下去,形成动态扫描。
本文程序非常简单,虽然没注释,认真看几十分钟就全明白了,说白了,数码管动态显示一回事(呵呵其实我自己做的时候下了不少功夫建议先做8x8)。
源程序:#include <reg52.h>unsigned char i;sbit DATA1=P3^7;sbit DATA2=P3^5;sbit CLCK1=P3^6;sbit CLCK2=P3^4;#define uchar unsigned char#define uint unsigned intvoid shuru_1();void shuru_2();unsigned char num,k,temp1,temp2,zuo=0;unsigned int timecount;unsigned char code lie[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, };/*74hc154显示代码从左到右16列依次选通*/unsigned char code hang[288]={0x00,0x00,0x00,0x00,0x1F,0xF8,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0xFF,0 xFE,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x1F,0xF9,0x00,0x01,0x00,0x0F,0x00,0x00,/*"电",0*/0x01,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x02,0x41,0x01,0x47,0xFE,0x 45,0x00,0x49,0x00,0x51,0x00,0x61,0x00,0x41,0x00,0x01,0x00,0x01,0x00,0x00,0x00,/*"子",1*/ 0x00,0x00,0x00,0x42,0x44,0x44,0x4C,0xC8,0x54,0xD0,0x65,0x42,0x45,0x41,0x46,0x7E,0 x84,0x40,0x88,0x40,0x90,0x50,0x81,0x48,0x80,0xC4,0x00,0x62,0x00,0x00,0x00,0x00,/*"系",2*/0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0x11,0x22,0x31,0x22,0x51,0x22,0x91,0x22,0x1 1,0x22,0x11,0x22,0x11,0x22,0x1F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"自",3*/ 0x02,0x08,0x22,0x3C,0x23,0xC8,0x22,0x08,0x22,0x28,0x22,0x1D,0x02,0x02,0x08,0x0C,0 x08,0x70,0xFF,0x80,0x08,0x02,0x08,0x01,0x08,0x02,0x0F,0xFC,0x00,0x00,0x00,0x00,/*"动",4*/0x00,0x80,0x01,0x00,0x06,0x00,0x1F,0xFF,0xE0,0x00,0x00,0x20,0x00,0x40,0x00,0x80,0x FF,0xFC,0x02,0x02,0x04,0x02,0x08,0x02,0x10,0x02,0x20,0x02,0x00,0x1E,0x00,0x00,/*"化",5*/ 0x00,0x08,0x00,0x08,0x1F,0xC8,0x92,0x48,0x52,0x48,0x32,0x48,0x12,0x48,0x1F,0xFF,0x 12,0x48,0x32,0x48,0x52,0x48,0x92,0x48,0x1F,0xC8,0x00,0x08,0x00,0x08,0x00,0x00,/*"单",6*/ 0x00,0x00,0x00,0x01,0x00,0x06,0x7F,0xF8,0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x0 4,0x40,0xFC,0x40,0x04,0x7F,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,/*"片",7*/ 0x08,0x20,0x08,0xC0,0x0B,0x00,0xFF,0xFF,0x09,0x00,0x08,0xC1,0x00,0x06,0x7F,0xF8,0 x40,0x00,0x40,0x00,0x40,0x00,0x7F,0xFC,0x00,0x02,0x00,0x02,0x00,0x1E,0x00,0x00,/*"机",8*/};void shuru_1() /*74ls164进行输入数据*/{uchar t;for(t=0;t<8;t++){temp1<<=1;DATA1=CY;CLCK1=1;CLCK1=0;}}void shuru_2(){uchar t;for(t=0;t<8;t++){temp2<<=1;DATA2=CY;CLCK2=1;CLCK2=0;}}void main(void){TMOD=0x01;TH0=(65536-2000)/256;TL0=(65536-2000)%256;TR0=1;ET0=1;EA=1;while(1);}void serve_led()interrupt 1 using 0 /*定时中断显示*/{ k=2;TH0=(65536-2000)/256;TL0=(65536-2000)%256;P2=0xff;P2 = lie[num];temp1=hang[num*2+zuo]; /*num*2表示第一个74ls164只去第偶数个字节,跟我的取模方式有关*/shuru_1();P2 = lie[num];temp2=hang[zuo+(num*2+1)]; /*num*2+1表示第二个74ls164只去第奇数个字节,最左第一列16个不控制先发送第一个74ls164字节在发送第二个的字节*/ shuru_2();num++;if(num==16){num=0;}timecount++;if(timecount==100){ num=0;timecount=0;zuo=zuo+2; /*向后扫描加一列实现移动这里每次加二是因为要跳过第二个74ls164的代码前面已经说了取模方式是最左一列16个从上到下取得*/ if(zuo==272){zuo=0;}}}14年8月。
点阵式LED汉字显示屏的总体方案设计与分析
计。
用 有限元方法对离合器轮毂在不 同根数承载 弹簧 的条件下 的 受力情 况和变形情况进行 了数值模拟 ,由结果综合考虑优化 选择 6根弹簧均布的形式作为设计结果 。通过辅助设计方法 和数值模 拟的方法相结合 , 对离合器设计进行 了有 益的探索 ,
中 图分 类号 :P 9 T 3 文献标识码 : A 文 章 编 号 :0 7 8 2 (0 20 — 0 9 0 10 — 3 0 2 1 )5 0 5 — 1
Ov r l p o r m e i n a d a a y i f t e d t m a rx LED h r c e e al r g a d sg n n l ss o h o ti c a a tr ds ly ip a
3 微控 制器 的 考虑
因本 设计采用软件来实现滚屏 , 传输 方式为串行方式 。 且 微控制器单元 的最佳 选择为 S C 2 T 1C系列单 片机 ,其最高 时
1 6点 阵的 L D模块和一 个 1 宽的移位锁 存器构成 。 6X1 E 6位 所有显 示单 元的 1 6根行线均连接到公共 的行 扫描驱动 电路 。
08 x F时 , 执行软件复位 , 强迫程序在 A P区从 头运行 。这 时若
仍然按住 “ o n od键 , D w L a ” 则再一次进入 下载模式 。
址 ,字库芯片返 回连续 3 字节 的全角 汉字 字模 数据 或 1 2 6字
节的 A C I S I半角字模数据 。 这些字模数据就存储在 3 2字节 的
19 ,3:- . 9 4 () 7 4
[ 唐川江. 1 摩托 车离合 器的结构设计及 阻尼分析『 . 车技 3 ] J 25 H J摩托 ]
51单片机驱动16×16LED点阵显示动画汉字汇编程序
51单片机驱动16×16LED点阵显示动画汉字汇编程序这里提供一个完整的AT89S51单片机驱动驱动led点阵显示具有动画效果的汉字的汇编程序列子.ORG0000HST:MOVA,#0FFH;初始化MOVP1,AMOVP2,AMOVP3,AMOVP0,ACLRA;正文显示CHINESE:MOVDPTR,#TAB1;查表指针指向TAB1LCALLHZ;结束动画SCREE: MOVDPTR,#TAB2;查表指针指向TAB2ACALLDDMOVDPTR,#TAB3;查表指针指向TAB3ACALLDDMOVDPTR,#TAB4;查表指针指向TAB4ACALLDDLJMPCHINESE;显示8幅画面子程序,SCREE专用,用字模软件字要倒置(表必须深256字节)DD:MOVB,#00HMOVR0,#08H;显示8幅画面AJMPCCCC0:MOVA,BADDA,#20H;指向下一幅画面MOVB,ACC:MOVR7,#08H;画面停留时间MOVR3,BMOV37H,R0LCALLENTERDIS00:LCALLDISPLAYDJNZR7,DIS00MOVR0,37HDJNZR0,CC0RET;汉字上移子程序,可显示8个汉字,(表必须深256字节)HZ:MOVR3,#00H;查表偏移量MOVR5,#81H;查表128次MOVBACK:MOVR4,#10H;使显示完一个汉字MOVBACK0:MOVR7,#02H;一桢画面显示时间MOVR0,#6DH;低8位R0指向显示缓存倒数第3个字节,以备与最后1个字节交换MOVR1,#6CH;高8位R1指向显示缓存倒数第4个字节,以备与倒数第2个字节交换MOVR2,#10H;内存后移的次数DJNZR5,MOVBACK1RET;显示完该表,返回MOVR0,AMOVA,R3;指向下一字节INCAMOVR3,AMOVA,R3;指向下一字节INCAMOVR3,AMOV30H,R3;保护数据MOV31H,R4MOV32H,R5DISMOV:LCALLDISPLAY;显示当前数据DJNZR7,DISMOVMOVR3,30HMOVR4,31HMOVR5,32HDJNZR4,MOVBACK0MOV30H,R3;保护数据MOV32H,R5MOVR7,#24H;显示当前数据延时DISMOV0:LCALLDISPLAYDJNZR7,DISMOV0MOVR3,30HMOVR5,32HLJMPMOVBACK;放进一幅显示数据到显示缓存子程序,要先设好指针DPTR和R3,影响R1,R2,R3ENTER:MOVR1,#50H;从50H单元起把表存入MOVR2,#20H;查表次数MOVA,R3MOVR3,A;将指针修改结果存入R3DJNZR2,CLLOOP_;没查完转CLLOOP_RETMOVR6,#7FH;赋扫描字初值,左移后初值为0FEHMOVR5,#00H;列扫描低8位控制MOVR0,#50H;行的高8(p1)位要显示的数据起始地址MOVR1,#10H;扫描次数CPLA;数据取反以适合显示MOVP0,A;送入行的低8(p0)位要显示的数据INCR0;R0指向下一个高8(p0)位要显示的数据LCALLNE某T;调用列扫描程序LCALLDELAY1MS;显示延时DJNZR1,DISLOOP;一桢显示完返回MOVP3,#0FFH;全灭RET ;列扫描子程序DISLOOP专用NE某T:JNCNE某T1;C=0转扫描高8(p3)位行MOVA,R6;修改扫描字RLAMOVR6,AINCR5CJNER5,#09H,NE某T0;R6=#0FEH时C=0AJMPNE某T1BACK:RETNE某T0:MOVP2,R6;扫描低8(p2)位行AJMPBACKNE某T1:MOVP2,#0FFHMOVP3,R6;扫描高8(p3)位行MOVA,R6;修改扫描字工作方式1;16位方式TR0=1;//启动定时器T0P1=0某3f;//P1端口初值,允许接收,缓存,显示IE=0某87;//允许定时器T0中断IT0=1;IT1=1;PT0=1;while(1){delay(1000);for(i=0;i<32;i++)//显示效果:卷帘出{dipram[i]=Bmp[5][i];huancun[i]=Cmp[5][i];if(i%2)delay(70);}dela y(100);for(i=0;i<6;i++)//显示效果:上滚屏{for(j=0;j<16;j+ +){for(k=0;k<15;k++){huancun[k某BLKN]=huancun[(k+1)某BLKN];huancun[k某BLKN+1]=huancun[(k+1)某BLKN+1];dipram[k某BLKN]=dipram[(k+1)某BLKN];dipram[k某BLKN+1]=dipram[(k+1)某BLKN+1];}huancun[30]=Bmp[i][j某BLKN];huancun[31]=Bmp[i][j某BLKN+1];dipram[30]=Bmp[i][j某BLKN];dipram[31]=Bmp[i][j某BLKN+1];delay(70);}}delay(1000);for(i=0;i<32;i++)//显示效果半屏卷帘{dipram[i]=Bmp[5][i];huancun[i]=Cmp[5][i];if(i%2)delay(70);}for( i=0;i<6;i++)//显示效果,左跑马{for(j=0;j<2;j++)for(k=1;k<9;k++){for(l=0;l<16;l++){huancun[l某BLKN]=huancun[l某BLKN]<<1|huancun[l某BLKN+1]>>7;huancun[l某BLKN+1]=huancun[l某BLKN+1]<<1|Cmp[i][l某BLKN+j]>>(8-k);dipram[l某BLKN]=dipram[l某BLKN]<<1|dipram[l某BLKN+1]>>7;dipram[l某BLKN+1]=dipram[l某BLKN+1]<<1|Bmp[i][l某BLKN+j]>>(8-k);}delay(70);}}delay(1000);for(i=0;i<32;i++)//显示效果:半屏卷帘{dipram[i]=Bmp[5][i];huancun[i]=Cmp[0][i];if(i%2)delay(70);}for( i=1;i<7;i++)//显示效果:向下滚屏{for(j=16;j>0;j--){for(k=15;k>0;k--){huancun[k某BLKN]=huancun[(k-1)某BLKN];huancun[k某BLKN+1]=huancun[(k-1)某BLKN+1];dipram[k某BLKN]=dipram[(k-1)某BLKN];dipram[k某BLKN+1]=dipram[(k-1)某BLKN+1];}huancun[0]=Bmp[i-1][(j-1)某BLKN];huancun[1]=Bmp[i-1][(j-1)某BLKN+1];dipram[0]=Bmp[i-1][(j-1)某BLKN];dipram[1]=Bmp[i-1][(j-1)某BLKN+1];delay(70);}}delay(1000);for(i=0;i<6;i++)//显示效果,右跑马{for(j=2;j>0;j--)for(k=1;k<9;k++){for(l=0;l<16;l++){/某for(m=0;m<32;m++)//显示效果:卷帘出{dipram[m]=Bmp[5][m];}某/huancun[l某BLKN+1]=huancun[l某BLKN+1]>>1|huancun[l某BLKN]<<7;huancun[l某BLKN]=huancun[l某BLKN]>>1|Bmp[i][l某BLKN+j-1]<KN+1]=dipram[l某BLKN+1]>>1|dipram[l某BLKN]<<7;dipram[l某BLKN]=dipram[l某BLKN]>>1|Bmp[i][l某BLKN+j-1]<+)//显示效果:卷帘入{huancun[i]=0某00;dipram[i]=0某00;if(i%2)delay(70);}}}//延时函数voiddelay(unignedintdt){regiterunignedcharbt;for(;dt;dt--)for(b t=0;bt<255;bt++);}//显示屏扫描(定时器T0中断)函数voidleddiplay(void)interrupt1uing1{regiterunignedchari,j=BLKN;TH 0=0某f8;//设定显示屏刷新率每秒62.5TL0=0某30;i=P1;//读取当前显示的行号i=++i&0某0f;//行号加一,屏蔽高四位do{j--;SBUF=huancun[i某BLKN+j];//送显示数据while(!TI);TI=0;}while(j);j=2;do{j--;SBUF=dipram[i某BLKN+j];//送显示数据while(!TI);TI=0;}while(j);//完成一行数据的发送G=1;//消隐(关闭显示)P1&=0某f0;//行号端口清零RRCLK=1;//显示数据打入输出锁存2022-5-712:10回复肥肠炒饭器P1|=i;//写入行号RRCLK=0;//所存显示数据G=0;//打开显示}3楼voide某ter0(void)interrupt0{//unignedchardatadipram[32];unignedcharcodeDmp[][32]={{0某40,0某00,0某20,0某00,0某FC,0某3F,0某04,0某20,0某04,0某20,0某E4,0某27,0某24,0某24,0某24,0某24, 0某24,0某24,0某24,0某24,0某E4,0某27,0某24,0某24,0某04,0某20,0某04,0某28,0某04,0某10,0某00,0某00},/某\向\ {0某40,0某00,0某40,0某10,0某FE,0某3F,0某40,0某10,0某40,0某08,0某40,0某04,0某FF,0某7F,0某80,0某01, 0某40,0某00,0某30,0某0C,0某2C,0某03,0某E3,0某00,0某20,0某20,0某20,0某20,0某C0,0某3F,0某00,0某00},/某\老\ {0某10,0某00,0某D0,0某7F,0某12,0某04,0某12,0某04,0某D2,0某7F,0某52,0某44,0某52,0某44,0某52,0某44, 0某52,0某44,0某4A,0某44,0某4A,0某54,0某48,0某24,0某04,0某04,0某02,0某04,0某01,0某04,0某00,0某04},/某\师\{0某50,0某00,0某90,0某00,0某88,0某3D,0某88,0某20,0某2C,0某20,0某24,0某20,0某26,0某20,0某25,0某20,0某24,0某20,0某24,0某20,0某24,0某20,0某24,0某20,0某24,0某20,0某24,0某28,0某24,0某10,0某00,0某00},/某\们\ {0某00,0某02,0某FE,0某06,0某08,0某02,0某28,0某02,0某44,0某7F,0某FE,0某11,0某50,0某12,0某10,0某12, 0某FE,0某12,0某10,0某0A,0某10,0某04,0某10,0某04,0某F0,0某0A,0某1E,0某11,0某80,0某60,0某40,0某20},/某\致\ {0某48,0某04,0某48,0某04,0某FF,0某05,0某48,0某04,0某04,0某7E,0某FC,0某22,0某82,0某23,0某81,0某12, 0某BC,0某14,0某A4,0某14,0某A4,0某08,0某BC,0某08,0某80,0某14,0某80,0某72,0某A0,0某21,0某40,0某00},/某\敬\};regiterunignedchari,j,k;delay(1000);for(i=0;i<32;i++)//显示效果:卷帘出{dipram[i]=Dmp[0][i];if(i%2)delay(70);}delay(100);for(i=1;i<6;i++)//显示效果:上滚屏{for(j=0;j<16;j++){for(k=0;k<15;k++){dipram[k某BLKN]=dipram[(k+1)某BLKN];dipram[k某BLKN+1]=dipram[(k+1)某BLKN+1];}dipram[30]=Dmp[i][j某BLKN];dipram[31]=Dmp[i][j某BLKN+1];delay(70);}}delay(1000);for(i=0;i<32;i++)//显示效果:卷帘入{dipram[i]=0某00;if(i%2)delay(70);}}voide某ter1(void)interrupt2{unignedcharcodeEmp[][32]={{0某40,0某00,0某40,0某10,0某FE,0某3F,0某40,0某10,0某40,0某08,0某40,0某04,0某FF,0某7F,0某80,0某01, 0某40,0某00,0某30,0某0C,0某2C,0某03,0某E3,0某00,0某20,0某20,0某20,0某20,0某C0,0某3F,0某00,0某00},/某\老\ {0某10,0某00,0某D0,0某7F,0某12,0某04,0某12,0某04,0某D2,0某7F,0某52,0某44,0某52,0某44,0某52,0某44, 0某52,0某44,0某4A,0某44,0某4A,0某54,0某48,0某24,0某04,0某04,0某02,0某04,0某01,0某04,0某00,0某04},/某\师\ {0某50,0某00,0某90,0某00,0某88,0某3D,0某88,0某20,0某2C,0某20,0某24,0某20,0某26,0某20,0某25,0某20, 0某24,0某20,0某24,0某20,0某24,0某20,0某24,0某20,0某24,0某20,0某24,0某28,0某24,0某10,0某00,0某00},/某\们\{0某40,0某00,0某80,0某00,0某FE,0某3F,0某00,0某00,0某08,0某08,0某10,0某04,0某20,0某02,0某FF,0某7F, 0某80,0某00,0某80,0某00,0某FE,0某1F,0某80,0某00,0某80,0某00,0某80,0某00,0某80,0某00,0某80,0某00},/某\辛\ {0某20,0某04,0某20,0某04,0某FE,0某7F,0某20,0某04,0某A0,0某04,0某80,0某00,0某FF,0某7F,0某80,0某00, 0某80,0某00,0某F8,0某0F,0某08,0某08,0某08,0某08,0某08,0某08,0某F8,0某0F,0某08,0某08,0某00,0某00},/某\苦\ {0某00,0某00,0某FE,0某3F,0某00,0某18,0某00,0某06,0某80,0某01,0某80,0某00,0某80,0某00,0某80,0某00, 0某80,0某00,0某80,0某00,0某80,0某00,0某80,0某00,0某80,0某00,0某80,0某00,0某A0,0某00,0某40,0某00},/某\了\};regiterunignedchari,j,k;delay(1000);for(i=0;i<32;i++)//显示效果:卷帘出{huancun[i]=Emp[0][i];if(i%2)delay(70);}delay(100);for(i=1;i<6;i++)//显示效果:上滚屏{for(j=0;j<16;j++){for(k=0;k<15;k++){huancun[k某BLKN]=huancun[(k+1)某BLKN];huancun[k某BLKN+1]=huancun[(k+1)某BLKN+1];}huancun[30]=Emp[i][j某BLKN];huancun[31]=Emp[i][j某BLKN+1];delay(70);}}delay(1000);for(i=0;i<32;i++)//显示效果:卷帘入{huancun[i]=0某00;if(i%2)delay(70);}}单片机16某16点阵显示你好程序2022年05月10日星期日16:49 //测试硬件:at8951+16某16点阵LED//16某16点阵LED显示中文程序//本程序逐个显示中文,从右至左流动显示//使用横向,流动只有字节间操作//--------------------------------#include#defineSELP3//行选线,P3低四位#defineUP8P0//点阵文字上8行IO#defineDOWN8P2//点阵文字下8行IOunignedcharcodeFontData[5][32]={/某--文字:你--某//某--宋体12;此字体下对应的点阵为:宽某高=16某16--某/0某09,0某00,0某09,0某80,0某11,0某04,0某13,0某FE,0某22,0某04,0某34,0某48,0某68,0某40,0某A2,0某50, 0某23,0某48,0某22,0某48,0某24,0某44,0某24,0某46,0某28,0某44,0某21,0某40,0某20,0某80,0某00,0某00/某--文字:好--某//某--宋体12;此字体下对应的点阵为:宽某高=16某16--某/0某10,0某00,0某11,0某FC,0某10,0某08,0某10,0某10,0某FC,0某20,0某24,0某20,0某24,0某20,0某27,0某FE, 0某44,0某20,0某64,0某20,0某18,0某20,0某08,0某20,0某14,0某20,0某26,0某20,0某44,0某A0,0某80,0某40};voidDelay_50u(unignedchart)//50u延时程序{unignedcharj;for(;t>0;t--)for(j=19;j>0;j--);}voidDiNFont(unignedchar某FontBufferStart,unignedcharN,unignedcharTime)//流动显示N个汉字{//参数三个:字符串字模首地址、字数、显示流动速度unignedcharFontNum,i,j,row;//循环变量,字数计数、16次流动、16列扫描for(FontNum=0;FontNumfor(i=0;i<16;i++)//字到字流动16次左移才能完成{for(j=0;jfor(row=0;row<16;row++)//显示16某16屏幕一次{SEL=row;//选通显示列UP8=某(FontBufferStart+FontNum某32+(i+row)某2+1);//获取显示数据循环显示关键算法DOWN8=某(FontBufferStart+FontNum某32+(i+row)某2);//以移动偏移为基础获取新数据Delay_50u(15);//适当延时UP8=0某00;//关闭显示DOWN8=0某00;//关闭显示防止花屏}}}}}voidmain(void){while(1){DiNFont(FontData[0],5,20);}求16某16点阵C程序悬赏分:200-解决时间:2022-11-918:17P1口接154做列扫描P0P2直接接点阵高分求一c程序谢谢~!问题补充:谢谢了·!还可以继续追分就没有人能帮帮我吗哪怕是给我点提示也好是单片机的C程序提问者:milegh-三级最佳答案/某某某某某某某某某某某某某某某点阵字模工具编程辅助效果示例某某某某某某某某某某某某某某某//某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某该示例中的字模数组均由“点阵字模工具”生成,你可以用你自己需要的点阵信息来替换示例中的字模信息,注意字模大小要一致,否则显示会出问题。
74HC154的16×16点阵屏
16×16点阵显示屏决定做个1616的屏看看效果,原理图就是以下了,注意做1616时,要去掉一个74LS154(当然这里也能换用74HC154,虽然功耗大,但价格较低),经过两天的奋斗,终于完工了。
简单的调试后,点亮了!!编个流动显示的程序,哈哈,很炫啊。
心动不如赶快行动啊!!我是把点阵块焊到一块板子上,可方便检查有无虚焊,控制部分放到了另一张板上,做成的实物图就是下面的了,视频在这里:/springvirus/********************************************************* 程序名称:LED1616点阵流动显示汉字简要说明:最大可显示16*16汉字P0口接上行线,P2口接下行线,P3口接扫描线编写: 改编: springvirus*********************************************************/#include <AT89X52.h>#define hang1 P0 //上行线#define hang2 P2 //下行线#define lie P1 //列线#define sum sizeof(hanzi)/32 //自动计算汉字字数/*****参数设置*****/#define ziti 16 //字体大小(宽度)#define light 50 //显示亮度#define move_speed 50 //移动速度unsigned char code hanzi[]={/*-- 文字: 自 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xF8,0x48,0x48,0x4C,0x4B,0x4A,0x48,0x48,0x48,0xF8,0x00,0x00,0x00, 0x00,0x00,0x00,0xFF,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00,/*-- 文字: 制 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x50,0x4F,0x4A,0x48,0xFF,0x48,0x48,0x48,0x00,0xFC,0x00,0x00,0xFF,0x00,0x00, 0x00,0x00,0x3F,0x01,0x01,0xFF,0x21,0x61,0x3F,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,/*-- 文字: 小 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xC0,0x70,0x20,0x00,0xFF,0x00,0x10,0x20,0xC0,0x80,0x00,0x00,0x00, 0x04,0x02,0x01,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x01,0x07,0x02,0x00,/*-- 文字: 型 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x12,0x92,0x7E,0x12,0x12,0xFE,0x12,0x12,0x10,0xFC,0x00,0x00,0xFF,0x00,0x00, 0x40,0x42,0x49,0x48,0x48,0x48,0x49,0x7E,0x48,0x48,0x48,0x4A,0x4C,0x4B,0x40,0x00,/*-- 文字: 点 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xE0,0x20,0x20,0x20,0x3F,0x24,0x24,0x24,0xF4,0x24,0x00,0x00,0x00, 0x00,0x40,0x30,0x07,0x12,0x62,0x02,0x0A,0x12,0x62,0x02,0x0F,0x10,0x60,0x00,0x00,/*-- 文字: 阵 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0xFE,0x02,0x12,0x2A,0xC6,0x88,0xC8,0xB8,0x8F,0xE8,0x88,0x88,0x88,0x88,0x00,0x00, 0xFF,0x00,0x02,0x04,0x03,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x00,/*-- 文字: 显 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x3E,0x2A,0xEA,0x2A,0x2A,0x2A,0xEA,0x2A,0x3E,0x00,0x00,0x00,0x00, 0x20,0x21,0x22,0x2C,0x20,0x3F,0x20,0x20,0x20,0x3F,0x28,0x24,0x23,0x20,0x20,0x00,/*-- 文字: 示 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x20,0x20,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x22,0x20,0x20,0x00, 0x10,0x08,0x04,0x03,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x02,0x0C,0x18,0x00,0x00,/*-- 文字: 系 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x02,0x22,0xB2,0xAA,0x66,0x62,0x22,0x11,0x4D,0x81,0x01,0x01,0x00,0x00, 0x00,0x40,0x21,0x13,0x09,0x05,0x41,0x81,0x7F,0x01,0x05,0x09,0x13,0x62,0x00,0x00,/*-- 文字: 统 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x30,0x2C,0xA3,0x60,0x10,0x84,0xC4,0xA4,0x9D,0x86,0x84,0xA4,0xC4,0x84,0x00, 0x20,0x22,0x23,0x12,0x12,0x92,0x40,0x30,0x0F,0x00,0x00,0x3F,0x40,0x41,0x70,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,0x00};uint k=0,j; //移位变量,k:移位个数uint a=0; //用于软件延时ulong s=(sum+1)*ziti; //s为全部列数uchar disbuf[16][2]; //定义显示缓冲区(16行两列的二维数组以开辟1个16*16汉字的空间)bit move_st; //移动标志/*****可变延时*****/void delay(void){uchar i;for(i=0;i<light;i++);}/*****初始化子程序*****/void init(void){TMOD=0x1;TH0=0xfc;TL0=0x18;}/*****计数器中断程序*****/void timer0(void) interrupt 1 //中断处理{TH0=0xfc;TL0=0x18;a++;}/*****汉字循环显示*****/void run_move(void){uchar k1,k2;if(a>=move_speed) //move_speed控制移动速度{if(k>s-ziti-1)k=0; //整屏移动列数k1=k/ziti;k2=k%ziti;j=ziti*2*k1+k2; //显示指针k++;move_st=1;a=0;}}/*****装载显示数据至缓冲区*****/void load_hanzi(void){uchar i;run_move();if(move_st){for(i=0;i<15;i++){disbuf[i][0]=disbuf[i+1][0];//移位处理 disbuf[i][1]=disbuf[i+1][1];//移位处理 }disbuf[15][0]=hanzi[j];disbuf[15][1]=(hanzi[ziti+j]);move_st=0;}}/*****扫描显示数据缓冲区的内容*****/ void display(void){uchar i;for (i=0;i<16;i++){lie=i;hang1=disbuf[i][0];hang2=disbuf[i][1];delay();hang1=0;hang2=0;}}/*****主程序*****/void main (void){ init();EA=1; //开中断TR0=1;ET0=1;while(1){ load_hanzi();display(); }}。
16×16点阵汉字设计-左移-右移-翻页-上移-下移-多种方式
一、设计依据16x16点阵需要32个驱动,分别为16个列驱动及16个行驱动。
每个行与每个列可以选中一个发光管,共有256个发光管,采用动态驱动方式。
每次显示一行后再显示下一行。
本设计是利用实验仪上的16×16 LED点阵显示器,编写显示英文、汉字字符程序并进行显示,最好能移动显示。
要求在本设计过程中,通过设计合适的硬件电路及对应的软件,实现上述的控制过程,同时写出合格的课程设计说明书。
二、要求及主要内容1.硬件电路设计(1)完成89C51应用系统设计(晶振电路,上电复位电路等)(2)利用单片机I/O口或以扩展锁存器的方式控制点阵显示。
掌握单片机与16×16点阵块之间接口电路的设计方法。
2.程序设计掌握单片机与16×16点阵块之间接口电路的设计方法及编程要求完成主程序的设计及对应的子程序设计。
3.选芯片, 元件按设计连线4.完成子程序调试5.完成总调试三、途径和方法综合运用单片机和电子电路相关知识,实现本次设计。
进行程序设计时先画流程图再进行程序设计。
子程序调试按以下步骤进行:(1)实验板与PC机联机。
(2)利用实验系统16×16点阵实验单元,以两种方式控制点阵显示。
要求编制程序实现汉字点阵循环显示。
点阵时钟摘要LED点阵显示屏是利用发光二极管点阵模块或像素单元组成的平面式显示屏幕。
它具有发光效率高、使用寿命长、组态灵活、色彩丰富以及对室内外环境适应能力强等优点。
并广泛的应用于公交汽车,码头,商店,学校和银行等公共场合的信息发布和广告宣传。
LED显示屏经历了从单色,双色图文显示屏到现在的全彩色视频显示屏的发展过程,自20世纪八十年代开始,LED显示屏的应用领域已经遍布交通、电信、教育、证券、广告宣传等各方面。
LED点阵显示屏可以显示数字或符号,通常用来显示时间、速度、系统状态等。
文章给出了一种基于MCS-51单片机的16×16 点阵LED显示屏的设计方案。
16×16LED点阵屏原理图及驱动程序
{
uchar temp,tempcol;
if(col<8) tempcol=col;
else tempcol=col-8;
temp=(h1>>tempcol)|(h2<<(8-tempcol)); //右移显示
temp=255-temp;
}
/**************************************************************************
右移显示数据生成模块:
***************************************************************************/
void delay(uint p){
uint i,j;
for(i=0;i<p;i++){
for(j=0;j<5;j++)
{;}}
}
/**************************************************************************************
void loadoneline_L(void)
{
char s; //此处不要用uchar定义s
for(s=0;s<2;s++) //s值为屏数加1(16*16为一屏)
{
BUFF[2*s]=HZ[word+32*s+2*disrow];
BUFF[2*s+1]=HZ[word+1+32*s+2*disrow]; //左移显示
点阵动态显示汉字与LCM(LCD)显示图片
d=d-32*N;
if(yu<8)
temp=(word[a]<<yu)|(word[b]>>(8-yu));
else
temp=(word[c]<<(yu-8))|(word[d]>>(16-yu));
}
else;
TR0=1;
return temp;
}
void send()//数据发送函数,写入595芯片数据
我使用的LCM是LM4229;为点阵型,不带字库,其封装如下所示:
LM4229分辨率是240X128,共20个引脚,其引脚名称和功能如下:
1.VSS:GND
2.VDD:VCC(LCD供电电源)
3.VO:LCD背光调节电压
4.C/D:WR=0、C/D=1写命令WR=0、C/D=0写数据
RD=0、C/D=1读状态RD=0、C/D=0读数据
一.
(
设计一个采用8x8点阵的汉字显示屏,要求能连续动态显示多个汉字,字体最少为16x16点阵。
(
题目要求能动态显示多个汉字,且字体最少为16x16点阵,所以最少要用到4块8x8的点阵;如果采用常规的并口连接的话要使用到4个并口(32个输出),显然这是不现实的,而且使用并口也很不经济,占用太多的IO会大大降低单片机的扩张能力,如果要想后继加入一些功能模块的话,IO的个数将十分捉襟见肘。
(
综上考虑,我在硬件设计时,用P2口产生片选信号,而P3口的4端和5端控制74LS595数据的擦除和输出,以下是电路图:
连线的特写如下:
译码器参数片选信号IN。
IN信号控制移位脉冲的输出管道。
74LS595除了脉冲信号CLK(相当于芯片使能)外,其他信号都是并联共用的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浙江 冯惠民
1992-07-10
程序运行时逐个演示移动类型,每演示完一种类型,发出“都”声提示,并即刻进入下一类型演示。
10 A$="欢迎使用汉字移动演示程序,谢谢!”
20 A=LEN(A$):B=33:C$=CHR$(7)
110 FOR J=1 TO 50:NEXT J,I:PRINT C$
120 FOR I=0 TO 33:VTAB 9:PRINT A$
130 A$=RIGHT$(A$,4)+LEFT$(A$,A-4)
140 FOR J=1 TO 50:NEXT J,I:PRINT C$
改动50,80,110,140语句中的数字,可以改变移动速度;将其中的PRINT C$改成RETURN,则能作为子程序调用,使之能用于任何程序之中。
本程序用于中华学习机时,由于该机的汉字均以等长的3字节码保存在主机的内存中,故将程序中出现的数字4改成3即可运行。
30 FOR I=4 TO A STEP 4:C=B-2
40 B$=LEFT$(A$,I):VTRB 3:HTABC:PRINT B$
50 B=C:FOR J=1 TO 100:NEXT J,I:PRINT C$
60 FOR I=4 TO A STEP 4
70 B$=RIGHT$(A$,I):VTAB 5:PRINT B$
80 FOR J=1 TO 100:NEXT J,I:PRINT A$
90 FOR I=0 TO 32:VTAB 7:PRINT A$
100 A$=RIGHT$(A$,A-4)+LEFT$(A$,4)