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

📄 aa.lst

📁 基于AVR单片机的lm1602字符液晶模块显示的C代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0034 E5CF      LDI	R28,0x5F
    0035 E0D4      LDI	R29,4
    0036 BFCD      OUT	0x3D,R28
    0037 BFDE      OUT	0x3E,R29
    0038 51C0      SUBI	R28,0x10
    0039 40D0      SBCI	R29,0
    003A EA0A      LDI	R16,0xAA
    003B 8308      STD	Y+0,R16
    003C 2400      CLR	R0
    003D E7E4      LDI	R30,0x74
    003E E0F0      LDI	R31,0
    003F E010      LDI	R17,0
    0040 37E4      CPI	R30,0x74
    0041 07F1      CPC	R31,R17
    0042 F011      BEQ	0x0045
    0043 9201      ST	R0,Z+
    0044 CFFB      RJMP	0x0040
    0045 8300      STD	Z+0,R16
    0046 E5E4      LDI	R30,0x54
    0047 E0F0      LDI	R31,0
    0048 E6A0      LDI	R26,0x60
    0049 E0B0      LDI	R27,0
    004A E010      LDI	R17,0
    004B 36E8      CPI	R30,0x68
    004C 07F1      CPC	R31,R17
    004D F021      BEQ	0x0052
    004E 95C8      LPM
    004F 9631      ADIW	R30,1
    0050 920D      ST	R0,X+
    0051 CFF9      RJMP	0x004B
    0052 940E0110  CALL	_main
_exit:
    0054 CFFF      RJMP	_exit
FILE: E:\avr\测试\lcd1\lcd.c
(0001) /*--------------------------------------------------*/
(0002) /*             AVR-ARM开发网论坛                    */
(0003) /*           http://www.avrarm.com                  */
(0004) /*            AVR生成代码测试程序                   */
(0005) /*--------------------------------------------------*/
(0006) /*     程序由AVR辅助开发工具V2.1.1自动生成          */
(0007) /*     AVR系统的处理器为:   ATMega16               */
(0008) /*     AVR系统的晶振频率:   1.0000 Mhz             */
(0009) /*--------------------------------------------------*/
(0010) 
(0011) #include <iom16v.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:
    0055 B381      IN	R24,0x11
    0056 6F80      ORI	R24,0xF0
    0057 BB81      OUT	0x11,R24
(0034)     LCD_EN_DDR   |=  LCD_EN;
    0058 9AD0      SBI	0x1A,0
(0035)     LCD_RS_DDR   |=  LCD_RS;
    0059 9AD2      SBI	0x1A,2
(0036)     LCD_RW_DDR   |=  LCD_RW;
    005A 9AD1      SBI	0x1A,1
(0037)     RW_L;
    005B 98D9      CBI	0x1B,1
(0038) 	
(0039)     LCD_DATA_PORT =  0x20;
    005C E280      LDI	R24,0x20
    005D BB82      OUT	0x12,R24
(0040)     LCD16xx_en_write();
    005E D014      RCALL	_LCD16xx_en_write
(0041)     delay_nus(50);
    005F E302      LDI	R16,0x32
    0060 E010      LDI	R17,0
    0061 940E00EF  CALL	_delay_nus
(0042)    
(0043)     LCD16xx_write_char(1,0x28);      //4bit test
    0063 E228      LDI	R18,0x28
    0064 E001      LDI	R16,1
    0065 D017      RCALL	_LCD16xx_write_char
(0044)     delay_nms(5);
    0066 E005      LDI	R16,5
    0067 E010      LDI	R17,0
    0068 940E0101  CALL	_delay_nms
(0045)     LCD16xx_write_char(1,0x0c);      //显示开
    006A E02C      LDI	R18,0xC
    006B E001      LDI	R16,1
    006C D010      RCALL	_LCD16xx_write_char
(0046)     LCD16xx_write_char(1,0x01);      //显示清屏
    006D E021      LDI	R18,1
    006E E001      LDI	R16,1
    006F D00D      RCALL	_LCD16xx_write_char
(0047)     LCD16xx_write_char(1,0x06);      //显示光标移动设置
    0070 E026      LDI	R18,6
    0071 E001      LDI	R16,1
(0048) }
    0072 C00A      RJMP	_LCD16xx_write_char
(0049) 
(0050) void LCD16xx_en_write(void)          //EN端产生一个高电平脉冲,写LCD
(0051) {
(0052)     E_H;
_LCD16xx_en_write:
    0073 9AD8      SBI	0x1B,0
(0053)     delay_nus(4);                    //如果晶振频率太高,则可相应提高延时
    0074 E004      LDI	R16,4
    0075 E010      LDI	R17,0
    0076 940E00EF  CALL	_delay_nus
(0054)     E_L;
    0078 98D8      CBI	0x1B,0
(0055) }
    0079 9508      RET
(0056) 
(0057) /************************************************************************/
(0058) /* LCD16xx清屏                                                          */
(0059) /************************************************************************/
(0060) void LCD16xx_clr(void)
(0061) {
(0062)     LCD16xx_write_char(1,0x01);
_LCD16xx_clr:
    007A E021      LDI	R18,1
    007B E001      LDI	R16,1
(0063) }
    007C C000      RJMP	_LCD16xx_write_char
    007D 940E0171  CALL	push_gset3
    007F 2F42      MOV	R20,R18
    0080 2EA0      MOV	R10,R16
