📄 lcd.lis
字号:
.module lcd.c
.area text(rom, con, rel)
0000 .dbfile G:\lcd1604\avr16-1020-2\lcd.c
0000 .dbfunc e LCD16xx_init _LCD16xx_init fV
.even
0000 _LCD16xx_init::
0000 .dbline -1
0000 .dbline 32
0000 ; /*--------------------------------------------------*/
0000 ; /* AVR-ARM开发网论坛 */
0000 ; /* http://www.avrarm.com */
0000 ; /* AVR生成代码测试程序 */
0000 ; /*--------------------------------------------------*/
0000 ; /* 程序由AVR辅助开发工具V2.0.1自动生成 */
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 ; 建立时间:2006年08月30日
0000 ; 修改日期:2006年08月30日
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 33
0000 ; LCD_DATA_DDR |= LCD_DATA;
0000 84B3 in R24,0x14
0002 8F6F ori R24,255
0004 84BB out 0x14,R24
0006 .dbline 34
0006 ; LCD_EN_DDR |= LCD_EN;
0006 8F9A sbi 0x11,7
0008 .dbline 35
0008 ; LCD_RS_DDR |= LCD_RS;
0008 8E9A sbi 0x11,6
000A .dbline 38
000A ;
000A ;
000A ; LCD_DATA_PORT = 0xff;
000A 8FEF ldi R24,255
000C 85BB out 0x15,R24
000E .dbline 39
000E ; LCD16xx_en_write();
000E 11D0 xcall _LCD16xx_en_write
0010 .dbline 40
0010 ; delay_nus(100);
0010 04E6 ldi R16,100
0012 10E0 ldi R17,0
0014 0E940000 xcall _delay_nus
0018 .dbline 42
0018 ;
0018 ; LCD16xx_write_char(0,0x38); //4bit test
0018 28E3 ldi R18,56
001A 0027 clr R16
001C 15D0 xcall _LCD16xx_write_char
001E .dbline 43
001E ; LCD16xx_write_char(0,0x0c); //显示开
001E 2CE0 ldi R18,12
0020 0027 clr R16
0022 12D0 xcall _LCD16xx_write_char
0024 .dbline 44
0024 ; LCD16xx_write_char(0,0x01); //显示清屏
0024 21E0 ldi R18,1
0026 0027 clr R16
0028 0FD0 xcall _LCD16xx_write_char
002A .dbline 45
002A ; LCD16xx_write_char(0,0x06); //显示光标移动设置
002A 26E0 ldi R18,6
002C 0027 clr R16
002E 0CD0 xcall _LCD16xx_write_char
0030 .dbline -2
0030 L1:
0030 .dbline 0 ; func end
0030 0895 ret
0032 .dbend
0032 .dbfunc e LCD16xx_en_write _LCD16xx_en_write fV
.even
0032 _LCD16xx_en_write::
0032 .dbline -1
0032 .dbline 49
0032 ; }
0032 ;
0032 ; void LCD16xx_en_write(void) //EN端产生一个高电平脉冲,写LCD
0032 ; {
0032 .dbline 50
0032 ; LCD_EN_PORT |= LCD_EN;
0032 979A sbi 0x12,7
0034 .dbline 51
0034 ; delay_nus(30); //如果晶振频率太高,则可相应提高延时
0034 0EE1 ldi R16,30
0036 10E0 ldi R17,0
0038 0E940000 xcall _delay_nus
003C .dbline 52
003C ; LCD_EN_PORT &= ~LCD_EN; //时间短的话,数据发不权,出现乱码
003C 9798 cbi 0x12,7
003E .dbline -2
003E L2:
003E .dbline 0 ; func end
003E 0895 ret
0040 .dbend
0040 .dbfunc e LCD16xx_clr _LCD16xx_clr fV
.even
0040 _LCD16xx_clr::
0040 .dbline -1
0040 .dbline 59
0040 ; }
0040 ;
0040 ; /************************************************************************/
0040 ; /* LCD16xx清屏 */
0040 ; /************************************************************************/
0040 ; void LCD16xx_clr(void)
0040 ; {
0040 .dbline 60
0040 ; LCD16xx_write_char(1,0x01);
0040 21E0 ldi R18,1
0042 01E0 ldi R16,1
0044 01D0 xcall _LCD16xx_write_char
0046 .dbline -2
0046 L3:
0046 .dbline 0 ; func end
0046 0895 ret
0048 .dbend
0048 .dbfunc e LCD16xx_write_char _LCD16xx_write_char fV
0048 ; data -> R20
0048 ; command -> R22
.even
0048 _LCD16xx_write_char::
0048 0E940000 xcall push_gset2
004C 422F mov R20,R18
004E 602F mov R22,R16
0050 .dbline -1
0050 .dbline 76
0050 ; }
0050 ;
0050 ; /*-----------------------------------------------------------------------
0050 ; LCD16xx_write_char : 英文字符串显示函数
0050 ;
0050 ; 输入参数:*s :英文字符串指针;
0050 ; X、Y : 显示字符串的位置,X:0-15,Y:0-1
0050 ; LCD第一行显示寄存器地址:0x80-0x8F
0050 ; LCD第一行显示寄存器地址:0xC0-0xCF
0050 ; LCD第三行显示寄存器地址:0x90-0x9F
0050 ; LCD第四行显示寄存器地址:0xD0-0xDF
0050 ; 编写日期 :2006年08月30日
0050 ; 最后修改日期 :2006年08月30日
0050 ; -----------------------------------------------------------------------*/
0050 ; void LCD16xx_write_char(unsigned char command,unsigned char data)
0050 ; {
0050 .dbline 81
0050 ;
0050 ; //LCD16xx_wait_Ready();
0050 ;
0050 ;
0050 ; if (command == 0) //data
0050 6623 tst R22
0052 11F4 brne L5
0054 .dbline 82
0054 ; LCD_RS_PORT |= LCD_RS; //RS=1
0054 969A sbi 0x12,6
0056 01C0 xjmp L6
0058 L5:
0058 .dbline 84
0058 ; else //command
0058 ; LCD_RS_PORT &= ~LCD_RS; //RS=0
0058 9698 cbi 0x12,6
005A L6:
005A .dbline 87
005A ;
005A ;
005A ; LCD_DATA_PORT &= command;
005A 25B2 in R2,0x15
005C 2622 and R2,R22
005E 25BA out 0x15,R2
0060 .dbline 88
0060 ; LCD_DATA_PORT |= data&0xff; //send low 4bit
0060 842F mov R24,R20
0062 8F7F andi R24,255
0064 25B2 in R2,0x15
0066 282A or R2,R24
0068 25BA out 0x15,R2
006A .dbline 89
006A ; LCD16xx_en_write();
006A E3DF xcall _LCD16xx_en_write
006C .dbline -2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -