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

📄 lcd7920.lis

📁 网卡驱动程序
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module Lcd7920.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\__test\_RTL8019_M128_struct_Test\Lcd7920.c
 0000                   .dbfunc e LCD_Init _LCD_Init fV
                        .even
 0000           _LCD_Init::
 0000                   .dbline -1
 0000                   .dbline 16
 0000           ; //本程序测试通过     --2007.11.27
 0000           ; 
 0000           ; //本程序是7920的LM3037的液晶驱动程序
 0000           ; //汉字2x9
 0000           ; //可显示图形
 0000           ; //ATMEGA16, 内部晶振8M  (也可用于外部7.3728MHz晶振)
 0000           ; //使用串行传输 (2线)
 0000           ; 
 0000           ; #include "Lcd7920.h"
 0000           ; 
 0000           ; #define LINEWIDTH 18  //行宽
 0000           ; #define LINES 2       //行数
 0000           ; 
 0000           ; //LCD初始化
 0000           ; void LCD_Init(void)
 0000           ; {
 0000                   .dbline 17
 0000           ;       Delay_nms(100);
 0000 04E6              ldi R16,100
 0002 10E0              ldi R17,0
 0004 0E940000          xcall _Delay_nms
 0008                   .dbline 20
 0008           ; 
 0008           ;       //端口初始化
 0008           ;       LCD_CONTROL_DDR=0xFF; 
 0008 8FEF              ldi R24,255
 000A 84BB              out 0x14,R24
 000C                   .dbline 22
 000C           ; 
 000C           ;       CLRBIT(LCD_CONTROL_PORT,E);
 000C AB98              cbi 0x15,3
 000E                   .dbline 23
 000E           ;       CLRBIT(LCD_CONTROL_PORT,RW);
 000E AA98              cbi 0x15,2
 0010                   .dbline 24
 0010           ;       Delay_nms(1);
 0010 01E0              ldi R16,1
 0012 10E0              ldi R17,0
 0014 0E940000          xcall _Delay_nms
 0018                   .dbline 26
 0018           ;       
 0018           ;       LCD_WriteCmd(0x20);    // 8bit I/F, basic command, graphic off
 0018 00E2              ldi R16,32
 001A 21D0              xcall _LCD_WriteCmd
 001C                   .dbline 27
 001C           ;       LCD_WriteCmd(0x20);    // 8bit I/F, basic command, graphic off
 001C 00E2              ldi R16,32
 001E 1FD0              xcall _LCD_WriteCmd
 0020                   .dbline 28
 0020           ;       LCD_WriteCmd(0x0C);    // display on
 0020 0CE0              ldi R16,12
 0022 1DD0              xcall _LCD_WriteCmd
 0024                   .dbline 29
 0024           ;       LCD_WriteCmd(0x06);    // cursor right shift
 0024 06E0              ldi R16,6
 0026 1BD0              xcall _LCD_WriteCmd
 0028                   .dbline 31
 0028           ;       
 0028           ;       LCD_Clear();    // cursor right shift   
 0028 01D0              xcall _LCD_Clear
 002A                   .dbline -2
 002A           L1:
 002A                   .dbline 0 ; func end
 002A 0895              ret
 002C                   .dbend
 002C                   .dbfunc e LCD_Clear _LCD_Clear fV
                        .even
 002C           _LCD_Clear::
 002C                   .dbline -1
 002C                   .dbline 37
 002C           ; }
 002C           ; 
 002C           ; 
 002C           ; //LCD清屏
 002C           ; void  LCD_Clear(void)
 002C           ; {
 002C                   .dbline 38
 002C           ;    LCD_WriteCmd(0x01);
 002C 01E0              ldi R16,1
 002E 17D0              xcall _LCD_WriteCmd
 0030                   .dbline 39
 0030           ;    Delay_nms(1);        //发清屏命令后,一定要加这个延时,不然后面马上写字符串到LCD会出现错误
 0030 01E0              ldi R16,1
 0032 10E0              ldi R17,0
 0034 0E940000          xcall _Delay_nms
 0038                   .dbline -2
 0038           L2:
 0038                   .dbline 0 ; func end
 0038 0895              ret
 003A                   .dbend
 003A                   .dbfunc e LCD_CheckState _LCD_CheckState fV
                        .even
 003A           _LCD_CheckState::
 003A                   .dbline -1
 003A                   .dbline 45
 003A           ; }
 003A           ; 
 003A           ; 
 003A           ; //状态检查函数,判断是否处于忙状态   //--保留
 003A           ; void  LCD_CheckState(void)      
 003A           ; {
 003A                   .dbline -2
 003A           L3:
 003A                   .dbline 0 ; func end
 003A 0895              ret
 003C                   .dbend
 003C                   .dbfunc e LCD_Send _LCD_Send fV
 003C           ;              i -> R20
 003C           ;       senddata -> R16
                        .even
 003C           _LCD_Send::
 003C 4A93              st -y,R20
 003E                   .dbline -1
 003E                   .dbline 63
 003E           ; /*   unsigned char dat;
 003E           ;    CLRBIT(LCD_CONTROL_PORT,RS);  //RS=0
 003E           ;    //SETBIT(LCD_CONTROL_PORT,RW);  //RW=1
 003E           ;    LCD_DATA_DDR=0x00;                 // portA as input
 003E           ;    do
 003E           ;    {
 003E           ;       SETBIT(LCD_CONTROL_PORT,E);
 003E           ;       NOP();
 003E           ;       CLRBIT(LCD_CONTROL_PORT,E);
 003E           ;    }
 003E           ;    while (LCD_DATA_PIN&0x80);
 003E           ;    */
 003E           ; }
 003E           ; 
 003E           ; 
 003E           ; //对LCD写入数据的时序协议处理
 003E           ; void LCD_Send(unsigned char senddata)   
 003E           ; {
 003E                   .dbline 66
 003E           ;    unsigned char i;
 003E           ; 
 003E           ;    for(i=0;i<8;i++)
 003E 4427              clr R20
 0040 0AC0              xjmp L8
 0042           L5:
 0042                   .dbline 67
 0042           ;    {
 0042                   .dbline 68
 0042           ;       if((senddata)&0x80)
 0042 07FF              sbrs R16,7
 0044 02C0              rjmp L9
 0046           X0:
 0046                   .dbline 69
 0046           ;       {
 0046                   .dbline 71
 0046           ;          //D_OUT=1       ;    
 0046           ;          SETBIT(LCD_CONTROL_PORT,RW); 
 0046 AA9A              sbi 0x15,2
 0048                   .dbline 72
 0048           ;       }
 0048 01C0              xjmp L10
 004A           L9:
 004A                   .dbline 74
 004A           ;       else
 004A           ;       {
 004A                   .dbline 76
 004A           ;          //D_OUT=0;   
 004A           ;          CLRBIT(LCD_CONTROL_PORT,RW);         
 004A AA98              cbi 0x15,2
 004C                   .dbline 77
 004C           ;       }
 004C           L10:
 004C                   .dbline 80
 004C           ;               
 004C           ;       //SCK=1;
 004C           ;       SETBIT(LCD_CONTROL_PORT,E);     
 004C AB9A              sbi 0x15,3
 004E                   .dbline 81
 004E           ;       NOP();
 004E 0000              nop
 0050                   .dbline 83
 0050           ;       //SCK=0;
 0050           ;       CLRBIT(LCD_CONTROL_PORT,E);     
 0050 AB98              cbi 0x15,3
 0052                   .dbline 85
 0052           ;               
 0052           ;       senddata<<=1;
 0052 000F              lsl R16
 0054                   .dbline 86
 0054           ;    }
 0054           L6:
 0054                   .dbline 66
 0054 4395              inc R20
 0056           L8:
 0056                   .dbline 66
 0056 4830              cpi R20,8
 0058 A0F3              brlo L5
 005A           X1:
 005A                   .dbline -2
 005A           L4:
 005A                   .dbline 0 ; func end
 005A 4991              ld R20,y+
 005C 0895              ret
 005E                   .dbsym r i 20 c
 005E                   .dbsym r senddata 16 c
 005E                   .dbend
 005E                   .dbfunc e LCD_WriteCmd _LCD_WriteCmd fV
 005E           ;           scmd -> R20
                        .even
 005E           _LCD_WriteCmd::
 005E 4A93              st -y,R20
 0060 402F              mov R20,R16
 0062                   .dbline -1
 0062                   .dbline 91
 0062           ; }
 0062           ; 
 0062           ; //写一个命令到LCD
 0062           ; void LCD_WriteCmd(unsigned char scmd)  
 0062           ; {
 0062                   .dbline 92
 0062           ;    LCD_Send(0xf8);
 0062 08EF              ldi R16,248
 0064 EBDF              xcall _LCD_Send
 0066                   .dbline 93
 0066           ;    LCD_Send(scmd&0xf0);
 0066 042F              mov R16,R20
 0068 007F              andi R16,240
 006A E8DF              xcall _LCD_Send
 006C                   .dbline 94
 006C           ;    LCD_Send(scmd<<4); 
 006C 042F              mov R16,R20
 006E 0F70              andi R16,#0x0F
 0070 0295              swap R16
 0072 E4DF              xcall _LCD_Send
 0074                   .dbline 95
 0074           ;    Delay_nus(20);
 0074 04E1              ldi R16,20
 0076 10E0              ldi R17,0
 0078 0E940000          xcall _Delay_nus
 007C                   .dbline -2
 007C           L11:
 007C                   .dbline 0 ; func end
 007C 4991              ld R20,y+
 007E 0895              ret
 0080                   .dbsym r scmd 20 c
 0080                   .dbend
 0080                   .dbfunc e LCD_WriteData _LCD_WriteData fV
 0080           ;          DData -> R20
                        .even
 0080           _LCD_WriteData::
 0080 4A93              st -y,R20
 0082 402F              mov R20,R16
 0084                   .dbline -1
 0084                   .dbline 100
 0084           ; }
 0084           ; 
 0084           ; ////写一个数据到LCD
 0084           ; void LCD_WriteData(unsigned char DData)  
 0084           ; {
 0084                   .dbline 101
 0084           ;    LCD_Send(0xfa);
 0084 0AEF              ldi R16,250
 0086 DADF              xcall _LCD_Send
 0088                   .dbline 102
 0088           ;    LCD_Send(DData&0xf0);
 0088 042F              mov R16,R20
 008A 007F              andi R16,240
 008C D7DF              xcall _LCD_Send
 008E                   .dbline 103
 008E           ;    LCD_Send(DData<<4);        
 008E 042F              mov R16,R20
 0090 0F70              andi R16,#0x0F
 0092 0295              swap R16
 0094 D3DF              xcall _LCD_Send
 0096                   .dbline 104
 0096           ;    Delay_nus(20);
 0096 04E1              ldi R16,20
 0098 10E0              ldi R17,0
 009A 0E940000          xcall _Delay_nus
 009E                   .dbline -2
 009E           L12:
 009E                   .dbline 0 ; func end
 009E 4991              ld R20,y+
 00A0 0895              ret
 00A2                   .dbsym r DData 20 c
 00A2                   .dbend
 00A2                   .dbfunc e LCD_Set_xy _LCD_Set_xy fV
 00A2           ;              i -> R20
 00A2           ;              X -> R22
 00A2           ;              Y -> R10
                        .even
 00A2           _LCD_Set_xy::
 00A2 0E940000          xcall push_xgsetF00C
 00A6 622F              mov R22,R18
 00A8 A02E              mov R10,R16
 00AA                   .dbline -1
 00AA                   .dbline 109
 00AA           ; }
 00AA           ; 
 00AA           ; //设置光标位置,先Y坐标后X坐标
 00AA           ; void LCD_Set_xy(unsigned char Y, unsigned char X)
 00AA           ; {
 00AA                   .dbline 110
 00AA           ;     unsigned char i=0x00;
 00AA 4427              clr R20
 00AC                   .dbline 111
 00AC           ;     switch(Y & 0x0f)   //确定行号
 00AC 8A2D              mov R24,R10
 00AE 9927              clr R25
 00B0 8F70              andi R24,15
 00B2 9070              andi R25,0
 00B4 5C01              movw R10,R24
 00B6 8030              cpi R24,0
 00B8 8907              cpc R24,R25
 00BA 69F0              breq L17
 00BC           X2:
 00BC 8130              cpi R24,1
 00BE E0E0              ldi R30,0
 00C0 9E07              cpc R25,R30
 00C2 59F0              breq L18
 00C4           X3:
 00C4 8230              cpi R24,2
 00C6 E0E0              ldi R30,0
 00C8 9E07              cpc R25,R30
 00CA 49F0              breq L19
 00CC           X4:
 00CC 8330              cpi R24,3
 00CE E0E0              ldi R30,0
 00D0 9E07              cpc R25,R30
 00D2 39F0              breq L20
 00D4           X5:
 00D4 07C0              xjmp L15
 00D6           L17:
 00D6                   .dbline 114
 00D6           ;     {
 00D6           ;       case 0x00:
 00D6           ;               i=0x80;
 00D6 40E8              ldi R20,128
 00D8                   .dbline 115
 00D8           ;               break;
 00D8 05C0              xjmp L15
 00DA           L18:
 00DA                   .dbline 117
 00DA           ;       case 0x01: 
 00DA           ;               i=0x90; 
 00DA 40E9              ldi R20,144
 00DC                   .dbline 118
 00DC           ;               break;
 00DC 03C0              xjmp L15
 00DE           L19:
 00DE                   .dbline 120
 00DE           ;       case 0x02: 
 00DE           ;               i=0x88;
 00DE 48E8              ldi R20,136
 00E0                   .dbline 121
 00E0           ;               break;
 00E0 01C0              xjmp L15
 00E2           L20:
 00E2                   .dbline 123
 00E2           ;       case 0x03:
 00E2           ;               i=0x98;
 00E2 48E9              ldi R20,152
 00E4                   .dbline 124
 00E4           ;               break;
 00E4                   .dbline 126
 00E4           ;       default : 
 00E4           ;               break;
 00E4           L15:
 00E4                   .dbline 128
 00E4           ;     }
 00E4           ;     i = (X & 0x0f)|i; //确定列号
 00E4 862F              mov R24,R22
 00E6 8F70              andi R24,15
 00E8 482B              or R20,R24
 00EA                   .dbline 129
 00EA           ;    LCD_WriteCmd(i);
 00EA 042F              mov R16,R20
 00EC B8DF              xcall _LCD_WriteCmd
 00EE                   .dbline -2
 00EE           L13:
 00EE                   .dbline 0 ; func end
 00EE 0C940000          xjmp pop_xgsetF00C
 00F2                   .dbsym r i 20 c
 00F2                   .dbsym r X 22 c
 00F2                   .dbsym r Y 10 c
 00F2                   .dbend
 00F2                   .dbfunc e LCD_WriteChar _LCD_WriteChar fV
 00F2           ;             c1 -> y+2

⌨️ 快捷键说明

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