📄 ds1302_mega16.lis
字号:
.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 + -