⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd12864.lis

📁 hao da jia lai fen xiang
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .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 + -