搞了一个晚上终于搞出来了。AT89C52单片机,LM4229液晶屏分辨率240x128,没行可显示16x16汉字15个,共8行。大家可以试着改改程序,做个图片显示来,愿意可以分享给大家。有意见尽管提。头文件和Proteus的接线就不不放了,有需要的到论坛上去下载文件。里面有Proteus 文件和所有.c .h文件。
头文件和Proteus的接线就不挂了,有需要的到论坛上去下载文件。里面有Proteus文件和所有.c .h文件
主函数
#include<reg52.h>
#include<lm4229.h>
//============================================
// 主函数
//============================================
void main()
{
unsigned char i;
lcd_init();
for(i=0;i<8;i++)
{
LCD_Cursor(i,2);
Show_String("★欢迎访问单片机技术论坛★");
i++;
LCD_Cursor(i,0);
Show_String("bbs.c51mcu.cn www.c51mcu.com");
}
while(1)
{
}
}
驱动程序
很简单,用的时候像主函数里一样,先设置行列,然后输入字符串就行。字库里没有的不显示。
#include<reg52.h>
#include"io.h"
#include"zimo.h"
unsigned char LCD_lin,LCD_column;
//===========================================
// 函数声明
//-------------------------------------------
void delay_lcd(unsigned char);
void write_data(unsigned char);
void write_com(unsigned char);
//--------------------------------------------
// 延时函数
//--------------------------------------------
void delay_lcd(unsigned char t)
{
for(;t!=0; t--);
}
//--------------------------------------------
// 写数据函数
//--------------------------------------------
void write_data(unsigned char dat)
{
CD=0; //数据
CE=0; //LCD使能
WRIT=0; //写
DATA_PORT=dat; //把数据送到P口
delay_lcd(1); //当晶振较高时加延时
WRIT=1; //关写
CE=1; //关使能
}
//--------------------------------------------
// 写命令函数
//--------------------------------------------
void write_com(unsigned char com)
{
CD=1; //命令
CE=0;
WRIT=0;
DATA_PORT=com;
delay_lcd(1); //当晶振较高时加延时
WRIT=1;
CE=1;
}
//--------------------------------------------
// 清屏
//--------------------------------------------
void clear_lcd(void)
{
unsigned int i,place;
unsigned int length=3840;
place=0;
for(i=0;i<length;i++)
{
write_data(place&0xff); //写入地址高位
write_data(place/256); //写入地址低位
write_com(0x24); //地址设置
write_com(0xb0); //设置数据自动写
write_data(0x00);
write_com(0xb2); //自动复位
place++;
}
}
void LCD_Cursor(unsigned char lin,unsigned char column)
{
LCD_lin=lin;
LCD_column=column;
}
bit Attrib_Fg=0;
void Show8_16(unsigned char code *address,unsigned int place)
{
unsigned char i;
for(i=0;i<16;i++)
{
write_data(place&0xff); //写入地址高位
write_data(place/256); //写入地址低位
write_com(0x24); //地址设置
write_com(0xb0); //设置数据自动写
if(Attrib_Fg)
write_data(~*(address+i));
else
write_data(*(address+i));
// write_data(0xff);
write_com(0xb2); //自动复位
place+=30;
}
}
//--------------------------------------------
//显示8*16字符
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//character:字符代码(标准ASCII码)
//--------------------------------------------
void ShowChar16(unsigned char character)
{
unsigned char i;
unsigned char code *pc;
unsigned int place;
for(i=0;i<Char16_Num;i++)
{
if(zimoc16[i].Gb_Code==character)
{
pc=zimoc16[i].Gb_Data;
break;
}
}
if (i==Char16_Num)return;
place=LCD_lin*30*16+LCD_column;
Show8_16(pc,place);
}
//显示一个汉字
//旋转90度:字模被竖着切分
//hzcode: 汉字代码(自定义的)
//unsigned char code HZtable
void ShowHZ(unsigned char code *hzcode)
{
unsigned char i,j;
unsigned char code *pc,*pc_A;
unsigned int place;
for(i=0;i<Hz_Num;i++)
{
for(j=0,pc_A=hzcode;j<2;j++,pc_A++)
{
if(zimow[i].Hz_Code[j]!=*pc_A)break;
}
if(j==2)
{
pc=zimow[i].Hz_Data;
break;
}
}
if (i==Hz_Num)return;
place=LCD_lin*30*16+LCD_column;
Show8_16(pc,place);
Show8_16(pc+16,place+1);
}
//显示一个串 包含汉字和16*8字符
//旋转90度:字模被竖着切分
void Show_String(unsigned char code *String)
{
unsigned char code *pc_A;
pc_A=String;
while(*pc_A!=0)
{
if(*pc_A>=0xa0)
{
ShowHZ(pc_A);
pc_A+=2;
LCD_column+=2;
}
else
{
ShowChar16(*pc_A);
pc_A++;
LCD_column++;
}
}
}
//--------------------------------------------
// LM4229初始化函数
//--------------------------------------------
void lcd_init()
{
FS1 = 0;//fs1管脚高电平时表示字体为8*6;
//低电平时为8*8
MD2 = 0;
HALT = 0;
write_data(0);
write_data(0); //图形首地址
write_com(0x42); //图形首地址设置
write_data(30);
write_data(0);
write_com(0x43); //图形区域设置
write_com(0x80); //设置为OR模式
write_com(0x9a); //关闭文本显示,开图形显示
clear_lcd();
}
字模文件
横向取模
字模文件
横向取模
struct
{
unsigned char Gb_Code;
unsigned char Gb_Data[16];
}code zimoc16[]=
{
'.',0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // -.-
0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
'0',0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,0xD6, // -0-
0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
'1',0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18, // -1-
0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00,
'5',0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E, // -5-
0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00,
'B',0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66, // -B-
0x66,0x66,0x66,0xFC,0x00,0x00,0x00,0x00,
'C',0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0, // -C-
0xC0,0xC2,0x66,0x3C,0x00,0x00,0x00,0x00,
'M',0x00,0x00,0xC6,0xEE,0xFE,0xFE,0xD6,0xC6, // -M-
0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00,
'N',0x00,0x00,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE, // -N-
0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00,
'O',0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0xC6, // -O-
0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00,0x00,
'S',0x00,0x00,0x7C,0xC6,0xC6,0x60,0x38,0x0C, // -S-
0x06,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
'U',0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6, // -U-
0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
'W',0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xD6, // -W-
0xD6,0xFE,0x6C,0x6C,0x00,0x00,0x00,0x00,
'b',0x00,0x00,0xE0,0x60,0x60,0x78,0x6C,0x66, // -b-
0x66,0x66,0x66,0xDC,0x00,0x00,0x00,0x00,
'c',0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC0, // -c-
0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00,
'm',0x00,0x00,0x00,0x00,0x00,0xEC,0xFE,0xD6, // -m-
0xD6,0xD6,0xD6,0xD6,0x00,0x00,0x00,0x00,
'n',0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66, // -n-
0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,
'o',0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC6, // -o-
0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
's',0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0x60, // -s-
0x38,0x0C,0xC6,0x7C,0x00,0x00,0x00,0x00,
'u',0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC, // -u-
0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
'w',0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xC6, // -w-
0xD6,0xD6,0xFE,0x6C,0x00,0x00,0x00,0x00,
};
struct
{
unsigned char Hz_Code[2];
unsigned char Hz_Data[32];
}code zimow[]=
{
"欢", 0x00,0x00,0xFC,0x04,0x45,0x46,0x28,0x28,0x10,0x28,0x24,0x44,0x81,0x01,0x02,0x0C,
0x80,0x80,0x80,0xFC,0x04,0x48,0x40,0x40,0x40,0x40,0xA0,0xA0,0x10,0x08,0x0E,0x04,
"迎", 0x00,0x41,0x26,0x14,0x04,0x04,0xF4,0x14,0x15,0x16,0x14,0x10,0x10,0x28,0x47,0x00,
0x00,0x84,0x7E,0x44,0x44,0x44,0x44,0xC4,0x44,0x54,0x48,0x40,0x40,0x46,0xFC,0x00,
"访", 0x00,0x20,0x10,0x10,0x07,0x00,0xF0,0x10,0x10,0x10,0x10,0x10,0x15,0x19,0x12,0x04,
0x80,0x40,0x40,0x04,0xFE,0x80,0x88,0xFC,0x88,0x88,0x88,0x88,0x08,0x08,0x50,0x20,
"问", 0x20,0x1B,0x08,0x40,0x40,0x4F,0x48,0x48,0x48,0x48,0x48,0x4F,0x48,0x40,0x40,0x40,
0x04,0xFE,0x04,0x04,0x24,0xF4,0x24,0x24,0x24,0x24,0x24,0xE4,0x24,0x04,0x14,0x08,
"单", 0x10,0x08,0x04,0x3F,0x21,0x21,0x3F,0x21,0x21,0x3F,0x21,0x01,0xFF,0x01,0x01,0x01,
0x10,0x20,0x48,0xFC,0x08,0x08,0xF8,0x08,0x08,0xF8,0x00,0x04,0xFE,0x00,0x00,0x00,
"片", 0x00,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x40,0x80,
0x80,0x80,0x80,0x80,0x84,0xFE,0x00,0x00,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
"机", 0x10,0x10,0x11,0x11,0xFD,0x11,0x31,0x39,0x55,0x51,0x91,0x11,0x11,0x12,0x14,0x18,
0x00,0x10,0xF8,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x12,0x12,0x0E,0x00,
"技", 0x10,0x10,0x10,0x13,0xFC,0x10,0x10,0x13,0x1A,0x31,0xD1,0x10,0x10,0x10,0x51,0x26,
0x40,0x40,0x48,0xFC,0x40,0x40,0x40,0xF8,0x08,0x10,0x10,0xA0,0x40,0xB0,0x0E,0x04,
"术", 0x01,0x01,0x01,0x01,0x01,0xFF,0x01,0x03,0x05,0x09,0x11,0x21,0xC1,0x01,0x01,0x01,
0x00,0x40,0x30,0x10,0x04,0xFE,0x00,0x80,0x40,0x20,0x10,0x0E,0x04,0x00,0x00,0x00,
"论", 0x00,0x40,0x30,0x10,0x01,0x02,0xF4,0x11,0x11,0x11,0x11,0x11,0x15,0x19,0x10,0x00,
0x40,0x40,0xA0,0xA0,0x10,0x0E,0x04,0x00,0x10,0x30,0xC0,0x00,0x04,0x04,0xFC,0x00,
"坛", 0x10,0x10,0x13,0x10,0x10,0xFC,0x17,0x10,0x10,0x10,0x10,0x1D,0xF1,0x43,0x00,0x00,
0x00,0x08,0xFC,0x00,0x00,0x04,0xFE,0x40,0x40,0x80,0x90,0x08,0x04,0xFC,0x04,0x00,
"★", 0x00,0x00,0x01,0x01,0x03,0x7F,0x3F,0x1F,0x0F,0x07,0x0F,0x0F,0x1E,0x18,0x20,0x00,
0x80,0x80,0xC0,0xC0,0xE0,0xFF,0xFE,0xFC,0xF8,0xF0,0xF8,0x78,0x3C,0x0C,0x02,0x00,
};
unsigned char code Char16_Num=sizeof(zimoc16)/sizeof(zimoc16[0]);
unsigned char code Hz_Num=sizeof(zimow)/sizeof(zimow[0]);