📄 lcd7920.lis
字号:
.module Lcd7920.c
.area text(rom, con, rel)
0000 .dbfile E:\__test\_RTL8019_M128_struct_Test\Lcd7920.c
0000 .dbfunc e LCD_Init _LCD_Init fV
.even
0000 _LCD_Init::
0000 .dbline -1
0000 .dbline 16
0000 ; //本程序测试通过 --2007.11.27
0000 ;
0000 ; //本程序是7920的LM3037的液晶驱动程序
0000 ; //汉字2x9
0000 ; //可显示图形
0000 ; //ATMEGA16, 内部晶振8M (也可用于外部7.3728MHz晶振)
0000 ; //使用串行传输 (2线)
0000 ;
0000 ; #include "Lcd7920.h"
0000 ;
0000 ; #define LINEWIDTH 18 //行宽
0000 ; #define LINES 2 //行数
0000 ;
0000 ; //LCD初始化
0000 ; void LCD_Init(void)
0000 ; {
0000 .dbline 17
0000 ; Delay_nms(100);
0000 04E6 ldi R16,100
0002 10E0 ldi R17,0
0004 0E940000 xcall _Delay_nms
0008 .dbline 20
0008 ;
0008 ; //端口初始化
0008 ; LCD_CONTROL_DDR=0xFF;
0008 8FEF ldi R24,255
000A 84BB out 0x14,R24
000C .dbline 22
000C ;
000C ; CLRBIT(LCD_CONTROL_PORT,E);
000C AB98 cbi 0x15,3
000E .dbline 23
000E ; CLRBIT(LCD_CONTROL_PORT,RW);
000E AA98 cbi 0x15,2
0010 .dbline 24
0010 ; Delay_nms(1);
0010 01E0 ldi R16,1
0012 10E0 ldi R17,0
0014 0E940000 xcall _Delay_nms
0018 .dbline 26
0018 ;
0018 ; LCD_WriteCmd(0x20); // 8bit I/F, basic command, graphic off
0018 00E2 ldi R16,32
001A 21D0 xcall _LCD_WriteCmd
001C .dbline 27
001C ; LCD_WriteCmd(0x20); // 8bit I/F, basic command, graphic off
001C 00E2 ldi R16,32
001E 1FD0 xcall _LCD_WriteCmd
0020 .dbline 28
0020 ; LCD_WriteCmd(0x0C); // display on
0020 0CE0 ldi R16,12
0022 1DD0 xcall _LCD_WriteCmd
0024 .dbline 29
0024 ; LCD_WriteCmd(0x06); // cursor right shift
0024 06E0 ldi R16,6
0026 1BD0 xcall _LCD_WriteCmd
0028 .dbline 31
0028 ;
0028 ; LCD_Clear(); // cursor right shift
0028 01D0 xcall _LCD_Clear
002A .dbline -2
002A L1:
002A .dbline 0 ; func end
002A 0895 ret
002C .dbend
002C .dbfunc e LCD_Clear _LCD_Clear fV
.even
002C _LCD_Clear::
002C .dbline -1
002C .dbline 37
002C ; }
002C ;
002C ;
002C ; //LCD清屏
002C ; void LCD_Clear(void)
002C ; {
002C .dbline 38
002C ; LCD_WriteCmd(0x01);
002C 01E0 ldi R16,1
002E 17D0 xcall _LCD_WriteCmd
0030 .dbline 39
0030 ; Delay_nms(1); //发清屏命令后,一定要加这个延时,不然后面马上写字符串到LCD会出现错误
0030 01E0 ldi R16,1
0032 10E0 ldi R17,0
0034 0E940000 xcall _Delay_nms
0038 .dbline -2
0038 L2:
0038 .dbline 0 ; func end
0038 0895 ret
003A .dbend
003A .dbfunc e LCD_CheckState _LCD_CheckState fV
.even
003A _LCD_CheckState::
003A .dbline -1
003A .dbline 45
003A ; }
003A ;
003A ;
003A ; //状态检查函数,判断是否处于忙状态 //--保留
003A ; void LCD_CheckState(void)
003A ; {
003A .dbline -2
003A L3:
003A .dbline 0 ; func end
003A 0895 ret
003C .dbend
003C .dbfunc e LCD_Send _LCD_Send fV
003C ; i -> R20
003C ; senddata -> R16
.even
003C _LCD_Send::
003C 4A93 st -y,R20
003E .dbline -1
003E .dbline 63
003E ; /* unsigned char dat;
003E ; CLRBIT(LCD_CONTROL_PORT,RS); //RS=0
003E ; //SETBIT(LCD_CONTROL_PORT,RW); //RW=1
003E ; LCD_DATA_DDR=0x00; // portA as input
003E ; do
003E ; {
003E ; SETBIT(LCD_CONTROL_PORT,E);
003E ; NOP();
003E ; CLRBIT(LCD_CONTROL_PORT,E);
003E ; }
003E ; while (LCD_DATA_PIN&0x80);
003E ; */
003E ; }
003E ;
003E ;
003E ; //对LCD写入数据的时序协议处理
003E ; void LCD_Send(unsigned char senddata)
003E ; {
003E .dbline 66
003E ; unsigned char i;
003E ;
003E ; for(i=0;i<8;i++)
003E 4427 clr R20
0040 0AC0 xjmp L8
0042 L5:
0042 .dbline 67
0042 ; {
0042 .dbline 68
0042 ; if((senddata)&0x80)
0042 07FF sbrs R16,7
0044 02C0 rjmp L9
0046 X0:
0046 .dbline 69
0046 ; {
0046 .dbline 71
0046 ; //D_OUT=1 ;
0046 ; SETBIT(LCD_CONTROL_PORT,RW);
0046 AA9A sbi 0x15,2
0048 .dbline 72
0048 ; }
0048 01C0 xjmp L10
004A L9:
004A .dbline 74
004A ; else
004A ; {
004A .dbline 76
004A ; //D_OUT=0;
004A ; CLRBIT(LCD_CONTROL_PORT,RW);
004A AA98 cbi 0x15,2
004C .dbline 77
004C ; }
004C L10:
004C .dbline 80
004C ;
004C ; //SCK=1;
004C ; SETBIT(LCD_CONTROL_PORT,E);
004C AB9A sbi 0x15,3
004E .dbline 81
004E ; NOP();
004E 0000 nop
0050 .dbline 83
0050 ; //SCK=0;
0050 ; CLRBIT(LCD_CONTROL_PORT,E);
0050 AB98 cbi 0x15,3
0052 .dbline 85
0052 ;
0052 ; senddata<<=1;
0052 000F lsl R16
0054 .dbline 86
0054 ; }
0054 L6:
0054 .dbline 66
0054 4395 inc R20
0056 L8:
0056 .dbline 66
0056 4830 cpi R20,8
0058 A0F3 brlo L5
005A X1:
005A .dbline -2
005A L4:
005A .dbline 0 ; func end
005A 4991 ld R20,y+
005C 0895 ret
005E .dbsym r i 20 c
005E .dbsym r senddata 16 c
005E .dbend
005E .dbfunc e LCD_WriteCmd _LCD_WriteCmd fV
005E ; scmd -> R20
.even
005E _LCD_WriteCmd::
005E 4A93 st -y,R20
0060 402F mov R20,R16
0062 .dbline -1
0062 .dbline 91
0062 ; }
0062 ;
0062 ; //写一个命令到LCD
0062 ; void LCD_WriteCmd(unsigned char scmd)
0062 ; {
0062 .dbline 92
0062 ; LCD_Send(0xf8);
0062 08EF ldi R16,248
0064 EBDF xcall _LCD_Send
0066 .dbline 93
0066 ; LCD_Send(scmd&0xf0);
0066 042F mov R16,R20
0068 007F andi R16,240
006A E8DF xcall _LCD_Send
006C .dbline 94
006C ; LCD_Send(scmd<<4);
006C 042F mov R16,R20
006E 0F70 andi R16,#0x0F
0070 0295 swap R16
0072 E4DF xcall _LCD_Send
0074 .dbline 95
0074 ; Delay_nus(20);
0074 04E1 ldi R16,20
0076 10E0 ldi R17,0
0078 0E940000 xcall _Delay_nus
007C .dbline -2
007C L11:
007C .dbline 0 ; func end
007C 4991 ld R20,y+
007E 0895 ret
0080 .dbsym r scmd 20 c
0080 .dbend
0080 .dbfunc e LCD_WriteData _LCD_WriteData fV
0080 ; DData -> R20
.even
0080 _LCD_WriteData::
0080 4A93 st -y,R20
0082 402F mov R20,R16
0084 .dbline -1
0084 .dbline 100
0084 ; }
0084 ;
0084 ; ////写一个数据到LCD
0084 ; void LCD_WriteData(unsigned char DData)
0084 ; {
0084 .dbline 101
0084 ; LCD_Send(0xfa);
0084 0AEF ldi R16,250
0086 DADF xcall _LCD_Send
0088 .dbline 102
0088 ; LCD_Send(DData&0xf0);
0088 042F mov R16,R20
008A 007F andi R16,240
008C D7DF xcall _LCD_Send
008E .dbline 103
008E ; LCD_Send(DData<<4);
008E 042F mov R16,R20
0090 0F70 andi R16,#0x0F
0092 0295 swap R16
0094 D3DF xcall _LCD_Send
0096 .dbline 104
0096 ; Delay_nus(20);
0096 04E1 ldi R16,20
0098 10E0 ldi R17,0
009A 0E940000 xcall _Delay_nus
009E .dbline -2
009E L12:
009E .dbline 0 ; func end
009E 4991 ld R20,y+
00A0 0895 ret
00A2 .dbsym r DData 20 c
00A2 .dbend
00A2 .dbfunc e LCD_Set_xy _LCD_Set_xy fV
00A2 ; i -> R20
00A2 ; X -> R22
00A2 ; Y -> R10
.even
00A2 _LCD_Set_xy::
00A2 0E940000 xcall push_xgsetF00C
00A6 622F mov R22,R18
00A8 A02E mov R10,R16
00AA .dbline -1
00AA .dbline 109
00AA ; }
00AA ;
00AA ; //设置光标位置,先Y坐标后X坐标
00AA ; void LCD_Set_xy(unsigned char Y, unsigned char X)
00AA ; {
00AA .dbline 110
00AA ; unsigned char i=0x00;
00AA 4427 clr R20
00AC .dbline 111
00AC ; switch(Y & 0x0f) //确定行号
00AC 8A2D mov R24,R10
00AE 9927 clr R25
00B0 8F70 andi R24,15
00B2 9070 andi R25,0
00B4 5C01 movw R10,R24
00B6 8030 cpi R24,0
00B8 8907 cpc R24,R25
00BA 69F0 breq L17
00BC X2:
00BC 8130 cpi R24,1
00BE E0E0 ldi R30,0
00C0 9E07 cpc R25,R30
00C2 59F0 breq L18
00C4 X3:
00C4 8230 cpi R24,2
00C6 E0E0 ldi R30,0
00C8 9E07 cpc R25,R30
00CA 49F0 breq L19
00CC X4:
00CC 8330 cpi R24,3
00CE E0E0 ldi R30,0
00D0 9E07 cpc R25,R30
00D2 39F0 breq L20
00D4 X5:
00D4 07C0 xjmp L15
00D6 L17:
00D6 .dbline 114
00D6 ; {
00D6 ; case 0x00:
00D6 ; i=0x80;
00D6 40E8 ldi R20,128
00D8 .dbline 115
00D8 ; break;
00D8 05C0 xjmp L15
00DA L18:
00DA .dbline 117
00DA ; case 0x01:
00DA ; i=0x90;
00DA 40E9 ldi R20,144
00DC .dbline 118
00DC ; break;
00DC 03C0 xjmp L15
00DE L19:
00DE .dbline 120
00DE ; case 0x02:
00DE ; i=0x88;
00DE 48E8 ldi R20,136
00E0 .dbline 121
00E0 ; break;
00E0 01C0 xjmp L15
00E2 L20:
00E2 .dbline 123
00E2 ; case 0x03:
00E2 ; i=0x98;
00E2 48E9 ldi R20,152
00E4 .dbline 124
00E4 ; break;
00E4 .dbline 126
00E4 ; default :
00E4 ; break;
00E4 L15:
00E4 .dbline 128
00E4 ; }
00E4 ; i = (X & 0x0f)|i; //确定列号
00E4 862F mov R24,R22
00E6 8F70 andi R24,15
00E8 482B or R20,R24
00EA .dbline 129
00EA ; LCD_WriteCmd(i);
00EA 042F mov R16,R20
00EC B8DF xcall _LCD_WriteCmd
00EE .dbline -2
00EE L13:
00EE .dbline 0 ; func end
00EE 0C940000 xjmp pop_xgsetF00C
00F2 .dbsym r i 20 c
00F2 .dbsym r X 22 c
00F2 .dbsym r Y 10 c
00F2 .dbend
00F2 .dbfunc e LCD_WriteChar _LCD_WriteChar fV
00F2 ; c1 -> y+2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -