📄 lcd12864.lis
字号:
.module lcd12864.c
.area text(rom, con, rel)
0000 .dbfile D:\mega16\drive\lcd12864.c
0000 .dbfunc e wcodeL _wcodeL fV
0000 ; left_code -> R20
.even
0000 _wcodeL::
0000 0E940000 xcall push_gset1
0004 402F mov R20,R16
0006 .dbline -1
0006 .dbline 80
0006 ; /******************************************************************************
0006 ; /* LCD12864驱动程序
0006 ; /* 文 件 名:LCD12864
0006 ; /* 创建时间:2004年12月24日
0006 ; /* 创 建 人:胡勇刚
0006 ; /* Email: hygbeyond@163.com
0006 ; //******************************************************************************
0006 ; /* 这是根据我以前所做的C51的程序移值的,这个驱动已经在mega16L上运行成功了
0006 ; /* 这个驱动要注意的是:你用的mega系列的话,要注意和JTAG,ISP的冲突问题,如果
0006 ; /* 用的是C口作为数据口的话,就一定要关闭JTAG,记住如果要用JTAG作为仿真用的话
0006 ; /* 尽量的不要用这几个脚,否则就关闭JTAG(特别是作为I/O口)
0006 ; /* 我就是因为这个问题浪费了不少时间,主要的现象是插上LCD就不工作,
0006 ; /* 拔掉LCD就一切正常,好像应该是LCD触发了JTAG,从而使芯片进入仿真状态了
0006 ; /* 还有一点就是时钟频率,如果时钟频率高的话,需要修改DELAY_COUNT值
0006 ; /* 不然的话显示会有问题,这是因为12864本身的反应速度比较慢的原因
0006 ; /* 我现在所用的是mege16L 频率: 3.6864M
0006 ; /*
0006 ; /* 各位大虾如果有比这个驱动更优化的程序,请给我一份,就用上面的邮箱.谢谢了
0006 ; //*****************************************************************************/
0006 ; #define LCD_12864_H
0006 ;
0006 ; #include "..\c\config.h"
0006 ;
0006 ; //****************************************************************************
0006 ; #ifndef uchar
0006 ; #define uchar unsigned char
0006 ; #define uint unsigned int
0006 ; #endif
0006 ; //***************************************************************************/
0006 ;
0006 ;
0006 ; /***************************************************************************
0006 ; #ifndef LCD_DI
0006 ;
0006 ; #define LCD_DI PB0
0006 ; #define LCD_RW PB1
0006 ; #define LCD_EN PB2
0006 ; #define LCD_CS1 PB3
0006 ; #define LCD_CS2 PB4
0006 ;
0006 ; #define LCD_DATA_IN PINC
0006 ; #define LCD_DATA_OUT PORTC
0006 ; #define LCD_DATA_DDR DDRC
0006 ;
0006 ; #define LCD_CODE_OUT PORTB
0006 ;
0006 ; #define LCD_DI_H LCD_CODE_OUT |= BIT(LCD_DI)
0006 ; #define LCD_DI_L LCD_CODE_OUT &= ~BIT(LCD_DI)
0006 ; #define LCD_RW_H LCD_CODE_OUT |= BIT(LCD_RW)
0006 ; #define LCD_RW_L LCD_CODE_OUT &= ~BIT(LCD_RW)
0006 ; #define LCD_EN_H LCD_CODE_OUT |= BIT(LCD_EN)
0006 ; #define LCD_EN_L LCD_CODE_OUT &= ~BIT(LCD_EN)
0006 ; #define LCD_CS1_H LCD_CODE_OUT |= BIT(LCD_CS1)
0006 ; #define LCD_CS1_L LCD_CODE_OUT &= ~BIT(LCD_CS1)
0006 ; #define LCD_CS2_H LCD_CODE_OUT |= BIT(LCD_CS2)
0006 ; #define LCD_CS2_L LCD_CODE_OUT &= ~BIT(LCD_CS2)
0006 ;
0006 ; #endif
0006 ; //****************************************************************************/
0006 ;
0006 ; #define PRE_PAGE 0xb8 //预设LCD页地址
0006 ; #define PRE_COL 0x40 //预设LCD列地址
0006 ; #define DELAY_COUNT 50 //LCD延迟时间数
0006 ;
0006 ; #define LCD_NOP lcd_delay() //延迟
0006 ; #define LCD_STAY LCD_NOP,LCD_NOP,LCD_CS1_H,LCD_CS2_H
0006 ;
0006 ; #define addressL(page,col) wcodeL(PRE_PAGE+page),wcodeL(PRE_COL+col)
0006 ; #define addressR(page,col) wcodeR(PRE_PAGE+page),wcodeR(PRE_COL+col)
0006 ;
0006 ; //*****************************************************************************
0006 ; void lcd_delay(void); //延迟
0006 ; void wcodeL(uchar left_code); //左屏写入命令
0006 ; void wdataL(uchar left_data); //左屏写入数据
0006 ; void wcodeR(uchar right_code); //右屏写入命令
0006 ; void wdataR(uchar right_data); //右屏写入数据
0006 ; //***************************************************************************/
0006 ;
0006 ; void wcodeL(uchar left_code)//左屏写指令
0006 ; {
0006 .dbline 81
0006 ; LCD_DATA_DDR = 0X00;
0006 2224 clr R2
0008 2ABA out 0x1a,R2
000A 09C0 xjmp L3
000C L2:
000C .dbline 82
000C ; while(1){
000C .dbline 84
000C ; //如果液晶空闲开始写数据和命令
000C ; LCD_CODE_OUT |= ((1<<LCD_EN) | (1<<LCD_RW) | (1<<LCD_CS2));
000C 88B3 in R24,0x18
000E 8661 ori R24,22
0010 88BB out 0x18,R24
0012 .dbline 85
0012 ; LCD_CODE_OUT &= ~((1<<LCD_DI) | (1<<LCD_CS1));
0012 88B3 in R24,0x18
0014 867F andi R24,246
0016 88BB out 0x18,R24
0018 .dbline 86
0018 ; if(!(LCD_DATA_IN & 0X80)){
0018 CF99 sbic 0x19,7
001A 01C0 rjmp L5
001C .dbline 86
001C .dbline 87
001C ; break;
001C 01C0 xjmp L4
001E L5:
001E .dbline 89
001E L3:
001E .dbline 82
001E F6CF xjmp L2
0020 L4:
0020 .dbline 90
0020 ; }
0020 ; }
0020 ; LCD_RW_L;
0020 C198 cbi 0x18,1
0022 .dbline 91
0022 ; LCD_DATA_DDR = 0XFF;
0022 8FEF ldi R24,255
0024 8ABB out 0x1a,R24
0026 .dbline 92
0026 ; LCD_DATA_OUT = left_code;
0026 4BBB out 0x1b,R20
0028 .dbline 93
0028 ; LCD_NOP;
0028 50D1 xcall _lcd_delay
002A .dbline 94
002A ; LCD_EN_L;
002A C298 cbi 0x18,2
002C .dbline -2
002C L1:
002C 0E940000 xcall pop_gset1
0030 .dbline 0 ; func end
0030 0895 ret
0032 .dbsym r left_code 20 c
0032 .dbend
0032 .dbfunc e wdataL _wdataL fV
0032 ; left_data -> R20
.even
0032 _wdataL::
0032 0E940000 xcall push_gset1
0036 402F mov R20,R16
0038 .dbline -1
0038 .dbline 100
0038 ; }
0038 ;
0038 ; //---------------------------------------------------------------------------------
0038 ;
0038 ; void wdataL(uchar left_data)//左屏写数据
0038 ; {
0038 .dbline 101
0038 ; LCD_DATA_DDR = 0X00;
0038 2224 clr R2
003A 2ABA out 0x1a,R2
003C 09C0 xjmp L9
003E L8:
003E .dbline 102
003E ; while(1){
003E .dbline 104
003E ; //如果液晶空闲开始写数据和命令
003E ; LCD_CODE_OUT |= ((1<<LCD_EN) | (1<<LCD_RW) | (1<<LCD_CS2));
003E 88B3 in R24,0x18
0040 8661 ori R24,22
0042 88BB out 0x18,R24
0044 .dbline 105
0044 ; LCD_CODE_OUT &= ~((1<<LCD_DI) | (1<<LCD_CS1));
0044 88B3 in R24,0x18
0046 867F andi R24,246
0048 88BB out 0x18,R24
004A .dbline 106
004A ; if(!(LCD_DATA_IN & 0X80)){
004A CF99 sbic 0x19,7
004C 01C0 rjmp L11
004E .dbline 106
004E .dbline 107
004E ; break;
004E 01C0 xjmp L10
0050 L11:
0050 .dbline 109
0050 L9:
0050 .dbline 102
0050 F6CF xjmp L8
0052 L10:
0052 .dbline 110
0052 ; }
0052 ; }
0052 ; LCD_RW_L;
0052 C198 cbi 0x18,1
0054 .dbline 111
0054 ; LCD_DI_H;
0054 C09A sbi 0x18,0
0056 .dbline 112
0056 ; LCD_DATA_DDR = 0XFF;
0056 8FEF ldi R24,255
0058 8ABB out 0x1a,R24
005A .dbline 113
005A ; LCD_DATA_OUT = left_data;
005A 4BBB out 0x1b,R20
005C .dbline 114
005C ; LCD_NOP;
005C 36D1 xcall _lcd_delay
005E .dbline 115
005E ; LCD_EN_L;
005E C298 cbi 0x18,2
0060 .dbline -2
0060 L7:
0060 0E940000 xcall pop_gset1
0064 .dbline 0 ; func end
0064 0895 ret
0066 .dbsym r left_data 20 c
0066 .dbend
0066 .dbfunc e wcodeR _wcodeR fV
0066 ; right_code -> R20
.even
0066 _wcodeR::
0066 0E940000 xcall push_gset1
006A 402F mov R20,R16
006C .dbline -1
006C .dbline 121
006C ; }
006C ;
006C ; //----------------------------------------------------------------------------------
006C ;
006C ; void wcodeR(uchar right_code)//右屏写指令
006C ; {
006C .dbline 122
006C ; LCD_DATA_DDR = 0X00;
006C 2224 clr R2
006E 2ABA out 0x1a,R2
0070 09C0 xjmp L15
0072 L14:
0072 .dbline 123
0072 ; while(1){
0072 .dbline 125
0072 ; //如果液晶空闲开始写数据和命令
0072 ; LCD_CODE_OUT |= ((1<<LCD_EN) | (1<<LCD_RW) | (1<<LCD_CS1));
0072 88B3 in R24,0x18
0074 8E60 ori R24,14
0076 88BB out 0x18,R24
0078 .dbline 126
0078 ; LCD_CODE_OUT &= ~((1<<LCD_DI) | (1<<LCD_CS2));
0078 88B3 in R24,0x18
007A 8E7E andi R24,238
007C 88BB out 0x18,R24
007E .dbline 127
007E ; if(!(LCD_DATA_IN & 0X80)){
007E CF99 sbic 0x19,7
0080 01C0 rjmp L17
0082 .dbline 127
0082 .dbline 128
0082 ; break;
0082 01C0 xjmp L16
0084 L17:
0084 .dbline 130
0084 L15:
0084 .dbline 123
0084 F6CF xjmp L14
0086 L16:
0086 .dbline 131
0086 ; }
0086 ; }
0086 ; LCD_RW_L;
0086 C198 cbi 0x18,1
0088 .dbline 132
0088 ; LCD_DATA_DDR=0XFF;
0088 8FEF ldi R24,255
008A 8ABB out 0x1a,R24
008C .dbline 133
008C ; LCD_DATA_OUT=right_code;
008C 4BBB out 0x1b,R20
008E .dbline 134
008E ; LCD_NOP;
008E 1DD1 xcall _lcd_delay
0090 .dbline 135
0090 ; LCD_EN_L;
0090 C298 cbi 0x18,2
0092 .dbline -2
0092 L13:
0092 0E940000 xcall pop_gset1
0096 .dbline 0 ; func end
0096 0895 ret
0098 .dbsym r right_code 20 c
0098 .dbend
0098 .dbfunc e wdataR _wdataR fV
0098 ; right_data -> R20
.even
0098 _wdataR::
0098 0E940000 xcall push_gset1
009C 402F mov R20,R16
009E .dbline -1
009E .dbline 141
009E ; }
009E ;
009E ; //-------------------------------------------------------------------------------
009E ;
009E ; void wdataR(uchar right_data)//写右屏数据
009E ; {
009E .dbline 142
009E ; LCD_DATA_DDR = 0X00;
009E 2224 clr R2
00A0 2ABA out 0x1a,R2
00A2 09C0 xjmp L21
00A4 L20:
00A4 .dbline 143
00A4 ; while(1){
00A4 .dbline 145
00A4 ; //如果液晶空闲开始写数据和命令
00A4 ; LCD_CODE_OUT |= ((1<<LCD_EN) | (1<<LCD_RW) | (1<<LCD_CS1));
00A4 88B3 in R24,0x18
00A6 8E60 ori R24,14
00A8 88BB out 0x18,R24
00AA .dbline 146
00AA ; LCD_CODE_OUT &= ~((1<<LCD_DI) | (1<<LCD_CS2));
00AA 88B3 in R24,0x18
00AC 8E7E andi R24,238
00AE 88BB out 0x18,R24
00B0 .dbline 147
00B0 ; if(!(LCD_DATA_IN & 0X80)){
00B0 CF99 sbic 0x19,7
00B2 01C0 rjmp L23
00B4 .dbline 147
00B4 .dbline 148
00B4 ; break;
00B4 01C0 xjmp L22
00B6 L23:
00B6 .dbline 150
00B6 L21:
00B6 .dbline 143
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -