📄 lcd1602.lis
字号:
.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 + -