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

📄 st7920.lis

📁 ST7920液晶控制器的AVR程序
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 0116 A22E              mov R10,R18
 0118 602F              mov R22,R16
 011A                   .dbline -1
 011A                   .dbline 75
 011A           ;       //for(i=1;i>0;i--)BUSYLOOP();   //延时10us      延时后写命令就无效?
 011A           ; }
 011A           ; /**********************串行方式相关程序END*********************/
 011A           ;   
 011A           ;                 
 011A           ; /**********************液晶文字显示相关程序START*************/
 011A           ; 
 011A           ; 
 011A           ; void lcdSetXY(uchar x,uchar y)  //定位坐标的位置,这个主要跟字符显示相关
 011A           ; {  //x:横0-15   y:纵 0-3  ;x,y对应12864的坐标
 011A                   .dbline 76
 011A           ;       unsigned char position=0;
 011A 4427              clr R20
 011C                   .dbline 77
 011C           ;       x &= 0x0f;//x%16;
 011C 6F70              andi R22,15
 011E                   .dbline 78
 011E           ;       switch(y%4)
 011E 24E0              ldi R18,4
 0120 30E0              ldi R19,0
 0122 0A2D              mov R16,R10
 0124 1127              clr R17
 0126 0E940000          xcall mod16s
 012A 5801              movw R10,R16
 012C 0030              cpi R16,0
 012E 0107              cpc R16,R17
 0130 71F0              breq L23
 0132           X4:
 0132 C501              movw R24,R10
 0134 0130              cpi R16,1
 0136 E0E0              ldi R30,0
 0138 1E07              cpc R17,R30
 013A 69F0              breq L24
 013C           X5:
 013C 0230              cpi R16,2
 013E E0E0              ldi R30,0
 0140 1E07              cpc R17,R30
 0142 69F0              breq L25
 0144           X6:
 0144 0330              cpi R16,3
 0146 E0E0              ldi R30,0
 0148 1E07              cpc R17,R30
 014A 69F0              breq L26
 014C           X7:
 014C 0FC0              xjmp L21
 014E           L23:
 014E                   .dbline 80
 014E           ;       {    //第零行和第二行寄存器连续   第一行和第三行寄存器连续
 014E           ;         case 0: position = 0x80 + (x>>1); break;              // |0x80        ~       0x87|
 014E 462F              mov R20,R22
 0150 4695              lsr R20
 0152 4058              subi R20,128    ; addi 128
 0154                   .dbline 80
 0154 0BC0              xjmp L21
 0156           L24:
 0156                   .dbline 81
 0156           ;               case 1: position = 0x90 + (x>>1); break;                // |0x90        ~   0x97|
 0156 462F              mov R20,R22
 0158 4695              lsr R20
 015A 4057              subi R20,112    ; addi 144
 015C                   .dbline 81
 015C 07C0              xjmp L21
 015E           L25:
 015E                   .dbline 82
 015E           ;               case 2: position = 0x88 + (x>>1); break;                // |0x88        ~   0x8f|
 015E 462F              mov R20,R22
 0160 4695              lsr R20
 0162 4857              subi R20,120    ; addi 136
 0164                   .dbline 82
 0164 03C0              xjmp L21
 0166           L26:
 0166                   .dbline 83
 0166           ;               case 3: position = 0x98 + (x>>1); break;                // |0x98        ~       0x9f|
 0166 462F              mov R20,R22
 0168 4695              lsr R20
 016A 4856              subi R20,104    ; addi 152
 016C                   .dbline 83
 016C                   .dbline 84
 016C           ;               default: break;
 016C           L21:
 016C                   .dbline 86
 016C           ;       }
 016C           ;       WriteCommand(position);
 016C 042F              mov R16,R20
 016E A9DF              xcall _WriteCommand
 0170                   .dbline -2
 0170           L19:
 0170                   .dbline 0 ; func end
 0170 0C940000          xjmp pop_xgsetF00C
 0174                   .dbsym r position 20 c
 0174                   .dbsym r y 10 c
 0174                   .dbsym r x 22 c
 0174                   .dbend
 0174                   .dbfunc e SetGraphicAddr _SetGraphicAddr fV
 0174           ;          ytemp -> R22
 0174           ;              y -> R10
 0174           ;              x -> R20
                        .even
 0174           _SetGraphicAddr::
 0174 0E940000          xcall push_xgsetF00C
 0178 A22E              mov R10,R18
 017A 402F              mov R20,R16
 017C                   .dbline -1
 017C                   .dbline 91
 017C           ; } 
 017C           ; 
 017C           ; //x:横0-15   y:纵 0-63  
 017C           ; void SetGraphicAddr(uchar x,uchar y)
 017C           ; {
 017C                   .dbline 93
 017C           ;       uchar ytemp;
 017C           ;       EX_FT();  //跟绘图设置有关  8BIT控制界面,扩充指令集,,绘图显示开
 017C 06E3              ldi R16,54
 017E A1DF              xcall _WriteCommand
 0180                   .dbline 94
 0180           ;       ytemp = (y & 0x1f) | 0x80;
 0180 6A2D              mov R22,R10
 0182 6F71              andi R22,31
 0184 6068              ori R22,128
 0186                   .dbline 95
 0186           ;       WriteCommand(ytemp);                                                    //先写st7920 垂直坐标
 0186 062F              mov R16,R22
 0188 9CDF              xcall _WriteCommand
 018A                   .dbline 96
 018A           ;       ytemp = (y>>5);                 //12864的y坐标打印32的对应ST水平坐标0x88~0x8f,垂直坐标(y-32)
 018A 6A2D              mov R22,R10
 018C 6695              lsr R22
 018E 6695              lsr R22
 0190 6695              lsr R22
 0192 6695              lsr R22
 0194 6695              lsr R22
 0196                   .dbline 97
 0196           ;       x &= 0x0f;//x%16;
 0196 4F70              andi R20,15
 0198                   .dbline 98
 0198           ;       x  = 0x80 +(ytemp<<3) + (x>>1);                                 //0 |0x80       ~       0x87|   
 0198 242E              mov R2,R20
 019A 2694              lsr R2
 019C 462F              mov R20,R22
 019E 440F              lsl R20
 01A0 440F              lsl R20
 01A2 440F              lsl R20
 01A4 4058              subi R20,128    ; addi 128
 01A6 420D              add R20,R2
 01A8                   .dbline 99
 01A8           ;       WriteCommand(x);                                                                //1 |                                                                                                                                                                                                                                                                                    
 01A8 042F              mov R16,R20
 01AA 8BDF              xcall _WriteCommand
 01AC                   .dbline 104
 01AC           ;                                                                       //. |数值表示st的位址   
 01AC           ;                                                                                       //. |                                   
 01AC           ;                                                                                                       //31|                                                                                                                                                                                                                                                                   
 01AC           ;                                                                                                       //0     |0x88   ~   0x8f|   
 01AC           ;       FunctionSet();                                  //功能设置 8位数据,基本指令                                                                                                                            
 01AC 00E3              ldi R16,48
 01AE 89DF              xcall _WriteCommand
 01B0                   .dbline -2
 01B0           L27:
 01B0                   .dbline 0 ; func end
 01B0 0C940000          xjmp pop_xgsetF00C
 01B4                   .dbsym r ytemp 22 c
 01B4                   .dbsym r y 10 c
 01B4                   .dbsym r x 20 c
 01B4                   .dbend
 01B4                   .dbfunc e lcdInit _lcdInit fV
                        .even
 01B4           _lcdInit::
 01B4                   .dbline -1
 01B4                   .dbline 109
 01B4           ; } 
 01B4           ; 
 01B4           ; 
 01B4           ; void lcdInit()                //液晶初始化                                            
 01B4           ; { 
 01B4                   .dbline 111
 01B4           ;       //初始化控制管脚
 01B4           ;       DDR_LCD_CTRL |= BIT(RS);
 01B4 BD9A              sbi 0x17,5
 01B6                   .dbline 112
 01B6           ;       DDR_LCD_CTRL |= BIT(RW);  
 01B6 BE9A              sbi 0x17,6
 01B8                   .dbline 113
 01B8           ;       DDR_LCD_CTRL |= BIT(E);
 01B8 BF9A              sbi 0x17,7
 01BA                   .dbline 114
 01BA           ;       LCD_CTRL |= BIT(RS);
 01BA C59A              sbi 0x18,5
 01BC                   .dbline 115
 01BC           ;       LCD_CTRL |= BIT(RW);  
 01BC C69A              sbi 0x18,6
 01BE                   .dbline 116
 01BE           ;       LCD_CTRL |= BIT(E);
 01BE C79A              sbi 0x18,7
 01C0                   .dbline 118
 01C0           ;       
 01C0           ;       FunctionSet();                      
 01C0 00E3              ldi R16,48
 01C2 7FDF              xcall _WriteCommand
 01C4                   .dbline 119
 01C4           ;       Delayus(150); 
 01C4 06E9              ldi R16,150
 01C6 10E0              ldi R17,0
 01C8 20E0              ldi R18,0
 01CA 30E0              ldi R19,0
 01CC 19DF              xcall _Delayus
 01CE                   .dbline 121
 01CE           ;                                       
 01CE           ;       FunctionSet(); 
 01CE 00E3              ldi R16,48
 01D0 78DF              xcall _WriteCommand
 01D2                   .dbline 122
 01D2           ;       Delayus(50);
 01D2 02E3              ldi R16,50
 01D4 10E0              ldi R17,0
 01D6 20E0              ldi R18,0
 01D8 30E0              ldi R19,0
 01DA 12DF              xcall _Delayus
 01DC                   .dbline 124
 01DC           ;                               
 01DC           ;   DisplayOff();
 01DC 08E0              ldi R16,8
 01DE 71DF              xcall _WriteCommand
 01E0                   .dbline 125
 01E0           ;       Delayus(150);
 01E0 06E9              ldi R16,150
 01E2 10E0              ldi R17,0
 01E4 20E0              ldi R18,0
 01E6 30E0              ldi R19,0
 01E8 0BDF              xcall _Delayus
 01EA                   .dbline 127
 01EA           ;                                                 
 01EA           ;       lcdClear(); //清屏程序 需要毫秒级的延时
 01EA                   .dbline 127
 01EA 01E0              ldi R16,1
 01EC 6ADF              xcall _WriteCommand
 01EE                   .dbline 127
 01EE 0AE0              ldi R16,10
 01F0 3BDF              xcall _Delayms
 01F2                   .dbline 127
 01F2                   .dbline 127
 01F2                   .dbline 128
 01F2           ;       Delayus(150);
 01F2 06E9              ldi R16,150
 01F4 10E0              ldi R17,0
 01F6 20E0              ldi R18,0
 01F8 30E0              ldi R19,0
 01FA 02DF              xcall _Delayus
 01FC                   .dbline 129
 01FC           ;   EntryModeSet();  //设定写入时候指针右移               
 01FC 06E0              ldi R16,6
 01FE 61DF              xcall _WriteCommand
 0200                   .dbline 130
 0200           ;       DisplayOn(); 
 0200 0CE0              ldi R16,12
 0202 5FDF              xcall _WriteCommand
 0204                   .dbline 131
 0204           ;       Delayus(50); 
 0204 02E3              ldi R16,50
 0206 10E0              ldi R17,0
 0208 20E0              ldi R18,0
 020A 30E0              ldi R19,0
 020C F9DE              xcall _Delayus
 020E                   .dbline 132
 020E           ;       DisplayOn(); 
 020E 0CE0              ldi R16,12
 0210 58DF              xcall _WriteCommand
 0212                   .dbline 133
 0212           ;       Delayus(50);                 
 0212 02E3              ldi R16,50
 0214 10E0              ldi R17,0
 0216 20E0              ldi R18,0
 0218 30E0              ldi R19,0
 021A F2DE              xcall _Delayus
 021C                   .dbline -2
 021C           L28:
 021C                   .dbline 0 ; func end
 021C 0895              ret
 021E                   .dbend
 021E                   .dbfunc e lcdDisplay _lcdDisplay fV
 021E           ;    LineDispCnt -> R12
 021E           ;              i -> R10
 021E           ;            ptr -> R20,R21
 021E           ;              y -> R14
 021E           ;              x -> R22
                        .even
 021E           _lcdDisplay::
 021E 0E940000          xcall push_xgsetF0FC
 0222 E22E              mov R14,R18
 0224 602F              mov R22,R16
 0226 4A85              ldd R20,y+10
 0228 5B85              ldd R21,y+11
 022A                   .dbline -1
 022A                   .dbline 137
 022A           ; } 
 022A           ; 
 022A           ; void lcdDisplay( uchar x, uchar y, uchar *ptr ) //行写满自动换行
 022A           ; {   
 022A                   .dbline 139
 022A           ;       uchar i;
 022A           ;       uchar LineDispCnt = 0;
 022A                   .dbline 140
 022A           ;       LineDispCnt = (16-x+x%2);
 022A 12E0              ldi R17,2
 022C 062F              mov R16,R22
 022E 0E940000          xcall mod8u
 0232 80E1              ldi R24,16
 0234 C82E              mov R12,R24
 0236 C61A              sub R12,R22
 0238 C00E              add R12,R16
 023A                   .dbline 141
 023A           ;       lcdSetXY(x,y);
 023A 2E2D              mov R18,R14
 023C 062F              mov R16,R22
 023E 69DF              xcall _lcdSetXY
 0240                   .dbline 142
 0240           ;       i = 0;
 0240 AA24              clr R10
 0242 17C0              xjmp L31
 0244           L30:
 0244                   .dbline 144
 0244           ;       while((ptr[i])!='\0')
 0244           ;       {
 0244                   .dbline 145
 0244           ;               WriteData(ptr[i]);

⌨️ 快捷键说明

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