(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;
    0081 2F64      MOV	R22,R20
(0080)     datal = data<<4 ;
    0082 2F84      MOV	R24,R20
    0083 708F      ANDI	R24,0xF
    0084 9582      SWAP	R24
    0085 2F48      MOV	R20,R24
(0081) 
(0082)     //LCD16xx_wait_Ready();
(0083)    
(0084)     RW_L;                                   //RW=0
    0086 98D9      CBI	0x1B,1
(0085)     if (command == 0)                       //data
    0087 20AA      TST	R10
    0088 F411      BNE	0x008B
(0086)        RS_H;                                //RS=1
    0089 9ADA      SBI	0x1B,2
    008A C001      RJMP	0x008C
(0087)     else                                    //command
(0088)        RS_L;                                //RS=0
    008B 98DA      CBI	0x1B,2
(0089)        
(0090)     LCD_DATA_PORT &= 0x0F;
    008C B382      IN	R24,0x12
    008D 708F      ANDI	R24,0xF
    008E BB82      OUT	0x12,R24
(0091)     LCD_DATA_PORT |= datah&0xf0;            //send high 4bit
    008F 2F86      MOV	R24,R22
    0090 7F80      ANDI	R24,0xF0
    0091 B222      IN	R2,0x12
    0092 2A28      OR	R2,R24
    0093 BA22      OUT	0x12,R2
(0092)     LCD16xx_en_write();
    0094 DFDE      RCALL	_LCD16xx_en_write
(0093) 
(0094)     LCD_DATA_PORT &= 0x0F;
    0095 B382      IN	R24,0x12
    0096 708F      ANDI	R24,0xF
    0097 BB82      OUT	0x12,R24
(0095)     LCD_DATA_PORT |= datal&0xf0;            //send low 4bit
    0098 2F84      MOV	R24,R20
    0099 7F80      ANDI	R24,0xF0
    009A B222      IN	R2,0x12
    009B 2A28      OR	R2,R24
    009C BA22      OUT	0x12,R2
(0096)     LCD16xx_en_write();
    009D DFD5      RCALL	_LCD16xx_en_write
(0097) }
    009E 940E0153  CALL	pop_gset3
    00A0 9508      RET
(0098) 
(0099) void LCD16xx_wait_Ready(void)              //等待LCD空闲
(0100) {
(0101)     LCD_DATA_DDR &= ~0x80;                 //PD7 I/O口方向设置为输入
_LCD16xx_wait_Ready:
    00A1 988F      CBI	0x11,7
(0102)     RW_H;                                  //RW=1
    00A2 9AD9      SBI	0x1B,1
(0103)     RS_L;                                  //RS=0
    00A3 98DA      CBI	0x1B,2
(0104)     E_H;                                   //EN=1
    00A4 9AD8      SBI	0x1B,0
(0105)     while (!( LCD_DATA_PIN&0x80 ) == 0);   //RW=1,读PD7,为0表示空闲;
    00A5 9987      SBIC	0x10,7
    00A6 C003      RJMP	0x00AA
    00A7 E001      LDI	R16,1
    00A8 E010      LDI	R17,0
    00A9 C002      RJMP	0x00AC
    00AA 2700      CLR	R16
    00AB 2711      CLR	R17
    00AC 3000      CPI	R16,0
    00AD 0701      CPC	R16,R17
    00AE F3B1      BEQ	0x00A5
(0106)     E_L;                                   //EN=0
    00AF 98D8      CBI	0x1B,0
(0107)     LCD_DATA_DDR |= LCD_DATA;
    00B0 B381      IN	R24,0x11
    00B1 6F80      ORI	R24,0xF0
    00B2 BB81      OUT	0x11,R24
(0108) }
    00B3 9508      RET
_LCD16xx_set_xy:
  address              --> R20
  y                    --> R10
  x                    --> R22
    00B4 940E0171  CALL	push_gset3
    00B6 2EA2      MOV	R10,R18
    00B7 2F60      MOV	R22,R16
(0109) 
(0110) /*-----------------------------------------------------------------------
(0111) LCD_set_xy        : 设置LCD显示的起始位置
(0112) 
(0113) 输入参数:x、y    : 显示字符串的位置,X:0-15,Y:0-1
(0114)                     LCD第一行显示寄存器地址:0x80-0x8F
(0115)                     LCD第一行显示寄存器地址:0xC0-0xCF
(0116) 编写日期          :2006年08月30日
(0117) 最后修改日期      :2006年08月30日
(0118) -----------------------------------------------------------------------*/
(0119) void LCD16xx_set_xy( unsigned char x, unsigned char y )
(0120) {
(0121)     unsigned char address;
(0122)     if (y == 0)
    00B8 20AA      TST	R10
    00B9 F419      BNE	0x00BD
(0123)        address = 0x80 + x;
    00BA 2F46      MOV	R20,R22
    00BB 5840      SUBI	R20,0x80
    00BC C00E      RJMP	0x00CB
(0124)     else if(y == 1)
    00BD 2D8A      MOV	R24,R10
    00BE 3081      CPI	R24,1
    00BF F419      BNE	0x00C3
(0125)        address = 0xc0 + x;
    00C0 2F46      MOV	R20,R22
    00C1 5440      SUBI	R20,0x40
    00C2 C008      RJMP	0x00CB
(0126)     else if(y == 2)
    00C3 2D8A      MOV	R24,R10
    00C4 3082      CPI	R24,2
    00C5 F419      BNE	0x00C9
(0127)        address = 0x90 + x;
    00C6 2F46      MOV	R20,R22
    00C7 5740      SUBI	R20,0x70
    00C8 C002      RJMP	0x00CB
(0128)     else
(0129)        address = 0xd0 + x;

⌨️ 快捷键说明

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