📄 1602lcd.lis
字号:
.module _1602LCD.c
.area text(rom, con, rel)
0000 .dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\1602LCD/delay.h
0000 .dbfunc e DelayUS _DelayUS fV
0000 ; time -> R16,R17
.even
0000 _DelayUS::
0000 .dbline -1
0000 .dbline 9
0000 ; /**********************************************
0000 ; 液晶1602实验
0000 ; 晶振: 内部8.0000Mhz
0000 ; 连接:RS PA2,
0000 ; RW PA1,
0000 ; EN PA0,
0000 ; DATA PD0-PD7
0000 ; ***********************************************/
0000 ; /******************头文件**********************/
0000 02C0 xjmp L3
0002 L2:
0002 .dbline 11
0002 0150 subi R16,1
0004 1040 sbci R17,0
0006 L3:
0006 .dbline 10
0006 ; #include <iom16v.h>
0006 81E0 ldi R24,1
0008 90E0 ldi R25,0
000A 8017 cp R24,R16
000C 9107 cpc R25,R17
000E C8F3 brlo L2
0010 .dbline -2
0010 L1:
0010 .dbline 0 ; func end
0010 0895 ret
0012 .dbsym r time 16 i
0012 .dbend
0012 .dbfunc e DelayMS _DelayMS fV
0012 ; i -> R20,R21
0012 ; time -> R16,R17
.even
0012 _DelayMS::
0012 0E940000 xcall push_gset1
0016 .dbline -1
0016 .dbline 20
0016 ; #include <macros.h>
0016 ; #include "delay.h"
0016 ; /******************宏定义**********************/
0016 ; #define uchar unsigned char
0016 ; #define uint unsigned int
0016 ;
0016 ; #define mode 0x38 //功能设置
0016 ; //DL=1 八位数据接口
0016 ; //N=1 两行显示
0016 ; //F=0 5*7点阵字符
0016 09C0 xjmp L7
0018 L6:
0018 .dbline 23
0018 ; #define cursor 0x0f //显示开/关设置
0018 ; //D=1 显示屏开
0018 ; //C=1 光标开
0018 .dbline 24
0018 ; //B=1 闪烁开
0018 41E0 ldi R20,1
001A 50E0 ldi R21,0
001C 02C0 xjmp L12
001E L9:
001E .dbline 25
001E L10:
001E .dbline 24
001E 4F5F subi R20,255 ; offset = 1
0020 5F4F sbci R21,255
0022 L12:
0022 .dbline 24
0022 4637 cpi R20,118
0024 E4E0 ldi R30,4
0026 5E07 cpc R21,R30
0028 D0F3 brlo L9
002A .dbline 26
002A L7:
002A .dbline 22
002A 1801 movw R2,R16
002C 0150 subi R16,1
002E 1040 sbci R17,0
0030 2220 tst R2
0032 91F7 brne L6
0034 3320 tst R3
0036 81F7 brne L6
0038 X0:
0038 .dbline -2
0038 L5:
0038 0E940000 xcall pop_gset1
003C .dbline 0 ; func end
003C 0895 ret
003E .dbsym r i 20 i
003E .dbsym r time 16 i
003E .dbend
.area lit(rom, con, rel)
0000 _table1::
0000 6A6920736875207775206C6920786900 .byte 'j,'i,32,'s,'h,'u,32,'w,'u,32,'l,'i,32,'x,'i,0
0010 .dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\1602LCD\1602LCD.c
0010 .dbsym e table1 _table1 A[16:16]kc
0010 _table2::
0010 6469616E7A697869616F7A7535303700 .byte 'd,'i,'a,'n,'z,'i,'x,'i,'a,'o,'z,'u,53,48,55,0
0020 .dbsym e table2 _table2 A[16:16]kc
.area text(rom, con, rel)
003E .dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\1602LCD\1602LCD.c
003E .dbfunc e port_init _port_init fV
.even
003E _port_init::
003E .dbline -1
003E .dbline 57
003E ; #define shift_off 0x06 //输入方式设置
003E ; //ID=1 读写一个字符后,地址和光标加1
003E ; //S=0 屏幕视窗停留在1-16列寄存器不移动
003E ; #define shift_on 0x07 //输入方式设置
003E ; //ID=1 读写一个字符后,地址和光标加1
003E ; //S=1 每次写完一个字符屏幕视窗从左边的寄存器向右边的寄存器移动实现字符左移的效果
003E ; #define run 0x1c //光标、画面移动,不影响DDRAM
003E ; //S/C=1 屏幕视窗向右平移一个字符
003E ; //R/L=1 右移
003E ; #define clean 0x01 //清屏指令
003E ; #define enter 0x02 //归位指令 AC=0 光标,画面回HOME位
003E ;
003E ; #define RS_H PORTA|=BIT(2) //RS=1,选择数据
003E ; #define RS_L PORTA&=~BIT(2) //RS=0,选择命令
003E ;
003E ; #define RW_H PORTA|=BIT(1) //R/W=1,读
003E ; #define RW_L PORTA&=~BIT(1) //R/W=0,写
003E ;
003E ; #define EN_H PORTA|=BIT(0) //EN=1,使能关
003E ; #define EN_L PORTA=~BIT(0) //EN=0,使能开
003E ;
003E ; const uchar table1[]="ji shu wu li xi"; //定义数据在flash中
003E ; const uchar table2[]="dianzixiaozu507";
003E ; /******************函数声明******************/
003E ; void port_init(void); //M16初始化
003E ; void n1602_init(void); //1602初始化
003E ; void write_com(uchar com); //写指令
003E ; void write_dat(uchar dat); //写数据
003E ; void set_xy(uchar x,uchar y); //设置行列
003E ; void show(uchar x,uchar y,uchar *str); //显示函数,x行,y列,*str字符串
003E ; /*****************M16初始化******************/
003E ; void port_init(void)
003E ; {
003E .dbline 58
003E ; PORTA = 0x00;//设置端口数据、方向
003E 2224 clr R2
0040 2BBA out 0x1b,R2
0042 .dbline 59
0042 ; DDRA = 0xFF;
0042 8FEF ldi R24,255
0044 8ABB out 0x1a,R24
0046 .dbline 60
0046 ; PORTB = 0x00;
0046 28BA out 0x18,R2
0048 .dbline 61
0048 ; DDRB = 0x00;
0048 27BA out 0x17,R2
004A .dbline 62
004A ; PORTC = 0x00;
004A 25BA out 0x15,R2
004C .dbline 63
004C ; DDRC = 0x00;
004C 24BA out 0x14,R2
004E .dbline 64
004E ; PORTD = 0x00;
004E 22BA out 0x12,R2
0050 .dbline 65
0050 ; DDRD = 0xFF;
0050 81BB out 0x11,R24
0052 .dbline -2
0052 L13:
0052 .dbline 0 ; func end
0052 0895 ret
0054 .dbend
0054 .dbfunc e n1602_init _n1602_init fV
.even
0054 _n1602_init::
0054 .dbline -1
0054 .dbline 69
0054 ; }
0054 ; /*****************1602初始化*****************/
0054 ; void n1602_init(void)
0054 ; {
0054 .dbline 70
0054 ; EN_L;
0054 8EEF ldi R24,254
0056 8BBB out 0x1b,R24
0058 .dbline 71
0058 ; write_com(mode); //功能设置
0058 08E3 ldi R16,56
005A 1DD0 xcall _write_com
005C .dbline 72
005C ; DelayMS(1);
005C 01E0 ldi R16,1
005E 10E0 ldi R17,0
0060 D8DF xcall _DelayMS
0062 .dbline 73
0062 ; write_com(clean); //清屏
0062 01E0 ldi R16,1
0064 18D0 xcall _write_com
0066 .dbline 74
0066 ; DelayMS(1);
0066 01E0 ldi R16,1
0068 10E0 ldi R17,0
006A D3DF xcall _DelayMS
006C .dbline 75
006C ; write_com(cursor); //显示开/关设置
006C 0FE0 ldi R16,15
006E 13D0 xcall _write_com
0070 .dbline 76
0070 ; DelayMS(1);
0070 01E0 ldi R16,1
0072 10E0 ldi R17,0
0074 CEDF xcall _DelayMS
0076 .dbline 77
0076 ; write_com(shift_off); //每写完一个字符地址指针加+1,屏幕视窗不移动
0076 06E0 ldi R16,6
0078 0ED0 xcall _write_com
007A .dbline 78
007A ; DelayMS(1);
007A 01E0 ldi R16,1
007C 10E0 ldi R17,0
007E C9DF xcall _DelayMS
0080 .dbline -2
0080 L14:
0080 .dbline 0 ; func end
0080 0895 ret
0082 .dbend
0082 .dbfunc e init_devices _init_devices fV
.even
0082 _init_devices::
0082 .dbline -1
0082 .dbline 82
0082 ;
0082 ; }
0082 ; void init_devices(void)
0082 ; {
0082 .dbline 83
0082 ; CLI(); //禁止所有中断
0082 F894 cli
0084 .dbline 84
0084 ; MCUCR = 0x00;//INT0、INT1中断触发方式
0084 2224 clr R2
0086 25BE out 0x35,R2
0088 .dbline 85
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -