⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.lst

📁 ATMEGA16驱动LCD1602的源码
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0054 EFCF      LDI	R28,0xFF
    0055 E1D0      LDI	R29,0x10
    0056 BFCD      OUT	0x3D,R28
    0057 BFDE      OUT	0x3E,R29
    0058 51C0      SUBI	R28,0x10
    0059 40D0      SBCI	R29,0
    005A EA0A      LDI	R16,0xAA
    005B 8308      STD	Y+0,R16
    005C 2400      CLR	R0
    005D E1EB      LDI	R30,0x1B
    005E E0F1      LDI	R31,1
    005F E011      LDI	R17,1
    0060 31EB      CPI	R30,0x1B
    0061 07F1      CPC	R31,R17
    0062 F011      BEQ	0x0065
    0063 9201      ST	R0,Z+
    0064 CFFB      RJMP	0x0060
    0065 8300      STD	Z+0,R16
    0066 E8EC      LDI	R30,0x8C
    0067 E0F0      LDI	R31,0
    0068 E0A0      LDI	R26,0
    0069 E0B1      LDI	R27,1
    006A E010      LDI	R17,0
    006B 3AE7      CPI	R30,0xA7
    006C 07F1      CPC	R31,R17
    006D F021      BEQ	0x0072
    006E 95C8      LPM
    006F 9631      ADIW	R30,1
    0070 920D      ST	R0,X+
    0071 CFF9      RJMP	0x006B
    0072 940E0075  CALL	_main
_exit:
    0074 CFFF      RJMP	_exit
_main:
    0075 9722      SBIW	R28,2
FILE: E:\2007年电子竞赛\LCD1602\main.c
(0001) /*--------------------------------------------------*/
(0002) /*             AVR-ARM开发网论坛                    */
(0003) /*           http://www.avrarm.com                  */
(0004) /*            AVR生成代码测试程序                   */
(0005) /*--------------------------------------------------*/
(0006) /*     程序由AVR辅助开发工具V2.1.1自动生成          */
(0007) /*     AVR系统的处理器为:   ATMega128               */
(0008) /*     AVR系统的晶振频率:   1.0000 Mhz             */
(0009) /*--------------------------------------------------*/
(0010) 
(0011) #include <iom128v.h>
(0012) #include <macros.h>
(0013) #include "lcd.h"
(0014) #include "delay.h"
(0015) 
(0016) //-----------------------------------------------------------
(0017) //主函数
(0018) //-----------------------------------------------------------
(0019) void main(void)
(0020) {
(0021) 
(0022)    LCD16xx_init();
    0076 940E00B6  CALL	_LCD16xx_init
(0023)    LCD16xx_clr();                     //显示清屏
    0078 940E00DC  CALL	_LCD16xx_clr
(0024)    delay_nms(1); 
    007A E001      LDI	R16,1
    007B E010      LDI	R17,0
    007C 940E0165  CALL	_delay_nms
(0025)    LCD16xx_write_string(3,0,"Welcome to");
    007E E180      LDI	R24,0x10
    007F E091      LDI	R25,1
    0080 8399      STD	Y+1,R25
    0081 8388      STD	Y+0,R24
    0082 2722      CLR	R18
    0083 E003      LDI	R16,3
    0084 940E0134  CALL	_LCD16xx_write_string
(0026)    LCD16xx_write_string(1,1,"www.stuelab.cn!");
    0086 E080      LDI	R24,0
    0087 E091      LDI	R25,1
    0088 8399      STD	Y+1,R25
    0089 8388      STD	Y+0,R24
    008A E021      LDI	R18,1
    008B E001      LDI	R16,1
    008C 940E0134  CALL	_LCD16xx_write_string
(0027)    delay_nms(500);
    008E EF04      LDI	R16,0xF4
    008F E011      LDI	R17,1
    0090 940E0165  CALL	_delay_nms
(0028)    LCD16xx_clr();                     //显示清屏
    0092 940E00DC  CALL	_LCD16xx_clr
(0029)    delay_nms(2);
    0094 E002      LDI	R16,2
    0095 E010      LDI	R17,0
    0096 940E0165  CALL	_delay_nms
    0098 C01A      RJMP	0x00B3
(0030) 
(0031)    while(1)
(0032)    {
(0033)       LCD16xx_write_string(3,0,"Welcome to");
    0099 E180      LDI	R24,0x10
    009A E091      LDI	R25,1
    009B 8399      STD	Y+1,R25
    009C 8388      STD	Y+0,R24
    009D 2722      CLR	R18
    009E E003      LDI	R16,3
    009F 940E0134  CALL	_LCD16xx_write_string
(0034)       LCD16xx_write_string(1,1,"www.stuelab.cn!");
    00A1 E080      LDI	R24,0
    00A2 E091      LDI	R25,1
    00A3 8399      STD	Y+1,R25
    00A4 8388      STD	Y+0,R24
    00A5 E021      LDI	R18,1
    00A6 E001      LDI	R16,1
    00A7 940E0134  CALL	_LCD16xx_write_string
(0035)       delay_nms(1000);
    00A9 EE08      LDI	R16,0xE8
    00AA E013      LDI	R17,3
    00AB 940E0165  CALL	_delay_nms
(0036)       LCD16xx_clr();                     //显示清屏
    00AD 940E00DC  CALL	_LCD16xx_clr
(0037)       delay_nms(1000);
    00AF EE08      LDI	R16,0xE8
    00B0 E013      LDI	R17,3
    00B1 940E0165  CALL	_delay_nms
    00B3 CFE5      RJMP	0x0099
    00B4 9622      ADIW	R28,2
    00B5 9508      RET
FILE: E:\2007年电子竞赛\LCD1602\lcd.c
(0001) /*--------------------------------------------------*/
(0002) /*             AVR-ARM开发网论坛                    */
(0003) /*           http://www.avrarm.com                  */
(0004) /*            AVR生成代码测试程序                   */
(0005) /*--------------------------------------------------*/
(0006) /*     程序由AVR辅助开发工具V2.1.1自动生成          */
(0007) /*     AVR系统的处理器为:   ATMega128               */
(0008) /*     AVR系统的晶振频率:   1.0000 Mhz             */
(0009) /*--------------------------------------------------*/
(0010) 
(0011) #include <iom128v.h>
(0012) #include <macros.h>
(0013) #include "lcd.h"
(0014) #include "delay.h"
(0015) 
(0016) /**********************************************************
(0017) 光标命令
(0018) LCD16xx_write_char(1,0x0e);    //光标开
(0019) LCD16xx_write_char(1,0x0d);    //光标所在字符闪烁
(0020) LCD16xx_write_char(1,0x0c);    //光标关
(0021) **********************************************************/
(0022) /**********************************************************
(0023) TC16xxB LCD DISPLAY
(0024) 建立时间:2006年08月30日
(0025) 修改日期:2006年08月30日
(0026) LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
(0027)                    入命令
(0028) LCD第一行显示寄存器地址:0x80-0x8F
(0029) LCD第二行显示寄存器地址:0xC0-0xCF
(0030) **********************************************************/
(0031) void LCD16xx_init(void)
(0032) {
(0033)     LCD_DATA_DDR |=  LCD_DATA;
_LCD16xx_init:
    00B6 B38A      IN	R24,0x1A
    00B7 6F80      ORI	R24,0xF0
    00B8 BB8A      OUT	0x1A,R24
(0034)     LCD_EN_DDR   |=  LCD_EN;
    00B9 9AD2      SBI	0x1A,2
(0035)     LCD_RS_DDR   |=  LCD_RS;
    00BA 9AD0      SBI	0x1A,0
(0036)     LCD_RW_DDR   |=  LCD_RW;
    00BB 9AD1      SBI	0x1A,1
(0037)     RW_L;
    00BC 98D9      CBI	0x1B,1
(0038) 	
(0039)     LCD_DATA_PORT =  0x20;
    00BD E280      LDI	R24,0x20
    00BE BB8B      OUT	0x1B,R24
(0040)     LCD16xx_en_write();
    00BF D015      RCALL	_LCD16xx_en_write
(0041)     delay_nus(50);
    00C0 E302      LDI	R16,0x32
    00C1 E010      LDI	R17,0
    00C2 940E0152  CALL	_delay_nus
(0042)    
(0043)     LCD16xx_write_char(1,0x28);      //4bit test
    00C4 E228      LDI	R18,0x28
    00C5 E001      LDI	R16,1
    00C6 D019      RCALL	_LCD16xx_write_char
(0044)     delay_nms(5);
    00C7 E005      LDI	R16,5
    00C8 E010      LDI	R17,0
    00C9 940E0165  CALL	_delay_nms
(0045)     LCD16xx_write_char(1,0x0c);      //显示开
    00CB E02C      LDI	R18,0xC
    00CC E001      LDI	R16,1
    00CD D012      RCALL	_LCD16xx_write_char
(0046)     LCD16xx_write_char(1,0x01);      //显示清屏
    00CE E021      LDI	R18,1
    00CF E001      LDI	R16,1
    00D0 D00F      RCALL	_LCD16xx_write_char
(0047)     LCD16xx_write_char(1,0x06);      //显示光标移动设置
    00D1 E026      LDI	R18,6
    00D2 E001      LDI	R16,1
    00D3 D00C      RCALL	_LCD16xx_write_char
    00D4 9508      RET
(0048) }
(0049) 
(0050) void LCD16xx_en_write(void)          //EN端产生一个高电平脉冲,写LCD
(0051) {
(0052)     E_H;
_LCD16xx_en_write:
    00D5 9ADA      SBI	0x1B,2
(0053)     delay_nus(4);                    //如果晶振频率太高,则可相应提高延时
    00D6 E004      LDI	R16,4
    00D7 E010      LDI	R17,0
    00D8 940E0152  CALL	_delay_nus
(0054)     E_L;
    00DA 98DA      CBI	0x1B,2
    00DB 9508      RET
(0055) }
(0056) 
(0057) /************************************************************************/
(0058) /* LCD16xx清屏                                                          */
(0059) /************************************************************************/
(0060) void LCD16xx_clr(void)
(0061) {
(0062)     LCD16xx_write_char(1,0x01);
_LCD16xx_clr:
    00DC E021      LDI	R18,1
    00DD E001      LDI	R16,1
    00DE D001      RCALL	_LCD16xx_write_char
    00DF 9508      RET
_LCD16xx_write_char:
  datal                --> R20
  datah                --> R22
  data                 --> R20
  command              --> R10
    00E0 940E017B  CALL	push_gset3
    00E2 2F42      MOV	R20,R18
    00E3 2EA0      MOV	R10,R16
(0063) }
(0064) 
(0065) /*-----------------------------------------------------------------------
(0066) LCD16xx_write_char    : 英文字符串显示函数
(0067) 
(0068) 输入参数:*s      :英文字符串指针;
(0069)           X、Y    : 显示字符串的位置,X:0-15,Y:0-1
(0070)                     LCD第一行显示寄存器地址:0x80-0x8F
(0071)                     LCD第一行显示寄存器地址:0xC0-0xCF
(0072) 编写日期          :2006年08月30日
(0073) 最后修改日期      :2006年08月30日
(0074) -----------------------------------------------------------------------*/
(0075) void LCD16xx_write_char(unsigned char command,unsigned char data)
(0076) {
(0077)     unsigned char datah,datal;        
(0078) 
(0079)     datah = data;
    00E4 2F64      MOV	R22,R20
(0080)     datal = data<<4 ;
    00E5 2F84      MOV	R24,R20
    00E6 708F      ANDI	R24,0xF
    00E7 9582      SWAP	R24
    00E8 2F48      MOV	R20,R24
(0081) 
(0082)     //LCD16xx_wait_Ready();
(0083)    
(0084)     RW_L;                                   //RW=0
    00E9 98D9      CBI	0x1B,1
(0085)     if (command == 0)                       //data
    00EA 20AA      TST	R10
    00EB F411      BNE	0x00EE
(0086)        RS_H;                                //RS=1
    00EC 9AD8      SBI	0x1B,0
    00ED C001      RJMP	0x00EF
(0087)     else                                    //command
(0088)        RS_L;                                //RS=0
    00EE 98D8      CBI	0x1B,0
(0089)        
(0090)     LCD_DATA_PORT &= 0x0F;
    00EF B38B      IN	R24,0x1B
    00F0 708F      ANDI	R24,0xF
    00F1 BB8B      OUT	0x1B,R24
(0091)     LCD_DATA_PORT |= datah&0xf0;            //send high 4bit
    00F2 2F86      MOV	R24,R22
    00F3 7F80      ANDI	R24,0xF0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -