📄 lcd.lis
字号:
.module lcd.c
.area text(rom, con, rel)
0000 .dbfile D:\各种模块设计\模块程序集\atmega16+1604仿真\lcd.c
0000 .dbfunc e LCD16xx_init _LCD16xx_init fV
.even
0000 _LCD16xx_init::
0000 .dbline -1
0000 .dbline 27
0000 ; /*--------------------------------------------------*/
0000 ; /* AVR系统的处理器为: ATMega16 */
0000 ; /* AVR系统的晶振频率: 8.0000 Mhz */
0000 ; /*--------------------------------------------------*/
0000 ;
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ; #include "lcd.h"
0000 ; #include "delay.h"
0000 ;
0000 ; /**********************************************************
0000 ; 光标命令
0000 ; LCD16xx_write_char(1,0x0e); //光标开
0000 ; LCD16xx_write_char(1,0x0d); //光标所在字符闪烁
0000 ; LCD16xx_write_char(1,0x0c); //光标关
0000 ; **********************************************************/
0000 ; /**********************************************************
0000 ; TC16xxB LCD DISPLAY
0000 ; 建立时间:2008年04月11日
0000 ; 修改日期:2008年04月11日
0000 ; LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
0000 ; 入命令
0000 ; LCD第一行显示寄存器地址:0x80-0x8F
0000 ; LCD第二行显示寄存器地址:0xC0-0xCF
0000 ; **********************************************************/
0000 ; void LCD16xx_init(void)
0000 ; {
0000 .dbline 28
0000 ; LCD_DATA_DDR |= LCD_DATA;
0000 8AB3 in R24,0x1a
0002 806F ori R24,240
0004 8ABB out 0x1a,R24
0006 .dbline 29
0006 ; LCD_EN_DDR |= LCD_EN;
0006 8D9A sbi 0x11,5
0008 .dbline 30
0008 ; LCD_RS_DDR |= LCD_RS;
0008 8E9A sbi 0x11,6
000A .dbline 34
000A ; //LCD_RW_DDR |= LCD_RW;
000A ; //RW_L;
000A ;
000A ; LCD16xx_write_char(1,0x28);
000A 28E2 ldi R18,40
000C 01E0 ldi R16,1
000E 24D0 xcall _LCD16xx_write_char
0010 .dbline 35
0010 ; LCD16xx_en_write();
0010 18D0 xcall _LCD16xx_en_write
0012 .dbline 36
0012 ; delay_nus(50);
0012 02E3 ldi R16,50
0014 10E0 ldi R17,0
0016 0E940000 xcall _delay_nus
001A .dbline 38
001A ;
001A ; LCD16xx_write_char(1,0x28); //4线接法测试
001A 28E2 ldi R18,40
001C 01E0 ldi R16,1
001E 1CD0 xcall _LCD16xx_write_char
0020 .dbline 39
0020 ; delay_nms(5);
0020 05E0 ldi R16,5
0022 10E0 ldi R17,0
0024 0E940000 xcall _delay_nms
0028 .dbline 40
0028 ; LCD16xx_write_char(1,0x0d); //显示开
0028 2DE0 ldi R18,13
002A 01E0 ldi R16,1
002C 15D0 xcall _LCD16xx_write_char
002E .dbline 41
002E ; LCD16xx_write_char(1,0x01); //显示清屏
002E 21E0 ldi R18,1
0030 01E0 ldi R16,1
0032 12D0 xcall _LCD16xx_write_char
0034 .dbline 42
0034 ; LCD16xx_write_char(1,0x02);
0034 22E0 ldi R18,2
0036 01E0 ldi R16,1
0038 0FD0 xcall _LCD16xx_write_char
003A .dbline 43
003A ; LCD16xx_write_char(1,0x06); //显示光标移动设置
003A 26E0 ldi R18,6
003C 01E0 ldi R16,1
003E 0CD0 xcall _LCD16xx_write_char
0040 .dbline -2
0040 L1:
0040 .dbline 0 ; func end
0040 0895 ret
0042 .dbend
0042 .dbfunc e LCD16xx_en_write _LCD16xx_en_write fV
.even
0042 _LCD16xx_en_write::
0042 .dbline -1
0042 .dbline 48
0042 ;
0042 ; }
0042 ;
0042 ; void LCD16xx_en_write(void) //EN端产生一个高电平脉冲,写LCD
0042 ; {
0042 .dbline 49
0042 ; E_H;
0042 959A sbi 0x12,5
0044 .dbline 50
0044 ; delay_nus(2); //如果晶振频率太高,则可相应提高延时
0044 02E0 ldi R16,2
0046 10E0 ldi R17,0
0048 0E940000 xcall _delay_nus
004C .dbline 51
004C ; E_L;
004C 9598 cbi 0x12,5
004E .dbline -2
004E L2:
004E .dbline 0 ; func end
004E 0895 ret
0050 .dbend
0050 .dbfunc e LCD16xx_clr _LCD16xx_clr fV
.even
0050 _LCD16xx_clr::
0050 .dbline -1
0050 .dbline 58
0050 ; }
0050 ;
0050 ; /************************************************************************/
0050 ; /* LCD16xx清屏 */
0050 ; /************************************************************************/
0050 ; void LCD16xx_clr(void)
0050 ; {
0050 .dbline 59
0050 ; LCD16xx_write_char(1,0x01);
0050 21E0 ldi R18,1
0052 01E0 ldi R16,1
0054 01D0 xcall _LCD16xx_write_char
0056 .dbline -2
0056 L3:
0056 .dbline 0 ; func end
0056 0895 ret
0058 .dbend
0058 .dbfunc e LCD16xx_write_char _LCD16xx_write_char fV
0058 ; data -> R20
0058 ; command -> R22
.even
0058 _LCD16xx_write_char::
0058 0E940000 xcall push_gset2
005C 422F mov R20,R18
005E 602F mov R22,R16
0060 .dbline -1
0060 .dbline 75
0060 ; }
0060 ;
0060 ; /*-----------------------------------------------------------------------
0060 ; LCD16xx_write_char : 英文字符串显示函数
0060 ;
0060 ; 输入参数:*s :英文字符串指针;
0060 ; X、Y : 显示字符串的位置,X:0-15,Y:0-3
0060 ; LCD第一行显示寄存器地址:0x80-0x8F
0060 ; LCD第二行显示寄存器地址:0xC0-0xCF
0060 ; LCD第二行显示寄存器地址:0x90-0xCF
0060 ; LCD第二行显示寄存器地址:0xd0-0xCF
0060 ; 编写日期 :2008年04月11日
0060 ; 最后修改日期 :2008年04月11日
0060 ; -----------------------------------------------------------------------*/
0060 ; void LCD16xx_write_char(uchar command,uchar data)
0060 ; {
0060 .dbline 76
0060 ; delay_nus(1);
0060 01E0 ldi R16,1
0062 10E0 ldi R17,0
0064 0E940000 xcall _delay_nus
0068 .dbline 81
0068 ;
0068 ; //LCD16xx_wait_Ready();
0068 ;
0068 ; // RW_L; //RW=0
0068 ; if (command == 0) //data
0068 6623 tst R22
006A 11F4 brne L5
006C .dbline 82
006C ; RS_H; //RS=1
006C 969A sbi 0x12,6
006E 01C0 xjmp L6
0070 L5:
0070 .dbline 84
0070 ; else //command
0070 ; RS_L; //RS=0
0070 9698 cbi 0x12,6
0072 L6:
0072 .dbline 86
0072 ;
0072 ; LCD_DATA_PORT &= data&0x00;
0072 8BB3 in R24,0x1b
0074 8070 andi R24,0
0076 8BBB out 0x1b,R24
0078 .dbline 87
0078 ; LCD_DATA_PORT |= data&0xff;
0078 842F mov R24,R20
007A 8F7F andi R24,255
007C 2BB2 in R2,0x1b
007E 282A or R2,R24
0080 2BBA out 0x1b,R2
0082 .dbline 88
0082 ; LCD16xx_en_write();
0082 DFDF xcall _LCD16xx_en_write
0084 .dbline 90
0084 ;
0084 ; data=data<<4;
0084 842F mov R24,R20
0086 8F70 andi R24,#0x0F
0088 8295 swap R24
008A 482F mov R20,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -