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

📄 main.lis

📁 LCD128*64 atmega16驱动 带仿真文件
💻 LIS
📖 第 1 页 / 共 3 页
字号:
 0000           ; 
 0000           ; void port_init(void)
 0000           ; {
 0000                   .dbline 20
 0000           ;  //访问外部ram的总线端口
 0000           ;  PORTA = 0x00;
 0000 2224              clr R2
 0002 2BBA              out 0x1b,R2
 0004                   .dbline 21
 0004           ;  DDRA  = 0x00; 
 0004 2ABA              out 0x1a,R2
 0006                   .dbline 22
 0006           ;  PORTC = 0x00; 
 0006 25BA              out 0x15,R2
 0008                   .dbline 23
 0008           ;  DDRC  = 0xFF;
 0008 8FEF              ldi R24,255
 000A 84BB              out 0x14,R24
 000C                   .dbline -2
 000C                   .dbline 24
 000C           ; }
 000C           L1:
 000C                   .dbline 0 ; func end
 000C 0895              ret
 000E                   .dbend
 000E                   .dbfunc e check_busy _check_busy fV
 000E           ;           temp -> R20
 000E           ;             cs -> R16
                        .even
 000E           _check_busy::
 000E 0E940000          xcall push_gset1
 0012                   .dbline -1
 0012                   .dbline 27
 0012           ;         
 0012           ; void check_busy(uchar cs)               
 0012           ; { 
 0012 09C0              xjmp L4
 0014           L3:
 0014                   .dbline 30
 0014           ;   uchar temp;
 0014           ;   while(temp)          
 0014           ;    { 
 0014                   .dbline 31
 0014           ;      if(cs)
 0014 0023              tst R16
 0016 21F0              breq L6
 0018                   .dbline 32
 0018           ;         temp=R_staus&0X80;               //将忙状态读到temp中进行确定
 0018 40910520          lds R20,8197
 001C 4078              andi R20,128
 001E 03C0              xjmp L7
 0020           L6:
 0020                   .dbline 34
 0020           ;        else
 0020           ;           temp=L_staus&0X80;
 0020 40910920          lds R20,8201
 0024 4078              andi R20,128
 0026           L7:
 0026                   .dbline 35
 0026           L4:
 0026                   .dbline 29
 0026 4423              tst R20
 0028 A9F7              brne L3
 002A                   .dbline -2
 002A                   .dbline 36
 002A           ;       }
 002A           ; }
 002A           L2:
 002A 0E940000          xcall pop_gset1
 002E                   .dbline 0 ; func end
 002E 0895              ret
 0030                   .dbsym r temp 20 c
 0030                   .dbsym r cs 16 c
 0030                   .dbend
 0030                   .dbfunc e LCD_Clean _LCD_Clean fV
 0030           ;           page -> R20
 0030           ;              y -> R22
                        .even
 0030           _LCD_Clean::
 0030 0E940000          xcall push_gset2
 0034                   .dbline -1
 0034                   .dbline 39
 0034           ; 
 0034           ; void LCD_Clean(void)
 0034           ; {
 0034                   .dbline 40
 0034           ;   unsigned char page=0,y;                //定义表示页和列的局部变量
 0034 4427              clr R20
 0036                   .dbline 42
 0036           ;   
 0036           ;   for(page=0;page<8;page++)
 0036 21C0              xjmp L12
 0038           L9:
 0038                   .dbline 43
 0038           ;      {
 0038                   .dbline 45
 0038           ;                                            //LCD左半屏的操作
 0038           ;          check_busy(0);
 0038 0027              clr R16
 003A E9DF              xcall _check_busy
 003C                   .dbline 46
 003C           ;          L_command=LCD_PAGE+page;          //设置LCD左半屏页地址
 003C 842F              mov R24,R20
 003E 8854              subi R24,72    ; addi 184
 0040 80930820          sts 8200,R24
 0044                   .dbline 47
 0044           ;          check_busy(0);
 0044 0027              clr R16
 0046 E3DF              xcall _check_busy
 0048                   .dbline 48
 0048           ;          L_command=LCD_Y; 
 0048 80E4              ldi R24,64
 004A 80930820          sts 8200,R24
 004E                   .dbline 50
 004E           ;                                            //LCD右半屏的操作
 004E           ;         check_busy(1);
 004E 01E0              ldi R16,1
 0050 DEDF              xcall _check_busy
 0052                   .dbline 51
 0052           ;          R_command=LCD_PAGE+page;          //设置LCD右半屏页地址
 0052 842F              mov R24,R20
 0054 8854              subi R24,72    ; addi 184
 0056 80930420          sts 8196,R24
 005A                   .dbline 52
 005A           ;         check_busy(1);
 005A 01E0              ldi R16,1
 005C D8DF              xcall _check_busy
 005E                   .dbline 53
 005E           ;          R_command=LCD_Y;
 005E 80E4              ldi R24,64
 0060 80930420          sts 8196,R24
 0064                   .dbline 55
 0064           ;          
 0064           ;          for(y=0;y<64;y++)
 0064 6627              clr R22
 0066 06C0              xjmp L16
 0068           L13:
 0068                   .dbline 56
 0068                   .dbline 57
 0068 2224              clr R2
 006A 20920A20          sts 8202,R2
 006E                   .dbline 58
 006E 20920620          sts 8198,R2
 0072                   .dbline 59
 0072           L14:
 0072                   .dbline 55
 0072 6395              inc R22
 0074           L16:
 0074                   .dbline 55
 0074 6034              cpi R22,64
 0076 C0F3              brlo L13
 0078                   .dbline 60
 0078           L10:
 0078                   .dbline 42
 0078 4395              inc R20
 007A           L12:
 007A                   .dbline 42
 007A 4830              cpi R20,8
 007C E8F2              brlo L9
 007E                   .dbline -2
 007E                   .dbline 61
 007E           ;             {
 007E           ;             L_data=0x00;
 007E           ;                       R_data=0x00;
 007E           ;                 }  
 007E           ;        }
 007E           ; }
 007E           L8:
 007E 0E940000          xcall pop_gset2
 0082                   .dbline 0 ; func end
 0082 0895              ret
 0084                   .dbsym r page 20 c
 0084                   .dbsym r y 22 c
 0084                   .dbend
 0084                   .dbfunc e LCD_Init _LCD_Init fV
                        .even
 0084           _LCD_Init::
 0084                   .dbline -1
 0084                   .dbline 64
 0084           ;                                          
 0084           ; void LCD_Init(void)                     //LCD初始化子函数
 0084           ; {
 0084                   .dbline 66
 0084           ;   /*首先关闭12864的显示*/
 0084           ;   check_busy(0);                        //LCD左半屏正在工作,等待......
 0084 0027              clr R16
 0086 C3DF              xcall _check_busy
 0088                   .dbline 67
 0088           ;   L_command=LCD_OFF;                    //先关闭LCD左半屏的显示
 0088 8EE3              ldi R24,62
 008A 80930820          sts 8200,R24
 008E                   .dbline 68
 008E           ;   check_busy(1);                        //LCD右半屏正在工作,等待......
 008E 01E0              ldi R16,1
 0090 BEDF              xcall _check_busy
 0092                   .dbline 69
 0092           ;   R_command=LCD_OFF;                    //先关闭LCD右半屏的显示
 0092 8EE3              ldi R24,62
 0094 80930420          sts 8196,R24
 0098                   .dbline 72
 0098           ;   
 0098           ;   /*开启12864的显示*/
 0098           ;   check_busy(0);
 0098 0027              clr R16
 009A B9DF              xcall _check_busy
 009C                   .dbline 73
 009C           ;   L_command=LCD_ON;                     //打开LCD左半屏的显示
 009C 8FE3              ldi R24,63
 009E 80930820          sts 8200,R24
 00A2                   .dbline 74
 00A2           ;   check_busy(1);
 00A2 01E0              ldi R16,1
 00A4 B4DF              xcall _check_busy
 00A6                   .dbline 75
 00A6           ;   R_command=LCD_ON;                     //打开LCD右半屏的显示
 00A6 8FE3              ldi R24,63
 00A8 80930420          sts 8196,R24
 00AC                   .dbline 78
 00AC           ;   
 00AC           ;   /*设置LCD显示的起始行*/
 00AC           ;   check_busy(0);
 00AC 0027              clr R16
 00AE AFDF              xcall _check_busy
 00B0                   .dbline 79
 00B0           ;   L_command=LCD_X;                      //LCD左半屏起始行为0
 00B0 80EC              ldi R24,192
 00B2 80930820          sts 8200,R24
 00B6                   .dbline 80
 00B6           ;   check_busy(1);
 00B6 01E0              ldi R16,1
 00B8 AADF              xcall _check_busy
 00BA                   .dbline 81
 00BA           ;   R_command=LCD_X;                      //LCD右半屏起始行为0
 00BA 80EC              ldi R24,192
 00BC 80930420          sts 8196,R24
 00C0                   .dbline -2
 00C0                   .dbline 82
 00C0           ; }
 00C0           L17:
 00C0                   .dbline 0 ; func end
 00C0 0895              ret
 00C2                   .dbend
 00C2                   .dbfunc e init_devices _init_devices fV
                        .even
 00C2           _init_devices::
 00C2                   .dbline -1
 00C2                   .dbline 85
 00C2           ; 
 00C2           ; void init_devices(void)
 00C2           ; {
 00C2                   .dbline 86
 00C2           ;  XMCRA = 0x00;                          //外部存储器控制
 00C2 2224              clr R2
 00C4 20926D00          sts 109,R2
 00C8                   .dbline 87
 00C8           ;  XMCRB = (1<<XMM2)|(1<<XMM1)|(1<<XMM0); //外存储高位地址屏蔽,释放端口C
 00C8 87E0              ldi R24,7
 00CA 80936C00          sts 108,R24
 00CE                   .dbline 88
 00CE           ;  port_init();
 00CE 98DF              xcall _port_init
 00D0                   .dbline 89
 00D0           ;  MCUCR = 0x80;                          //外部SRAM使能
 00D0 80E8              ldi R24,128
 00D2 85BF              out 0x35,R24
 00D4                   .dbline -2
 00D4                   .dbline 90
 00D4           ; }
 00D4           L18:
 00D4                   .dbline 0 ; func end
 00D4 0895              ret
 00D6                   .dbend
 00D6                   .dbfunc e ch_pos _ch_pos fV
 00D6           ;              n -> R20
 00D6           ;             cs -> R22
                        .even
 00D6           _ch_pos::
 00D6 0E940000          xcall push_gset2
 00DA 422F              mov R20,R18
 00DC 602F              mov R22,R16
 00DE                   .dbline -1
 00DE                   .dbline 93
 00DE           ; 
 00DE           ; void ch_pos(unsigned char cs,unsigned char n)   //屏选和页码设置函数
 00DE           ; {
 00DE                   .dbline 94
 00DE           ;   if(cs)
 00DE 6623              tst R22
 00E0 61F0              breq L20
 00E2                   .dbline 95
 00E2           ;       {
 00E2                   .dbline 96
 00E2           ;          check_busy(1);
 00E2 01E0              ldi R16,1
 00E4 94DF              xcall _check_busy
 00E6                   .dbline 97
 00E6           ;        R_command=LCD_PAGE+n;                   //设置LCD右半屏页地址
 00E6 842F              mov R24,R20
 00E8 8854              subi R24,72    ; addi 184
 00EA 80930420          sts 8196,R24
 00EE                   .dbline 98
 00EE           ;        check_busy(1);                  
 00EE 01E0              ldi R16,1
 00F0 8EDF              xcall _check_busy

⌨️ 快捷键说明

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