📄 lcd.lis
字号:
.module lcd.c
.area text(rom, con, rel)
0000 .dbfile F:\单片机源程序\AVR单片机程序\MAGE16\lcd1602\lcd.c
0000 .dbfunc e delay _delay fV
0000 ; i -> R20,R21
0000 ; n -> R16,R17
.even
0000 _delay::
0000 0E940000 xcall push_gset1
0004 .dbline -1
0004 .dbline 55
0004 ; //编译器:ICC-AVR
0004 ; //日期: 2007-4-13 20:29:57
0004 ; //目标芯片 : ATmega16
0004 ; //时钟: 8.0000Mhz
0004 ; //版本:VISION 2.0
0004 ; /*
0004 ; LCD引脚定义
0004 ; 1---GND
0004 ; 2---VCC
0004 ; 3---VO
0004 ; 4---RS
0004 ; 5---RW
0004 ; 6---EN
0004 ; 7到14--D0-D7
0004 ; 15--背景灯+
0004 ; 16--背景灯-
0004 ;
0004 ; 下面是AVR与LCD连接信息
0004 ; PA1 ->RS
0004 ; PA0 ->EN
0004 ; GND ->RW
0004 ; PA4 ->D4
0004 ; PA5 ->D5
0004 ; PA6 ->D6
0004 ; PA7 ->D7
0004 ; */
0004 ;
0004 ; #include <iom16v.h>
0004 ; #include <macros.h>
0004 ;
0004 ; #define LCD_EN_PORT PORTA //数据寄存器,以下2个要设为同一个口
0004 ; #define LCD_EN_DDR DDRA //数据方向寄存器
0004 ; #define LCD_RS_PORT PORTA //以下2个要设为同一个口
0004 ; #define LCD_RS_DDR DDRA
0004 ; #define LCD_DATA_PORT PORTA //以下3个要设为同一个口
0004 ; #define LCD_DATA_DDR DDRA //一定要用高4位
0004 ; #define LCD_DATA_PIN PINA //端口输入引脚
0004 ; #define LCD_RS (1<<PA1) //0x04 portA1 out
0004 ; #define LCD_EN (1<<PA0) //0x08 portA0 out
0004 ; #define LCD_DATA ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //0xf0 portA4/5/6/7 out
0004 ;
0004 ; #define uchar unsigned char
0004 ; #define uint unsigned int
0004 ;
0004 ; void LCD_init(void);
0004 ; void LCD_en_write(void);
0004 ; void LCD_write_command(uchar command) ;
0004 ; void LCD_write_data(uchar data);
0004 ; void LCD_set_xy (uchar x, uchar y);
0004 ; void LCD_write_string(uchar X,uchar Y,uchar *s);
0004 ; void LCD_write_char(uchar X,uchar Y,uchar data);
0004 ; void delay(uint n);
0004 ;
0004 ; void delay(uint n) //N ms延时函数
0004 ; {
0004 09C0 xjmp L3
0006 L2:
0006 .dbline 58
0006 4427 clr R20
0008 5527 clr R21
000A 02C0 xjmp L8
000C L5:
000C .dbline 58
000C L6:
000C .dbline 58
000C 4F5F subi R20,255 ; offset = 1
000E 5F4F sbci R21,255
0010 L8:
0010 .dbline 58
0010 4D37 cpi R20,125
0012 E0E0 ldi R30,0
0014 5E07 cpc R21,R30
0016 D0F3 brlo L5
0018 L3:
0018 .dbline 57
0018 ; uint i;
0018 ; while(n--)
0018 1801 movw R2,R16
001A 0150 subi R16,1
001C 1040 sbci R17,0
001E 2220 tst R2
0020 91F7 brne L2
0022 3320 tst R3
0024 81F7 brne L2
0026 X0:
0026 .dbline -2
0026 L1:
0026 0E940000 xcall pop_gset1
002A .dbline 0 ; func end
002A 0895 ret
002C .dbsym r i 20 i
002C .dbsym r n 16 i
002C .dbend
002C .dbfunc e LCD_init _LCD_init fV
.even
002C _LCD_init::
002C .dbline -1
002C .dbline 62
002C ; for (i=0;i<125;i++);
002C ; }
002C ;
002C ; void LCD_init(void) //液晶初始化
002C ; {
002C .dbline 63
002C ; LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出
002C 8AB3 in R24,0x1a
002E 806F ori R24,240
0030 8ABB out 0x1a,R24
0032 .dbline 64
0032 ; LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
0032 D09A sbi 0x1a,0
0034 .dbline 65
0034 ; LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
0034 D19A sbi 0x1a,1
0036 .dbline 66
0036 ; LCD_write_command(0x28);
0036 08E2 ldi R16,40
0038 14D0 xcall _LCD_write_command
003A .dbline 67
003A ; LCD_en_write();
003A 0DD0 xcall _LCD_en_write
003C .dbline 68
003C ; delay(40);
003C 08E2 ldi R16,40
003E 10E0 ldi R17,0
0040 DFDF xcall _delay
0042 .dbline 69
0042 ; LCD_write_command(0x28); //4位显示
0042 08E2 ldi R16,40
0044 0ED0 xcall _LCD_write_command
0046 .dbline 70
0046 ; LCD_write_command(0x0c); //显示开
0046 0CE0 ldi R16,12
0048 0CD0 xcall _LCD_write_command
004A .dbline 71
004A ; LCD_write_command(0x01); //清屏
004A 01E0 ldi R16,1
004C 0AD0 xcall _LCD_write_command
004E .dbline 72
004E ; delay(2);
004E 02E0 ldi R16,2
0050 10E0 ldi R17,0
0052 D6DF xcall _delay
0054 .dbline -2
0054 L9:
0054 .dbline 0 ; func end
0054 0895 ret
0056 .dbend
0056 .dbfunc e LCD_en_write _LCD_en_write fV
.even
0056 _LCD_en_write::
0056 .dbline -1
0056 .dbline 76
0056 ; }
0056 ;
0056 ; void LCD_en_write(void) //液晶使能
0056 ; {
0056 .dbline 77
0056 ; LCD_EN_PORT|=LCD_EN;
0056 D89A sbi 0x1b,0
0058 .dbline 78
0058 ; delay(1);
0058 01E0 ldi R16,1
005A 10E0 ldi R17,0
005C D1DF xcall _delay
005E .dbline 79
005E ; LCD_EN_PORT&=~LCD_EN;
005E D898 cbi 0x1b,0
0060 .dbline -2
0060 L10:
0060 .dbline 0 ; func end
0060 0895 ret
0062 .dbend
0062 .dbfunc e LCD_write_command _LCD_write_command fV
0062 ; command -> R20
.even
0062 _LCD_write_command::
0062 0E940000 xcall push_gset1
0066 402F mov R20,R16
0068 .dbline -1
0068 .dbline 83
0068 ; }
0068 ;
0068 ; void LCD_write_command(uchar command) //写指令
0068 ; {
0068 .dbline 84
0068 ; delay(16);
0068 00E1 ldi R16,16
006A 10E0 ldi R17,0
006C C9DF xcall _delay
006E .dbline 85
006E ; LCD_RS_PORT&=~LCD_RS; //RS=0
006E D998 cbi 0x1b,1
0070 .dbline 86
0070 ; LCD_DATA_PORT&=0X0f; //清高四位
0070 8BB3 in R24,0x1b
0072 8F70 andi R24,15
0074 8BBB out 0x1b,R24
0076 .dbline 87
0076 ; LCD_DATA_PORT|=command&0xf0; //写高四位
0076 842F mov R24,R20
0078 807F andi R24,240
007A 2BB2 in R2,0x1b
007C 282A or R2,R24
007E 2BBA out 0x1b,R2
0080 .dbline 88
0080 ; LCD_en_write();
0080 EADF xcall _LCD_en_write
0082 .dbline 89
0082 ; command=command<<4; //低四位移到高四位
0082 842F mov R24,R20
0084 8F70 andi R24,#0x0F
0086 8295 swap R24
0088 482F mov R20,R24
008A .dbline 90
008A ; LCD_DATA_PORT&=0x0f; //清高四位
008A 8BB3 in R24,0x1b
008C 8F70 andi R24,15
008E 8BBB out 0x1b,R24
0090 .dbline 91
0090 ; LCD_DATA_PORT|=command&0xf0; //写低四位
0090 842F mov R24,R20
0092 807F andi R24,240
0094 2BB2 in R2,0x1b
0096 282A or R2,R24
0098 2BBA out 0x1b,R2
009A .dbline 92
009A ; LCD_en_write();
009A DDDF xcall _LCD_en_write
009C .dbline -2
009C L11:
009C 0E940000 xcall pop_gset1
00A0 .dbline 0 ; func end
00A0 0895 ret
00A2 .dbsym r command 20 c
00A2 .dbend
00A2 .dbfunc e LCD_write_data _LCD_write_data fV
00A2 ; data -> R20
.even
00A2 _LCD_write_data::
00A2 0E940000 xcall push_gset1
00A6 402F mov R20,R16
00A8 .dbline -1
00A8 .dbline 97
00A8 ;
00A8 ; }
00A8 ;
00A8 ; void LCD_write_data(uchar data) //写数据
00A8 ; {
00A8 .dbline 98
00A8 ; delay(16);
00A8 00E1 ldi R16,16
00AA 10E0 ldi R17,0
00AC A9DF xcall _delay
00AE .dbline 99
00AE ; LCD_RS_PORT|=LCD_RS; //RS=1
00AE D99A sbi 0x1b,1
00B0 .dbline 100
00B0 ; LCD_DATA_PORT&=0X0f; //清高四位
00B0 8BB3 in R24,0x1b
00B2 8F70 andi R24,15
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -