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

📄 lcddrive.lis

📁 AVR-MEGA8单片机中使用AD转换的一个例子
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .module LCDDrive.C
                        .area text(rom, con, rel)
 0000                   .dbfile D:\学习\AVRpro\Mega8程序\TestADC\LCDDrive.C
                        .area lit(rom, con, rel)
 0000           _CharMap::
 0000 8081              .byte 128,129
 0002 8283              .byte 130,131
 0004 8485              .byte 132,133
 0006 8687              .byte 134,135
 0008 9091              .byte 144,145
 000A 9293              .byte 146,147
 000C 9495              .byte 148,149
 000E 9697              .byte 150,151
 0010 8889              .byte 136,137
 0012 8A8B              .byte 138,139
 0014 8C8D              .byte 140,141
 0016 8E8F              .byte 142,143
 0018 9899              .byte 152,153
 001A 9A9B              .byte 154,155
 001C 9C9D              .byte 156,157
 001E 9E9F              .byte 158,159
 0020                   .dbfile D:\学习\AVRpro\Mega8程序\TestADC\FontModel.h
 0020                   .dbsym e CharMap _CharMap A[32:4:8]kc
                        .area text(rom, con, rel)
 0000                   .dbfile D:\学习\AVRpro\Mega8程序\TestADC\FontModel.h
 0000                   .dbfile D:\学习\AVRpro\Mega8程序\TestADC\LCDDrive.C
 0000                   .dbfunc e Delay_1ms _Delay_1ms fV
 0000           ;              j -> R16,R17
                        .even
 0000           _Delay_1ms::
 0000                   .dbline -1
 0000                   .dbline 22
 0000           ; //*********************************************
 0000           ;  //MCU:ATMEL AVR MEGA8 ,晶振频率:8MHz,频率越高,播放Mp3越流畅
 0000           ;  //LCD:128*64
 0000           ;  //LCD型号:FYD12864-0402B
 0000           ;  //制作人:平顶山工学院计算机系,郭猛
 0000           ; //*********************************************
 0000           ; # include "iom8v.h"
 0000           ; # include "macros.h"
 0000           ; #include <math.h>
 0000           ; #include "FontModel.h"
 0000           ; #include "LCDFun.h"
 0000           ; 
 0000           ; //LCD驱动用到的变量:
 0000           ; uchar LCD_COM;                //LCD控制命令字
 0000           ; uchar LCD_DAT;                //LCD数据
 0000           ; //绘图方式下的坐标:
 0000           ; uchar AC_X;                   //X坐标
 0000           ; uchar AC_Y;                   //Y坐标
 0000           ; 
 0000           ; //延时1ms
 0000           ; void Delay_1ms(void)
 0000           ; {      
 0000                   .dbline 24
 0000           ;        unsigned int j;
 0000           ;        for(j=1;j<(unsigned int)(XTAL*143-2);j++) NOP();
 0000 01E0              ldi R16,1
 0002 10E0              ldi R17,0
 0004 03C0              rjmp L5
 0006           L2:
 0006                   .dbline 24
 0006 0000              nop
 0008           L3:
 0008                   .dbline 24
 0008 0F5F              subi R16,255  ; offset = 1
 000A 1F4F              sbci R17,255
 000C           L5:
 000C                   .dbline 24
 000C 86E7              ldi R24,1142
 000E 94E0              ldi R25,4
 0010 0817              cp R16,R24
 0012 1907              cpc R17,R25
 0014 C0F3              brlo L2
 0016           X0:
 0016                   .dbline -2
 0016           L1:
 0016                   .dbline 0 ; func end
 0016 0895              ret
 0018                   .dbsym r j 16 i
 0018                   .dbend
 0018                   .dbfunc e Delay _Delay fV
 0018           ;              i -> R10
 0018           ;              j -> R20
 0018           ;              n -> R12,R13
                        .even
 0018           _Delay::
 0018 00D0              rcall push_xgset303C
 001A 6801              movw R12,R16
 001C                   .dbline -1
 001C                   .dbline 29
 001C           ; }
 001C           ; /*******************************************延时子程序**********************************************/
 001C           ; ///////////////////n的取值最好不要超过500!!!
 001C           ; void Delay(unsigned int n)
 001C           ; {
 001C                   .dbline 31
 001C           ;       uchar i,j;
 001C           ;       for(i=0;i<(uchar)(n/100);i++)
 001C AA24              clr R10
 001E 07C0              rjmp L10
 0020           L7:
 0020                   .dbline 32
 0020           ;         for(j=0;j<100;j++) Delay_1ms();   //100mS
 0020 4427              clr R20
 0022 02C0              rjmp L14
 0024           L11:
 0024                   .dbline 32
 0024 EDDF              rcall _Delay_1ms
 0026           L12:
 0026                   .dbline 32
 0026 4395              inc R20
 0028           L14:
 0028                   .dbline 32
 0028 4436              cpi R20,100
 002A E0F3              brlo L11
 002C           X1:
 002C           L8:
 002C                   .dbline 31
 002C A394              inc R10
 002E           L10:
 002E                   .dbline 31
 002E 24E6              ldi R18,100
 0030 30E0              ldi R19,0
 0032 8601              movw R16,R12
 0034 00D0              rcall div16u
 0036 A016              cp R10,R16
 0038 98F3              brlo L7
 003A           X2:
 003A                   .dbline -2
 003A           L6:
 003A                   .dbline 0 ; func end
 003A 00C0              rjmp pop_xgset303C
 003C                   .dbsym r i 10 c
 003C                   .dbsym r j 20 c
 003C                   .dbsym r n 12 i
 003C                   .dbend
 003C                   .dbfunc e LCD_AK_Control _LCD_AK_Control fV
 003C           ;          OnOff -> R16
                        .even
 003C           _LCD_AK_Control::
 003C                   .dbline -1
 003C                   .dbline 37
 003C           ; }
 003C           ; 
 003C           ; //*************************************LCD背光控制***************************************
 003C           ; void LCD_AK_Control(uchar OnOff)                      //On0FF=1,背光显示开;
 003C           ; {
 003C                   .dbline 38
 003C           ;       if(OnOff) CLRPORT(LCD_AK); else SETPORT(LCD_AK);
 003C 0023              tst R16
 003E 11F0              breq L16
 0040           X3:
 0040                   .dbline 38
 0040 9398              cbi 0x12,3
 0042 01C0              rjmp L17
 0044           L16:
 0044                   .dbline 38
 0044 939A              sbi 0x12,3
 0046           L17:
 0046                   .dbline -2
 0046           L15:
 0046                   .dbline 0 ; func end
 0046 0895              ret
 0048                   .dbsym r OnOff 16 c
 0048                   .dbend
 0048                   .dbfunc e SendToSID _SendToSID fV
 0048           ;        bitcode -> R20
 0048           ;              i -> R10
 0048           ;            dat -> R18
 0048           ;         bitNum -> R16
                        .even
 0048           _SendToSID::
 0048 AA92              st -y,R10
 004A 4A93              st -y,R20
 004C                   .dbline -1
 004C                   .dbline 42
 004C           ; }
 004C           ; 
 004C           ; void SendToSID(unsigned char bitNum, unsigned char dat)//向串行数据线发送指定位数一个数据
 004C           ; {
 004C                   .dbline 44
 004C           ;       unsigned char i,bitcode;
 004C           ;       for(i=0;i<bitNum;i++)
 004C AA24              clr R10
 004E 0BC0              rjmp L22
 0050           L19:
 0050                   .dbline 45
 0050           ;       {
 0050                   .dbline 46
 0050           ;               bitcode=dat & 0x80;
 0050 422F              mov R20,R18
 0052 4078              andi R20,128
 0054                   .dbline 47
 0054           ;               if(bitcode!=0) SETPORT(SID); else CLRPORT(SID); //SID = dat & 0x80;
 0054 11F0              breq L23
 0056           X4:
 0056                   .dbline 47
 0056 969A              sbi 0x12,6
 0058 01C0              rjmp L24
 005A           L23:
 005A                   .dbline 47
 005A 9698              cbi 0x12,6
 005C           L24:
 005C                   .dbline 48
 005C           ;               dat = dat << 1;
 005C 220F              lsl R18
 005E                   .dbline 49
 005E           ;               CLRPORT(SCLK);                  //SCLK = 0;
 005E 9798              cbi 0x12,7
 0060                   .dbline 50
 0060           ;               SETPORT(SCLK);                  //SCLK = 1;
 0060 979A              sbi 0x12,7
 0062                   .dbline 51
 0062           ;               CLRPORT(SCLK);                  //SCLK = 0; 
 0062 9798              cbi 0x12,7
 0064                   .dbline 52
 0064           ;       }
 0064           L20:
 0064                   .dbline 44
 0064 A394              inc R10
 0066           L22:
 0066                   .dbline 44
 0066 A016              cp R10,R16
 0068 98F3              brlo L19
 006A           X5:
 006A                   .dbline -2
 006A           L18:
 006A                   .dbline 0 ; func end
 006A 4991              ld R20,y+
 006C A990              ld R10,y+
 006E 0895              ret
 0070                   .dbsym r bitcode 20 c
 0070                   .dbsym r i 10 c
 0070                   .dbsym r dat 18 c
 0070                   .dbsym r bitNum 16 c
 0070                   .dbend
 0070                   .dbfunc e Write_LCD_Com _Write_LCD_Com fV
 0070           ;        SynCode -> R20
                        .even
 0070           _Write_LCD_Com::
 0070 4A93              st -y,R20
 0072                   .dbline -1
 0072                   .dbline 57
 0072           ; }
 0072           ; 
 0072           ; //*************************************写入LCD控制字******************************
 0072           ; void Write_LCD_Com(void)                                              //对LCD写入控制命令
 0072           ; {
 0072                   .dbline 60
 0072           ;       //      SynCode为同步码
 0072           ;       unsigned char SynCode;
 0072           ;       CLRPORT(CS);    //CS=0;
 0072 9598              cbi 0x12,5
 0074                   .dbline 61
 0074           ;       SETPORT(CS);    //CS=1;
 0074 959A              sbi 0x12,5
 0076                   .dbline 63
 0076           ; 
 0076           ;       SynCode = 0xFF;                         //同步码
 0076 4FEF              ldi R20,255
 0078                   .dbline 64
 0078           ;       SendToSID(5,SynCode);
 0078 242F              mov R18,R20
 007A 05E0              ldi R16,5
 007C E5DF              rcall _SendToSID
 007E                   .dbline 66
 007E           ; 
 007E           ;       SynCode = 0x00;                         //写入代码RW,RS,0,3位代码
 007E 4427              clr R20
 0080                   .dbline 67
 0080           ;       SendToSID(3,SynCode);
 0080 242F              mov R18,R20
 0082 03E0              ldi R16,3
 0084 E1DF              rcall _SendToSID
 0086                   .dbline 69
 0086           ; 
 0086           ;       SynCode = LCD_COM & 0xF0;       //写入代码COM数据的高四位 要发送的数据格式是XXXX0000
 0086 40910300          lds R20,_LCD_COM
 008A 407F              andi R20,240
 008C                   .dbline 70
 008C           ;       SendToSID(8,SynCode);
 008C 242F              mov R18,R20
 008E 08E0              ldi R16,8
 0090 DBDF              rcall _SendToSID
 0092                   .dbline 72
 0092           ; 
 0092           ;       SynCode = LCD_COM & 0x0F;       //写入代码COM数据的低四位       0000XXXX
 0092 40910300          lds R20,_LCD_COM
 0096 4F70              andi R20,15
 0098                   .dbline 73
 0098           ;       SynCode = SynCode<<4;           //要发送的数据格式是XXXX0000
 0098 842F              mov R24,R20
 009A 8F70              andi R24,#0x0F
 009C 8295              swap R24
 009E 482F              mov R20,R24
 00A0                   .dbline 74
 00A0           ;       SendToSID(8,SynCode);
 00A0 282F              mov R18,R24
 00A2 08E0              ldi R16,8
 00A4 D1DF              rcall _SendToSID
 00A6                   .dbline 75
 00A6           ;       Delay_1ms() ;   //必要的延时
 00A6 ACDF              rcall _Delay_1ms
 00A8                   .dbline -2
 00A8           L25:
 00A8                   .dbline 0 ; func end
 00A8 4991              ld R20,y+
 00AA 0895              ret
 00AC                   .dbsym r SynCode 20 c
 00AC                   .dbend
 00AC                   .dbfunc e Write_LCD_Data _Write_LCD_Data fV
 00AC           ;        bitcode -> R10
 00AC           ;       iSynCode -> R22
 00AC           ;        SynCode -> R20
                        .even
 00AC           _Write_LCD_Data::
 00AC 00D0              rcall push_xgsetF00C
 00AE                   .dbline -1
 00AE                   .dbline 80
 00AE           ; }
 00AE           ; 
 00AE           ; //*************************************写入LCD数据**********************************
 00AE           ; void Write_LCD_Data(void)                                             //对LCD写入8位数据
 00AE           ; {
 00AE                   .dbline 84
 00AE           ;       //      iSynCode为同步码计数器,同步码为5位,     SynCode为同步码
 00AE           ;       unsigned char iSynCode,SynCode;
 00AE           ;       uchar bitcode;
 00AE           ;       CLRPORT(CS);    //CS=0;
 00AE 9598              cbi 0x12,5
 00B0                   .dbline 85
 00B0           ;       SETPORT(CS);    //CS=1;
 00B0 959A              sbi 0x12,5
 00B2                   .dbline 87
 00B2           ; 
 00B2           ;       SynCode = 0xFF;  //同步码
 00B2 4FEF              ldi R20,255
 00B4                   .dbline 88
 00B4           ;       SendToSID(5,SynCode);
 00B4 242F              mov R18,R20
 00B6 05E0              ldi R16,5
 00B8 C7DF              rcall _SendToSID
 00BA                   .dbline 89
 00BA           ;       SynCode = 0x40;  //写入代码RW,RS,0,3位代码
 00BA 40E4              ldi R20,64
 00BC                   .dbline 90
 00BC           ;       SendToSID(3,SynCode);
 00BC 242F              mov R18,R20
 00BE 03E0              ldi R16,3
 00C0 C3DF              rcall _SendToSID
 00C2                   .dbline 92
 00C2           ; 
 00C2           ;       SynCode = LCD_DAT & 0xF0;        //写入代码COM数据的高四位 要发送的数据格式是XXXX0000
 00C2 40910200          lds R20,_LCD_DAT

⌨️ 快捷键说明

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