📄 lcd.lis
字号:
.module lcd.c
.area text(rom, con, rel)
0000 .dbfile E:\avr\测试\lcd1\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.1.1自动生成 */
0000 ; /* AVR系统的处理器为: ATMega16 */
0000 ; /* AVR系统的晶振频率: 1.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 81B3 in R24,0x11
0002 806F ori R24,240
0004 81BB out 0x11,R24
0006 .dbline 34
0006 ; LCD_EN_DDR |= LCD_EN;
0006 D09A sbi 0x1a,0
0008 .dbline 35
0008 ; LCD_RS_DDR |= LCD_RS;
0008 D29A sbi 0x1a,2
000A .dbline 36
000A ; LCD_RW_DDR |= LCD_RW;
000A D19A sbi 0x1a,1
000C .dbline 37
000C ; RW_L;
000C D998 cbi 0x1b,1
000E .dbline 39
000E ;
000E ; LCD_DATA_PORT = 0x20;
000E 80E2 ldi R24,32
0010 82BB out 0x12,R24
0012 .dbline 40
0012 ; LCD16xx_en_write();
0012 14D0 xcall _LCD16xx_en_write
0014 .dbline 41
0014 ; delay_nus(50);
0014 02E3 ldi R16,50
0016 10E0 ldi R17,0
0018 0E940000 xcall _delay_nus
001C .dbline 43
001C ;
001C ; LCD16xx_write_char(1,0x28); //4bit test
001C 28E2 ldi R18,40
001E 01E0 ldi R16,1
0020 17D0 xcall _LCD16xx_write_char
0022 .dbline 44
0022 ; delay_nms(5);
0022 05E0 ldi R16,5
0024 10E0 ldi R17,0
0026 0E940000 xcall _delay_nms
002A .dbline 45
002A ; LCD16xx_write_char(1,0x0c); //显示开
002A 2CE0 ldi R18,12
002C 01E0 ldi R16,1
002E 10D0 xcall _LCD16xx_write_char
0030 .dbline 46
0030 ; LCD16xx_write_char(1,0x01); //显示清屏
0030 21E0 ldi R18,1
0032 01E0 ldi R16,1
0034 0DD0 xcall _LCD16xx_write_char
0036 .dbline 47
0036 ; LCD16xx_write_char(1,0x06); //显示光标移动设置
0036 26E0 ldi R18,6
0038 01E0 ldi R16,1
003A .dbline -2
003A .dbline 48
003A ; }
003A L1:
003A .dbline 0 ; func end
003A 0AC0 xjmp _LCD16xx_write_char
003C .dbend
003C .dbfunc e LCD16xx_en_write _LCD16xx_en_write fV
.even
003C _LCD16xx_en_write::
003C .dbline -1
003C .dbline 51
003C ;
003C ; void LCD16xx_en_write(void) //EN端产生一个高电平脉冲,写LCD
003C ; {
003C .dbline 52
003C ; E_H;
003C D89A sbi 0x1b,0
003E .dbline 53
003E ; delay_nus(4); //如果晶振频率太高,则可相应提高延时
003E 04E0 ldi R16,4
0040 10E0 ldi R17,0
0042 0E940000 xcall _delay_nus
0046 .dbline 54
0046 ; E_L;
0046 D898 cbi 0x1b,0
0048 .dbline -2
0048 .dbline 55
0048 ; }
0048 L2:
0048 .dbline 0 ; func end
0048 0895 ret
004A .dbend
004A .dbfunc e LCD16xx_clr _LCD16xx_clr fV
.even
004A _LCD16xx_clr::
004A .dbline -1
004A .dbline 61
004A ;
004A ; /************************************************************************/
004A ; /* LCD16xx清屏 */
004A ; /************************************************************************/
004A ; void LCD16xx_clr(void)
004A ; {
004A .dbline 62
004A ; LCD16xx_write_char(1,0x01);
004A 21E0 ldi R18,1
004C 01E0 ldi R16,1
004E .dbline -2
004E .dbline 63
004E ; }
004E L3:
004E .dbline 0 ; func end
004E 00C0 xjmp _LCD16xx_write_char
0050 .dbend
0050 .dbfunc e LCD16xx_write_char _LCD16xx_write_char fV
0050 ; datal -> R20
0050 ; datah -> R22
0050 ; data -> R20
0050 ; command -> R10
.even
0050 _LCD16xx_write_char::
0050 0E940000 xcall push_gset3
0054 422F mov R20,R18
0056 A02E mov R10,R16
0058 .dbline -1
0058 .dbline 76
0058 ;
0058 ; /*-----------------------------------------------------------------------
0058 ; LCD16xx_write_char : 英文字符串显示函数
0058 ;
0058 ; 输入参数:*s :英文字符串指针;
0058 ; X、Y : 显示字符串的位置,X:0-15,Y:0-1
0058 ; LCD第一行显示寄存器地址:0x80-0x8F
0058 ; LCD第一行显示寄存器地址:0xC0-0xCF
0058 ; 编写日期 :2006年08月30日
0058 ; 最后修改日期 :2006年08月30日
0058 ; -----------------------------------------------------------------------*/
0058 ; void LCD16xx_write_char(unsigned char command,unsigned char data)
0058 ; {
0058 .dbline 79
0058 ; unsigned char datah,datal;
0058 ;
0058 ; datah = data;
0058 642F mov R22,R20
005A .dbline 80
005A ; datal = data<<4 ;
005A 842F mov R24,R20
005C 8F70 andi R24,#0x0F
005E 8295 swap R24
0060 482F mov R20,R24
0062 .dbline 84
0062 ;
0062 ; //LCD16xx_wait_Ready();
0062 ;
0062 ; RW_L; //RW=0
0062 D998 cbi 0x1b,1
0064 .dbline 85
0064 ; if (command == 0) //data
0064 AA20 tst R10
0066 11F4 brne L5
0068 .dbline 86
0068 ; RS_H; //RS=1
0068 DA9A sbi 0x1b,2
006A 01C0 xjmp L6
006C L5:
006C .dbline 88
006C ; else //command
006C ; RS_L; //RS=0
006C DA98 cbi 0x1b,2
006E L6:
006E .dbline 90
006E ;
006E ; LCD_DATA_PORT &= 0x0F;
006E 82B3 in R24,0x12
0070 8F70 andi R24,15
0072 82BB out 0x12,R24
0074 .dbline 91
0074 ; LCD_DATA_PORT |= datah&0xf0; //send high 4bit
0074 862F mov R24,R22
0076 807F andi R24,240
0078 22B2 in R2,0x12
007A 282A or R2,R24
007C 22BA out 0x12,R2
007E .dbline 92
007E ; LCD16xx_en_write();
007E DEDF xcall _LCD16xx_en_write
0080 .dbline 94
0080 ;
0080 ; LCD_DATA_PORT &= 0x0F;
0080 82B3 in R24,0x12
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -