搞了一個晚上終于搞出來了。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]);