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

📄 serial_lcd.lis

📁 一个有关st7920控制器的测试程序和驱动程序的12864LCD的例程
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .module serial_lcd.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\avrvi\AVRVi_m128_Starter_Kit\ST7920\source\lib\serial_lcd.c
 0000                   .dbfunc e delay_lcd _delay_lcd fV
 0000           ;              j -> R16
 0000           ;              i -> R18
                        .even
 0000           _delay_lcd::
 0000                   .dbline -1
 0000                   .dbline 21
 0000           ; /************************************************
 0000           ; 文件:serial_lcd.c
 0000           ; 用途:ST7920驱动程序
 0000           ; 注意:
 0000           ; 创建:2008.1.26
 0000           ; 修改:2008.1.26
 0000           ; Copy Right  (c)  www.avrvi.com  AVR与虚拟仪器
 0000           ; ************************************************/
 0000           ; #include "..\config.h"
 0000           ; 
 0000           ; /******************************************************************
 0000           ; ** 函数名称: void delay_lcd(void)
 0000           ; ** 功能描述: lcd初始化后的延时
 0000           ; ** 输 入: 无
 0000           ; ** 全局变量: 无
 0000           ; ** 调用模块: 无
 0000           ; ** 说明:
 0000           ; ** 注意:
 0000           ; *******************************************************************/
 0000           ; void delay_lcd(void)
 0000           ; {
 0000                   .dbline 22
 0000           ;  unsigned char i=200;
 0000 28EC              ldi R18,200
 0002                   .dbline 23
 0002           ;  unsigned char j=0;
 0002 0027              clr R16
 0004                   .dbline 24
 0004           ;  for(j=0;j<6;j++)
 0004 06C0              xjmp L5
 0006           X0:
 0006                   .dbline 25
 0006           ;  {
 0006           L6:
 0006                   .dbline 26
 0006           L7:
 0006                   .dbline 26
 0006 222E              mov R2,R18
 0008 3324              clr R3
 000A 2150              subi R18,1
 000C 2220              tst R2
 000E D9F7              brne L6
 0010                   .dbline 27
 0010           L3:
 0010                   .dbline 24
 0010 0395              inc R16
 0012           L5:
 0012                   .dbline 24
 0012 0630              cpi R16,6
 0014 C0F3              brlo L7
 0016                   .dbline -2
 0016           L1:
 0016                   .dbline 0 ; func end
 0016 0895              ret
 0018                   .dbsym r j 16 c
 0018                   .dbsym r i 18 c
 0018                   .dbend
 0018                   .dbfunc e wr_lcd _wr_lcd fV
 0018           ;              j -> R20
 0018           ;              k -> R22
 0018           ;              i -> R10
 0018           ;           flag -> R18
 0018           ;           data -> R16
                        .even
 0018           _wr_lcd::
 0018 0E940000          xcall push_gset3
 001C                   .dbline -1
 001C                   .dbline 42
 001C           ;    while(i--);
 001C           ;  }
 001C           ; }
 001C           ; 
 001C           ; 
 001C           ; /******************************************************************
 001C           ; ** 函数名称: void wr_lcd(unsigned char data,unsigned char flag)
 001C           ; ** 功能描述: 向lcd写入1B的数据或者命令
 001C           ; ** 输 入: unsigned char data,unsigned char flag   data为要写入的数据或者命令,flag=1为命令传送,flag=0为数据传送
 001C           ; ** 全局变量: 无
 001C           ; ** 调用模块: 无
 001C           ; ** 说明:首先要传送5个bit的1,起始位,flag=1为命令传送,5个bit的1起始位后面接着为000
 001C           ;                                       flag=0为数据传送,5个bit的1起始位后面接着为010
 001C           ; ** 注意:
 001C           ; *******************************************************************/
 001C           ; void wr_lcd(unsigned char data,unsigned char flag)
 001C           ; {
 001C                   .dbline 45
 001C           ;  unsigned char i,j,k;
 001C           ;  
 001C           ;  CLR_LCD_SCLK;  //clock清零
 001C AA98              cbi 0x15,2
 001E                   .dbline 46
 001E           ;  SET_LCD_STD;   //data置1
 001E A99A              sbi 0x15,1
 0020                   .dbline 48
 0020           ;  
 0020           ;  for(i=0;i<5;i++) //首先要传送5个bit的1,起始位
 0020 AA24              clr R10
 0022 03C0              xjmp L13
 0024           L10:
 0024                   .dbline 49
 0024                   .dbline 50
 0024 AA9A              sbi 0x15,2
 0026                   .dbline 51
 0026 AA98              cbi 0x15,2
 0028                   .dbline 52
 0028           L11:
 0028                   .dbline 48
 0028 A394              inc R10
 002A           L13:
 002A                   .dbline 48
 002A 8A2D              mov R24,R10
 002C 8530              cpi R24,5
 002E D0F3              brlo L10
 0030                   .dbline 54
 0030           ;  {
 0030           ;   SET_LCD_SCLK;
 0030           ;   CLR_LCD_SCLK;
 0030           ;  }
 0030           ;  
 0030           ;  if(flag)  //flag=1为命令传送,5个bit的1起始位后面接着为000
 0030 2223              tst R18
 0032 51F0              breq L14
 0034                   .dbline 55
 0034           ;  {
 0034                   .dbline 56
 0034           ;   CLR_LCD_STD; //清零数据线,传送3个bit的0
 0034 A998              cbi 0x15,1
 0036                   .dbline 57
 0036           ;   for(i=0;i<3;i++)
 0036 AA24              clr R10
 0038 03C0              xjmp L19
 003A           L16:
 003A                   .dbline 58
 003A                   .dbline 59
 003A AA9A              sbi 0x15,2
 003C                   .dbline 60
 003C AA98              cbi 0x15,2
 003E                   .dbline 61
 003E           L17:
 003E                   .dbline 57
 003E A394              inc R10
 0040           L19:
 0040                   .dbline 57
 0040 8A2D              mov R24,R10
 0042 8330              cpi R24,3
 0044 D0F3              brlo L16
 0046                   .dbline 62
 0046           ;   {
 0046           ;    SET_LCD_SCLK;
 0046           ;    CLR_LCD_SCLK;
 0046           ;   }
 0046           ;  }
 0046 09C0              xjmp L15
 0048           L14:
 0048                   .dbline 65
 0048           ;  
 0048           ;  else  //flag=0为数据传送,5个bit的1起始位后面接着为010
 0048           ;  {
 0048                   .dbline 66
 0048           ;   CLR_LCD_STD; //传送一位0
 0048 A998              cbi 0x15,1
 004A                   .dbline 67
 004A           ;   SET_LCD_SCLK;
 004A AA9A              sbi 0x15,2
 004C                   .dbline 68
 004C           ;   CLR_LCD_SCLK;
 004C AA98              cbi 0x15,2
 004E                   .dbline 70
 004E           ;   
 004E           ;   SET_LCD_STD; //传送一位1
 004E A99A              sbi 0x15,1
 0050                   .dbline 71
 0050           ;   SET_LCD_SCLK;
 0050 AA9A              sbi 0x15,2
 0052                   .dbline 72
 0052           ;   CLR_LCD_SCLK;
 0052 AA98              cbi 0x15,2
 0054                   .dbline 74
 0054           ;   
 0054           ;   CLR_LCD_STD; //传送一位0
 0054 A998              cbi 0x15,1
 0056                   .dbline 75
 0056           ;   SET_LCD_SCLK;
 0056 AA9A              sbi 0x15,2
 0058                   .dbline 76
 0058           ;   CLR_LCD_SCLK;
 0058 AA98              cbi 0x15,2
 005A                   .dbline 77
 005A           ;  }
 005A           L15:
 005A                   .dbline 79
 005A           ;  
 005A           ;  k=0x80; //后面传送信息的时候用来取得特定的位
 005A 60E8              ldi R22,128
 005C                   .dbline 81
 005C           ;  
 005C           ;  for(j=0;j<2;j++)//每一个八位的指令将被分为两个字节接收到:
 005C 4427              clr R20
 005E 19C0              xjmp L23
 0060           L20:
 0060                   .dbline 85
 0060           ;                  //较高4位的指令资料将会被放在第一个字节的MSB部分
 0060           ;                                //而较低4位(DB3~DB0)的指令资料则会被放在第二个字节的MSB部分
 0060           ;                                //至于相关的另四位则都为0。
 0060           ;  {
 0060                   .dbline 86
 0060           ;    for(i=0;i<4;i++)
 0060 AA24              clr R10
 0062 0AC0              xjmp L27
 0064           L24:
 0064                   .dbline 87
 0064           ;    {          
 0064                   .dbline 88
 0064           ;       if(data&k) //如果相应的位为高
 0064 202E              mov R2,R16
 0066 2622              and R2,R22
 0068 11F0              breq L28
 006A                   .dbline 89
 006A           ;       {
 006A                   .dbline 90
 006A           ;         SET_LCD_STD; //传送一位1
 006A A99A              sbi 0x15,1
 006C                   .dbline 91
 006C           ;       }
 006C 01C0              xjmp L29
 006E           L28:
 006E                   .dbline 93
 006E           ;       else       //如果相应的位为低
 006E           ;       {
 006E                   .dbline 94
 006E           ;         CLR_LCD_STD; //传送一位0
 006E A998              cbi 0x15,1
 0070                   .dbline 95
 0070           ;       }
 0070           L29:
 0070                   .dbline 96
 0070 6695              lsr R22
 0072                   .dbline 97
 0072 AA9A              sbi 0x15,2
 0074                   .dbline 98
 0074 AA98              cbi 0x15,2
 0076                   .dbline 99
 0076           L25:
 0076                   .dbline 86
 0076 A394              inc R10
 0078           L27:
 0078                   .dbline 86
 0078 8A2D              mov R24,R10
 007A 8430              cpi R24,4
 007C 98F3              brlo L24
 007E                   .dbline 101
 007E           ;       k>>=1;
 007E           ;     SET_LCD_SCLK;
 007E           ;     CLR_LCD_SCLK;
 007E           ;    }
 007E           ;    
 007E           ;    CLR_LCD_STD; //传送4位0
 007E A998              cbi 0x15,1
 0080                   .dbline 103
 0080           ;    
 0080           ;    for(i=0;i<4;i++)
 0080 AA24              clr R10
 0082 03C0              xjmp L33
 0084           L30:
 0084                   .dbline 104
 0084                   .dbline 105
 0084 AA9A              sbi 0x15,2
 0086                   .dbline 106
 0086 AA98              cbi 0x15,2
 0088                   .dbline 107
 0088           L31:
 0088                   .dbline 103
 0088 A394              inc R10
 008A           L33:
 008A                   .dbline 103
 008A 8A2D              mov R24,R10
 008C 8430              cpi R24,4
 008E D0F3              brlo L30
 0090                   .dbline 108
 0090           L21:
 0090                   .dbline 81
 0090 4395              inc R20
 0092           L23:
 0092                   .dbline 81
 0092 4230              cpi R20,2
 0094 28F3              brlo L20
 0096                   .dbline 110
 0096           ;    {
 0096           ;       SET_LCD_SCLK;
 0096           ;     CLR_LCD_SCLK;
 0096           ;    }
 0096           ;  }
 0096           ;  //CLR_LCD_SCLK;
 0096           ;  CLR_LCD_STD;
 0096 A998              cbi 0x15,1
 0098                   .dbline -2
 0098           L9:
 0098 0E940000          xcall pop_gset3
 009C                   .dbline 0 ; func end
 009C 0895              ret
 009E                   .dbsym r j 20 c
 009E                   .dbsym r k 22 c
 009E                   .dbsym r i 10 c
 009E                   .dbsym r flag 18 c
 009E                   .dbsym r data 16 c
 009E                   .dbend
 009E                   .dbfunc e initial_lcd _initial_lcd fV
                        .even
 009E           _initial_lcd::
 009E                   .dbline -1
 009E                   .dbline 124
 009E           ; }
 009E           ; 
 009E           ; 
 009E           ; /******************************************************************
 009E           ; ** 函数名称: void initial_lcd(void)
 009E           ; ** 功能描述: lcd初始化
 009E           ; ** 输 入: 无
 009E           ; ** 全局变量: 无
 009E           ; ** 调用模块: wr_lcd();
 009E           ; ** 说明:
 009E           ; ** 注意:
 009E           ; *******************************************************************/
 009E           ; void initial_lcd(void)
 009E           ; {
 009E                   .dbline 125
 009E           ;   LCD_DDR |= (1<<LCD_STD)|(1<<LCD_SCLK);
 009E 84B3              in R24,0x14
 00A0 8660              ori R24,6
 00A2 84BB              out 0x14,R24
 00A4                   .dbline 126
 00A4           ;   wr_lcd(Lcd_Set_Function_Basic,1);           //指令集设定
 00A4 21E0              ldi R18,1
 00A6 00E3              ldi R16,48
 00A8 B7DF              xcall _wr_lcd
 00AA                   .dbline 127
 00AA           ;   wr_lcd(Lcd_Set_Entrance_Point+2,1);         //光标右移
 00AA 21E0              ldi R18,1
 00AC 06E0              ldi R16,6
 00AE B4DF              xcall _wr_lcd
 00B0                   .dbline 128
 00B0           ;   wr_lcd(Lcd_Display_Status+4,1);                     //整屏显示
 00B0 21E0              ldi R18,1
 00B2 0CE0              ldi R16,12
 00B4 B1DF              xcall _wr_lcd
 00B6                   .dbline 129
 00B6           ;   wr_lcd(Lcd_Clear,1);                                //clear the screen
 00B6 21E0              ldi R18,1
 00B8 01E0              ldi R16,1
 00BA AEDF              xcall _wr_lcd
 00BC                   .dbline 131
 00BC           ;   
 00BC           ;   delay_lcd();
 00BC A1DF              xcall _delay_lcd
 00BE                   .dbline -2
 00BE           L34:
 00BE                   .dbline 0 ; func end
 00BE 0895              ret
 00C0                   .dbend
 00C0                   .dbfunc e Lcd_drawbmp _Lcd_drawbmp fV
 00C0           ;              i -> R20
 00C0           ;              j -> R22
 00C0           ;            bmp -> R10,R11
                        .even
 00C0           _Lcd_drawbmp::
 00C0 0E940000          xcall push_gset3
 00C4 5801              movw R10,R16
 00C6                   .dbline -1
 00C6                   .dbline 150
 00C6           ; }
 00C6           ; 
 00C6           ; 
 00C6           ; /*********************************************************************************************************
 00C6           ; ** 函数名称: Lcd_drawbmp(unsigned char col,unsigned char row,unsigned char col1,unsigned char row1,const unsigned char *bmp)
 00C6           ; ** 功能描述: 绘制bmp图片
 00C6           ; ** 输 入: col 起始行  col1 图片行数

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -