廿四、ATmega16驱动12864液晶(LGM12641或AMPIRE128X64,KS0108驱动芯片)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*********hanzi2b.h ******************************************************* 宋体,常规,小四,纵向取模,字节倒序 *************************************************************************/ //宋体,常规,小四,纵向取模,字节倒序 unsigned char hang1[]={ /*-- 文字: 中 --*/ /*-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 --*/ 0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00, 0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00, /*-- 文字: 国 --*/ /*-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 --*/ 0x00,0xFE,0x02,0x0A,0x8A,0x8A,0x8A,0xFA,0x8A,0x8A,0x8A,0x0A,0x02,0xFE,0x00,0x00, 0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F,0x48,0x49,0x4E,0x48,0x40,0xFF,0x00,0x00, /*-- 文字: 重 --*/ /*-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 --*/ 0x08,0x08,0x0A,0xEA,0xAA,0xAA,0xAA,0xFF,0xA9,0xA9,0xA9,0xE9,0x08,0x08,0x08,0x00,
1 、仿真环境: u P r o t e u sP r o7 . 4s p 3 u I C CA V R6 . 3 1 a 2 、电路原理图 u 外接 1 M 晶振 u 外接 R C 复位电路 u P r o t e u s 里面元件:L G M 1 2 6 4 1 B S 1 R 或A M P I R E 1 2 8 X 6 4 ,没有字库 3 、程序 u 参照彭伟《单片机 C 语言程序设计实训 100 例——基于 AVR+Proteus 仿真》P217 u 字库生成软件“字模提取 V2.2” 选择:宋体,常规,小四,纵向取模,字节倒序
8
void LCD_Write_Command(unsigned char cmd) { Wait_LCD_Ready(); LCD_DDR=0xFF; LCD_PORT=0xFF; RW_0(); NOP(); DI_0(); LCD_PORT=cmd; EN_1(); NOP(); EN_0(); } //初始化 LCD void LGM12864_Init(void) { DDRD=0xFF; PORTD=0xFF; LCD_Write_Command(0x3F);//开显示,0x3E 为关显示 Delay_ms(15); } //通用显示函数 void Common_Show(unsigned char PageNum,unsigned char Juli,unsigned char Num,unsigned char *r) {
5
} /*********LGM12641.h***************************************************** 液晶驱动程序 LGM12641BS1R *************************************************************************/ #define NOP() asm("nop") //LCD 起始行、页、列指令定义 #define LCD_START_ROW 0xC0 //起始行 #define LCD_PAGE 0xB8 //页指令 #define LCD_COL 0x40 //列指令 //液晶控制引脚 #define RW PD0 #define DI PD1 #define EN PD2 #define CS1 PD3 #define CS2 PD4 #define RST PD5 //液晶端口 #define LCD_PORT PORTC #define LCD_PIN PINC #define LCD_DDR DDRC #define LCD_CTRL PORTD //液晶引脚操作定义
6
#define RW_0() LCD_CTRL&=~(1<<RW) #define RW_1() LCD_CTRL|=(1<<RW) #define DI_0() LCD_CTRL&=~(1<<DI) #define DI_1() LCD_CTRL|=(1<<DI) #define EN_0() LCD_CTRL&=~(1<<EN) #define EN_1() LCD_CTRL|=(1<<EN) #define RST_0() LCD_CTRL&=~(1<<RST) #define RST_1() LCD_CTRL|=(1<<RST) #define CS1_0() LCD_CTRL&=~(1<<CS1) #define CS1_1() LCD_CTRL|=(1<<CS1) #define CS2_0() LCD_CTRL&=~(1<<CS2) #define CS2_1() LCD_CTRL|=(1<<CS2) //是否反相显示(0:白底黑字) unsigned char Reverse_Display=0; //等待液晶就绪 void Wait_LCD_Ready(void) { do { LCD_DDR=0x00; LCD_PORT=0xFF; RW_1(); NOP(); DI_0();
9
unsigned char i; if(Juli<64)//显示在左半屏 { CS1_1();CS2_0(); LCD_Write_Command(LCD_PAGE+PageNum); LCD_Write_Command(LCD_COL+Juli); //全部显示在左半屏 if(Juli+Num<64) { for(i=0;i<Num;i++) LCD_Write_Data(r[i]); } //如果越界则左右半屏显示 else { //左半屏显示 for(i=0;i<64-Juli;i++) LCD_Write_Data(r[i]); //右半屏显示 CS1_0();CS2_1(); LCD_Write_Command(LCD_PAGE+PageNum); LCD_Write_Command(LCD_COL); for(i=64-Juli;i<Num;i++) LCD_Write_Data(r[i]); } }
基于 P r o t e u s 的A V R 单片机仿真 廿四、A T m e g a 1 6 驱动 1 2 8 6 4 液晶(L G M 1 2 6 4 1 B S 1 R 或A M P I R E 1 2 8 X 6 4 ,K S 0 1 0 8 驱动芯片)
(鹰击长空,l o n g s k y 2 0 0 7 @ 1 2 6 . c o m ) ★注:网上资料,;CS2_1(); LCD_Write_Command(LCD_PAGE+PageNum); LCD_Write_Command(LCD_COL+Juli-64); //全部显示在右半屏 for(i=0;i<Num;i++) LCD_Write_Data(r[i]); } } //显示一个 8*16 点阵字符 void Display_A_Char_8X16(unsigned char PageNum,unsigned char Juli,unsigned char *M) { Common_Show(PageNum,Juli,8,M);//显示上半部分 8X8 Common_Show(PageNum+1,Juli,8,M+8);//显示下半部分 8X8 } //显示一个 16*16 点阵汉字 void Display_A_Word(unsigned char PageNum,unsigned char Juli,unsigned char *M) { Common_Show(PageNum,Juli,16,M);//显示上半部分 8X8 Common_Show(PageNum+1,Juli,16,M+16);//显示下半部分 8X8 } //显示一串 16*16 点阵汉字
7
EN_1(); NOP(); EN_0(); } while(LCD_PIN&0x80); } //发送数据 void LCD_Write_Data(unsigned char data) { Wait_LCD_Ready(); LCD_DDR=0xFF; LCD_PORT=0xFF; RW_0(); NOP(); DI_1(); if(!Reverse_Display) LCD_PORT=data; else LCD_PORT=~data; EN_1(); NOP(); EN_0(); } //发送命令
1
2
图2
采用 AMPIRE 液晶时电路增加非门 U1
3
/********main.c************************************* 版 本:ICC AVR 6.25C,外接晶振 1.00MHz MCU :ATmega16 **************************************************/ #include <iom16v.h> #include "delay_Accurate2.h" #include "LGM12641.h" #include "hanzi2b.h" void main() { LGM12864_Init();//初始化液晶 Display_A_Word_String(0,0,8,(unsigned char*)hang1); Reverse_Display=1; Display_A_Word_String(2,0,8,(unsigned char*)hang2); Reverse_Display=0; Display_A_Word_String(4,0,8,(unsigned char*)hang3); Reverse_Display=1; Display_A_Word_String(6,0,8,(unsigned char*)hang1); while(1); } /*********delay_Accurate2.h************************************************ 毫秒级精确延时(ICC AVR)V2.0 *************************************************************************/
11
void Display_A_Word_String(unsigned char PageNum,unsigned char Juli,unsigned char Num,unsigned char *M) { unsigned char i; for(i=0;i<Num;i++) Display_A_Word(PageNum,Juli+i*16,M+i*32); }
4
#define xtal 1 //以 MHz 为单位,不同的系统时钟要修改。 void Delay_1ms(void) { unsigned int i; for(i=0;i<(unsigned int)(xtal*143-2);i++); } void Delay_ms(unsigned int num) { unsigned int i; for(i=0;i<num;i++) Delay_1ms(); } //微秒级精确延时函数,晶振 8M: //Delay = 0.125 *((tt*4-1)+9)微秒 = 0.5tt + 1 (us) void Delay_nus(unsigned char tt) { asm("_L2: subi R16,1"); asm(" nop"); asm(" brne _L2"); asm(" nop"); asm(" ret");