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

📄 lcd1602.lis

📁 meg16 的所有功能实例
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module lcd1602.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD1602\lcd1602.c
 0000                   .dbfunc e delay_1us _delay_1us fV
                        .even
 0000           _delay_1us::
 0000                   .dbline -1
 0000                   .dbline 42
 0000           ; /****************************************Copyright (c)**************************************************
 0000           ; **                               ADEmbed Development Co.,LTD.                                    
 0000           ; **                                 http://www.adembed.com
 0000           ; **--------------File Info-------------------------------------------------------------------------------
 0000           ; ** File name:                 lcd1602.c
 0000           ; ** Last modified Date:  2008-10-13
 0000           ; ** Last Version:              1.0
 0000           ; ** Descriptions:              lcd1602 test.
 0000           ; ** 
 0000           ; **------------------------------------------------------------------------------------------------------
 0000           ; ** Created by:                        zhoufeng
 0000           ; ** Created date:              2008-10-13
 0000           ; ** Version:                           1.0
 0000           ; ** Descriptions:              
 0000           ; **
 0000           ; **------------------------------------------------------------------------------------------------------
 0000           ; ** Modified by:         junbolu
 0000           ; ** Modified date:       2008-12-13
 0000           ; ** Version:
 0000           ; ** Descriptions:
 0000           ; **
 0000           ; **------------------------------------------------------------------------------------------------------
 0000           ; **ICC-AVR application builder : 2008-12-13
 0000           ; **Target : M16
 0000           ; **Crystal: 7.3728Mhz
 0000           ; **
 0000           ; **
 0000           ; **描述:这是一个Lcd1602的测试程序。LCD1602型号为JHD162A 使用8位并口数据传输.
 0000           ; **      
 0000           ; **
 0000           ; **涉及知识点:
 0000           ; **          
 0000           ; **          
 0000           ; **          
 0000           ; *******************************************************************************************************/
 0000           ; #include <iom16v.h>
 0000           ; #include <macros.h>
 0000           ; #include"lcd1602.h"
 0000           ; 
 0000           ; //时钟频率:内部RC振荡8MHz
 0000           ; void delay_1us(void) //延时1us
 0000           ; {//ret:4t+call:4t=8t,8MHz时1t为125ns,8t为1000ns=1us
 0000                   .dbline -2
 0000           L1:
 0000                   .dbline 0 ; func end
 0000 0895              ret
 0002                   .dbend
 0002                   .dbfunc e delay_nus _delay_nus fV
 0002           ;              n -> R16,R17
                        .even
 0002           _delay_nus::
 0002                   .dbline -1
 0002                   .dbline 46
 0002           ; }
 0002           ; 
 0002           ; void delay_nus(unsigned int n) //延时n us
 0002           ; {//(8+(4+4)*(n-1)+3)t=(8+8n-8+3)t=(8n+3)t=n us+0.375us,所以约等于1us,特别n越大越精确
 0002 04C0              xjmp L4
 0004           L3:
 0004                   .dbline 48
 0004                   .dbline 49
 0004 0000              nop
 0006                   .dbline 50
 0006 0000              nop
 0008                   .dbline 51
 0008 0000              nop
 000A                   .dbline 52
 000A 0000              nop
 000C                   .dbline 53
 000C           L4:
 000C                   .dbline 47
 000C           ;  while(--n)
 000C C801              movw R24,R16
 000E 0197              sbiw R24,1
 0010 8C01              movw R16,R24
 0012 0030              cpi R16,0
 0014 0107              cpc R16,R17
 0016 B1F7              brne L3
 0018           X0:
 0018                   .dbline -2
 0018           L2:
 0018                   .dbline 0 ; func end
 0018 0895              ret
 001A                   .dbsym r n 16 i
 001A                   .dbend
 001A                   .dbfunc e delay_1ms _delay_1ms fV
                        .even
 001A           _delay_1ms::
 001A                   .dbline -1
 001A                   .dbline 56
 001A           ;  {
 001A           ;   asm("nop"); //nop需1t
 001A           ;   asm("nop");
 001A           ;   asm("nop");
 001A           ;   asm("nop");
 001A           ;  }
 001A           ; }
 001A           ; void delay_1ms(void) //延时1ms
 001A           ; {//函数调用本身有8t=1us
 001A                   .dbline 57
 001A           ;   delay_nus(999); //为999us
 001A 07EE              ldi R16,999
 001C 13E0              ldi R17,3
 001E F1DF              xcall _delay_nus
 0020                   .dbline -2
 0020           L6:
 0020                   .dbline 0 ; func end
 0020 0895              ret
 0022                   .dbend
 0022                   .dbfunc e delay_nms _delay_nms fV
 0022           ;              n -> R20,R21
                        .even
 0022           _delay_nms::
 0022 0E940000          xcall push_gset1
 0026 A801              movw R20,R16
 0028                   .dbline -1
 0028                   .dbline 61
 0028           ; }
 0028           ; 
 0028           ; void delay_nms(unsigned int n) //延时nms
 0028           ; {//(8+4*(n-1)+3)t+delay_nus=(7+4n)t+delay_nus
 0028                   .dbline 62
 0028           ;  for(;n>0;n--)
 0028 06C0              xjmp L11
 002A           L8:
 002A                   .dbline 63
 002A                   .dbline 64
 002A 0000              nop
 002C                   .dbline 65
 002C 07EE              ldi R16,999
 002E 13E0              ldi R17,3
 0030 E8DF              xcall _delay_nus
 0032                   .dbline 69
 0032           L9:
 0032                   .dbline 62
 0032 4150              subi R20,1
 0034 5040              sbci R21,0
 0036           L11:
 0036                   .dbline 62
 0036 4030              cpi R20,0
 0038 4507              cpc R20,R21
 003A B9F7              brne L8
 003C           X1:
 003C                   .dbline -2
 003C           L7:
 003C 0E940000          xcall pop_gset1
 0040                   .dbline 0 ; func end
 0040 0895              ret
 0042                   .dbsym r n 20 i
 0042                   .dbend
 0042                   .dbfunc e lcd_wait_enable _lcd_wait_enable fV
                        .even
 0042           _lcd_wait_enable::
 0042                   .dbline -1
 0042                   .dbline 73
 0042           ;  {
 0042           ;   asm("nop"); //再补尝,变成了(7+5n)t+delay_nus
 0042           ;   delay_nus(999); /*delay_nus(m)为(8m+3)t所以delay_nus的参数只要999就可以了
 0042           ;                 (7+5n)t+((8m+3)*n)t=(7+8n+8mn)t=7t+n us+mn us
 0042           ;                 =7t+(m+1)n us,代入m=999约等于1000n us=n ms,误差仅为7t,不到1us
 0042           ;                 */
 0042           ;  }
 0042           ; }
 0042           ; 
 0042           ; void lcd_wait_enable(void) //LCD等待可写
 0042           ; {
 0042                   .dbline 74
 0042           ;  Data_in(); //置为输入
 0042 2224              clr R2
 0044 2ABA              out 0x1a,R2
 0046                   .dbline 75
 0046           ;  clr_rs();
 0046 AB98              cbi 0x15,3
 0048                   .dbline 76
 0048           ;  set_rw();
 0048 AC9A              sbi 0x15,4
 004A                   .dbline 77
 004A           ;  delay_nus(1);
 004A 01E0              ldi R16,1
 004C 10E0              ldi R17,0
 004E D9DF              xcall _delay_nus
 0050                   .dbline 78
 0050           ;  set_en();
 0050 AD9A              sbi 0x15,5
 0052                   .dbline 79
 0052           ;  delay_nus(2);
 0052 02E0              ldi R16,2
 0054 10E0              ldi R17,0
 0056 D5DF              xcall _delay_nus
 0058           L13:
 0058                   .dbline 80
 0058           L14:
 0058                   .dbline 80
 0058           ;  while((Data_PIN&0x80)>>7);
 0058 89B3              in R24,0x19
 005A 8078              andi R24,128
 005C 8695              lsr R24
 005E 8695              lsr R24
 0060 8695              lsr R24
 0062 8695              lsr R24
 0064 8695              lsr R24
 0066 8695              lsr R24
 0068 8695              lsr R24
 006A 8823              tst R24
 006C A9F7              brne L13
 006E                   .dbline 81
 006E           ;  clr_en();
 006E AD98              cbi 0x15,5
 0070                   .dbline 82
 0070           ;  Data_out();
 0070 8FEF              ldi R24,255
 0072 8ABB              out 0x1a,R24
 0074                   .dbline -2
 0074           L12:
 0074                   .dbline 0 ; func end
 0074 0895              ret
 0076                   .dbend
 0076                   .dbfunc e lcd_write_cmd _lcd_write_cmd fV
 0076           ;         attrib -> R22
 0076           ;            cmd -> R20
                        .even
 0076           _lcd_write_cmd::
 0076 0E940000          xcall push_gset2
 007A 622F              mov R22,R18
 007C 402F              mov R20,R16
 007E                   .dbline -1
 007E                   .dbline 86
 007E           ; }
 007E           ; 
 007E           ; void lcd_write_cmd(char cmd,char attrib) //写命令,attrib为0不检查忙状态,否则检查忙状态
 007E           ; {
 007E                   .dbline 87
 007E           ;  if(attrib) lcd_wait_enable();
 007E 6623              tst R22
 0080 09F0              breq L17
 0082                   .dbline 87
 0082 DFDF              xcall _lcd_wait_enable
 0084           L17:
 0084                   .dbline 88
 0084           ;  clr_rs();
 0084 AB98              cbi 0x15,3
 0086                   .dbline 89
 0086           ;  clr_rw();
 0086 AC98              cbi 0x15,4
 0088                   .dbline 90
 0088           ;  delay_nus(1);
 0088 01E0              ldi R16,1
 008A 10E0              ldi R17,0
 008C BADF              xcall _delay_nus
 008E                   .dbline 91
 008E           ;  Data_PORT=cmd;
 008E 4BBB              out 0x1b,R20
 0090                   .dbline 92
 0090           ;  delay_nus(1);
 0090 01E0              ldi R16,1
 0092 10E0              ldi R17,0
 0094 B6DF              xcall _delay_nus
 0096                   .dbline 93
 0096           ;  set_en();
 0096 AD9A              sbi 0x15,5
 0098                   .dbline 94
 0098           ;  delay_nus(2);
 0098 02E0              ldi R16,2
 009A 10E0              ldi R17,0
 009C B2DF              xcall _delay_nus
 009E                   .dbline 95
 009E           ;  clr_en();
 009E AD98              cbi 0x15,5
 00A0                   .dbline -2
 00A0           L16:
 00A0 0E940000          xcall pop_gset2
 00A4                   .dbline 0 ; func end
 00A4 0895              ret
 00A6                   .dbsym r attrib 22 c
 00A6                   .dbsym r cmd 20 c
 00A6                   .dbend
 00A6                   .dbfunc e lcd_set_xy _lcd_set_xy fV
 00A6           ;            tmp -> R20,R21
 00A6           ;              y -> R20,R21
 00A6           ;              x -> R22,R23
                        .even
 00A6           _lcd_set_xy::
 00A6 0E940000          xcall push_gset2
 00AA A901              movw R20,R18
 00AC B801              movw R22,R16
 00AE                   .dbline -1
 00AE                   .dbline 99
 00AE           ; }
 00AE           ; 
 00AE           ; void lcd_set_xy(int x,int y) //设置显示的起始地址,x行,y列
 00AE           ; {
 00AE                   .dbline 101
 00AE           ;  int tmp;
 00AE           ;  tmp=y&0x0F;
 00AE 4F70              andi R20,15
 00B0 5070              andi R21,0
 00B2                   .dbline 102
 00B2           ;  x&=0x01;
 00B2 6170              andi R22,1

⌨️ 快捷键说明

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