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

📄 ds1302_mega16.lis

📁 这是一个用温度计和时钟程序,芯片是ATmega16,电路稳定,绝对好用而且易懂
💻 LIS
📖 第 1 页 / 共 5 页
字号:
                        .module DS1302_Mega16.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\MyDesign\ICCAVR\ATmega16_DEV\DS1302\DS1302_Mega16.c
 0000                   .dbfile E:\MyDesign\ICCAVR\ATmega16_DEV\DS1302\LCD_1602_4wires.h
 0000                   .dbfunc e LCD_init _LCD_init fV
                        .even
 0000           _LCD_init::
 0000                   .dbline -1
 0000                   .dbline 51
 0000           ; /*============================================================
 0000           ; 工程:字符型液晶通用六线驱动
 0000           ; 作者:朱海峰          
 0000           ; 日期:2007.02.28
 0000           ; E_mail:ntzhf100@163.com
 0000           ; 液晶指令说明:
 0000           ; 0x08==============>关闭显示
 0000           ; 0x0c==============>开显示
 0000           ; 0x01==============>清除LCD的显示内容
 0000           ; 0x06==============>移动光标
 0000           ; 0x0c==============>显示开,光标关
 0000           ; 0x28==============>16*2显示,5*7点阵,4位数据
 0000           ; 0x1c==============>字符右移一格
 0000           ; 0x18==============>字符左移一格
 0000           ; 0x10==============>光标右移一格
 0000           ; 0x14==============>光标左移一格
 0000           ; 显示地址:
 0000           ; ===============================================================
 0000           ; =0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 ................ 0x27=
 0000           ; =0x40 0x41 0x42 0x43 0x44 0x45 0x46 0x47 ................ 0x67=
 0000           ; ===============================================================
 0000           ; 每行可以显示40个字符,可以看到的只有16个字符,可以通过指令使字符
 0000           ; 整体移动来显示所有字符。
 0000           ; LCD_write_byte函数功能:当cmd=0时,向LCD写入数据,否则向LCD写
 0000           ;                    入命令
 0000           ; 四线控制的方式:先送字节的高四位,在送低四位。
 0000           ; 值得注意的是当使用的I/O口为高四位时数据先给另一个变量,变量再将
 0000           ; 数据高四位送到I/O口,接着是将变量左移四位,再送到I/O口上去。
 0000           ; 当使用的I/O口为低四位时数据先给另一个变量,变量右移四位后送到I/O
 0000           ; 口上去,接着将数据给变量直接送入I/O口。
 0000           ; 使用时注意一下。
 0000           ; ============================================================*/
 0000           ; #include <iom16v.h>
 0000           ; #include <macros.h>
 0000           ; #include "def.h"
 0000           ; /*-----------------------------------------------------
 0000           ; Public function prototypes
 0000           ; -------------------------------------------------------*/
 0000           ; void LCD_init                         (void);
 0000           ; void LCD_write_byte         (uint8_t cmd,uint8_t data);
 0000           ; void LCD_Write_half_byte    (void);
 0000           ; void LCD_set_xy             (uint8_t x, uint8_t y);
 0000           ; void LCD_write_string       (uint8_t X,uint8_t Y,uint8_t *s);
 0000           ; void Move                                     (uint8_t step,uint8_t dirction,uint16_t time);
 0000           ; void Flash_lcd                                (uint16_t delay_t,uint8_t times);
 0000           ; void Delay_nms                                (uint16_t ms);
 0000           ; 
 0000           ; uint8_t data_temp;
 0000           ; //==================================================
 0000           ; void LCD_init(void)
 0000           ;   {
 0000                   .dbline 52
 0000           ;       Delay_nms(50);                 
 0000 02E3              ldi R16,50
 0002 10E0              ldi R17,0
 0004 96D0              xcall _Delay_nms
 0006                   .dbline 53
 0006           ;     Delay_nms(1); 
 0006 01E0              ldi R16,1
 0008 10E0              ldi R17,0
 000A 93D0              xcall _Delay_nms
 000C                   .dbline 54
 000C           ;     LCD_write_byte(1,0x28);     //4bit test    显示模式设置(不检测忙信号) 
 000C 28E2              ldi R18,40
 000E 01E0              ldi R16,1
 0010 1CD0              xcall _LCD_write_byte
 0012                   .dbline 55
 0012           ;     Delay_nms(1);  
 0012 01E0              ldi R16,1
 0014 10E0              ldi R17,0
 0016 8DD0              xcall _Delay_nms
 0018                   .dbline 56
 0018           ;     LCD_write_byte(1,0x08);         // 显示关闭 
 0018 28E0              ldi R18,8
 001A 01E0              ldi R16,1
 001C 16D0              xcall _LCD_write_byte
 001E                   .dbline 57
 001E           ;     Delay_nms(1); 
 001E 01E0              ldi R16,1
 0020 10E0              ldi R17,0
 0022 87D0              xcall _Delay_nms
 0024                   .dbline 58
 0024           ;     LCD_write_byte(1,0x01);         // 显示清屏 
 0024 21E0              ldi R18,1
 0026 01E0              ldi R16,1
 0028 10D0              xcall _LCD_write_byte
 002A                   .dbline 59
 002A           ;     Delay_nms(1); 
 002A 01E0              ldi R16,1
 002C 10E0              ldi R17,0
 002E 81D0              xcall _Delay_nms
 0030                   .dbline 60
 0030           ;     LCD_write_byte(1,0x06);         // 显示光标移动设置 
 0030 26E0              ldi R18,6
 0032 01E0              ldi R16,1
 0034 0AD0              xcall _LCD_write_byte
 0036                   .dbline 61
 0036           ;     Delay_nms(1); 
 0036 01E0              ldi R16,1
 0038 10E0              ldi R17,0
 003A 7BD0              xcall _Delay_nms
 003C                   .dbline 62
 003C           ;     LCD_write_byte(1,0x0C);         // 显示开及光标设置 
 003C 2CE0              ldi R18,12
 003E 01E0              ldi R16,1
 0040 04D0              xcall _LCD_write_byte
 0042                   .dbline 63
 0042           ;     Delay_nms(10);
 0042 0AE0              ldi R16,10
 0044 10E0              ldi R17,0
 0046 75D0              xcall _Delay_nms
 0048                   .dbline -2
 0048           L1:
 0048                   .dbline 0 ; func end
 0048 0895              ret
 004A                   .dbend
 004A                   .dbfunc e LCD_write_byte _LCD_write_byte fV
 004A           ;           data -> R10
 004A           ;            cmd -> R20
                        .even
 004A           _LCD_write_byte::
 004A AA92              st -y,R10
 004C 4A93              st -y,R20
 004E A22E              mov R10,R18
 0050 402F              mov R20,R16
 0052                   .dbline -1
 0052                   .dbline 71
 0052           ;   }
 0052           ; /*--------------------------------------------------
 0052           ; LCD_write_byte    : 英文字符显示函数
 0052           ; 输入参数:*s      :英文字符串指针;
 0052           ;           X、Y    : 显示字符串的位置,X:1-16,Y:1-2           
 0052           ; ---------------------------------------------------*/
 0052           ; void LCD_write_byte(uint8_t cmd,uint8_t data)
 0052           ;   {       
 0052                   .dbline 72
 0052           ;     if (cmd==1)
 0052 4130              cpi R20,1
 0054 09F4              brne L3
 0056           X0:
 0056                   .dbline 73
 0056           ;       {
 0056                   .dbline 74
 0056           ;          CLR_RS();
 0056 DA98              cbi 0x1b,2
 0058                   .dbline 75
 0058           ;       }
 0058           L3:
 0058                   .dbline 76
 0058           ;       if (cmd==0)
 0058 4423              tst R20
 005A 09F4              brne L5
 005C           X1:
 005C                   .dbline 77
 005C           ;       {
 005C                   .dbline 78
 005C           ;          SET_RS();
 005C DA9A              sbi 0x1b,2
 005E                   .dbline 79
 005E           ;       }
 005E           L5:
 005E                   .dbline 80
 005E           ;       data_temp=data;
 005E A0920700          sts _data_temp,R10
 0062                   .dbline 81
 0062           ;       data_temp=data_temp>>4;
 0062 8A2D              mov R24,R10
 0064 8295              swap R24
 0066 8F70              andi R24,#0x0F
 0068 80930700          sts _data_temp,R24
 006C                   .dbline 82
 006C           ;     LCD_Write_half_byte();
 006C 09D0              xcall _LCD_Write_half_byte
 006E                   .dbline 83
 006E           ;       data_temp=data;
 006E A0920700          sts _data_temp,R10
 0072                   .dbline 84
 0072           ;     LCD_Write_half_byte();
 0072 06D0              xcall _LCD_Write_half_byte
 0074                   .dbline 85
 0074           ;       Delay_nms(1);    
 0074 01E0              ldi R16,1
 0076 10E0              ldi R17,0
 0078 5CD0              xcall _Delay_nms
 007A                   .dbline -2
 007A           L2:
 007A                   .dbline 0 ; func end
 007A 4991              ld R20,y+
 007C A990              ld R10,y+
 007E 0895              ret
 0080                   .dbsym r data 10 c
 0080                   .dbsym r cmd 20 c
 0080                   .dbend
 0080                   .dbfunc e LCD_Write_half_byte _LCD_Write_half_byte fV
                        .even
 0080           _LCD_Write_half_byte::
 0080                   .dbline -1
 0080                   .dbline 89
 0080           ;   }
 0080           ; /*----------------写高4bit到LCD------------------------*/
 0080           ; void LCD_Write_half_byte(void)
 0080           ;   {  
 0080                   .dbline 90
 0080           ;        LCD_DATA_PORT&=0xf0;     //pc0~pc3=0
 0080 88B3              in R24,0x18
 0082 807F              andi R24,240
 0084 88BB              out 0x18,R24
 0086                   .dbline 91
 0086           ;        LCD_DATA_PORT=data_temp;//send high 4bit
 0086 20900700          lds R2,_data_temp
 008A 28BA              out 0x18,R2
 008C                   .dbline 92
 008C           ;        SET_EN();
 008C DB9A              sbi 0x1b,3
 008E                   .dbline 93
 008E           ;        NOP();
 008E 0000              nop
 0090                   .dbline 94
 0090           ;        CLR_EN(); 
 0090 DB98              cbi 0x1b,3
 0092                   .dbline 95
 0092           ;        NOP();
 0092 0000              nop
 0094                   .dbline -2
 0094           L7:
 0094                   .dbline 0 ; func end
 0094 0895              ret
 0096                   .dbend
 0096                   .dbfunc e LCD_set_xy _LCD_set_xy fV
 0096           ;        address -> R20
 0096           ;              y -> R20
 0096           ;              x -> R22
                        .even
 0096           _LCD_set_xy::
 0096 0E940000          xcall push_xgsetF000
 009A 422F              mov R20,R18
 009C 602F              mov R22,R16
 009E                   .dbline -1
 009E                   .dbline 103
 009E           ;    }
 009E           ; 
 009E           ; /*----------------------------------------------------
 009E           ; LCD_set_xy        : 设置LCD显示的起始位置
 009E           ; 输入参数:x、y    : 显示字符串的位置,X:1-16,Y:1-2           
 009E           ; -----------------------------------------------------*/
 009E           ; void LCD_set_xy( uint8_t x, uint8_t y )
 009E           ;   {
 009E                   .dbline 105
 009E           ;     unsigned char address;
 009E           ;     if (y==1) 
 009E 4130              cpi R20,1
 00A0 19F4              brne L9
 00A2           X2:
 00A2                   .dbline 106
 00A2           ;       {
 00A2                   .dbline 107
 00A2           ;          address=0x80-1+x;
 00A2 462F              mov R20,R22
 00A4 4158              subi R20,129    ; addi 127
 00A6                   .dbline 108
 00A6           ;       }
 00A6 02C0              xjmp L10
 00A8           L9:
 00A8                   .dbline 110
 00A8           ;     else 
 00A8           ;     {
 00A8                   .dbline 111
 00A8           ;          address=0xc0-1+x;
 00A8 462F              mov R20,R22
 00AA 4154              subi R20,65    ; addi 191
 00AC                   .dbline 112
 00AC           ;       }
 00AC           L10:
 00AC                   .dbline 113
 00AC           ;     LCD_write_byte(1,address);
 00AC 242F              mov R18,R20
 00AE 01E0              ldi R16,1
 00B0 CCDF              xcall _LCD_write_byte
 00B2                   .dbline -2
 00B2           L8:
 00B2                   .dbline 0 ; func end
 00B2 0C940000          xjmp pop_xgsetF000
 00B6                   .dbsym r address 20 c
 00B6                   .dbsym r y 20 c
 00B6                   .dbsym r x 22 c
 00B6                   .dbend
 00B6                   .dbfunc e LCD_write_string _LCD_write_string fV
 00B6           ;              s -> R20,R21
 00B6           ;              Y -> R12
 00B6           ;              X -> R10
                        .even
 00B6           _LCD_write_string::
 00B6 0E940000          xcall push_xgset303C
 00BA C22E              mov R12,R18
 00BC A02E              mov R10,R16
 00BE 4E81              ldd R20,y+6
 00C0 5F81              ldd R21,y+7
 00C2                   .dbline -1
 00C2                   .dbline 121
 00C2           ;   }
 00C2           ; /*---------------------------------------------------
 00C2           ; LCD_write_string  : 英文字符串显示函数
 00C2           ; 输入参数:*s      :英文字符串指针;
 00C2           ;           X、Y    : 显示字符串的位置          
 00C2           ; ---------------------------------------------------*/
 00C2           ; void LCD_write_string(uint8_t X,uint8_t Y,uint8_t *s)
 00C2           ;   {
 00C2                   .dbline 122
 00C2           ;     LCD_set_xy( X, Y );   

⌨️ 快捷键说明

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