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

📄 12864-7920.lst

📁 12864-7902液晶驱动程序
💻 LST
字号:
__text_start:
__start:
      45 E5CF      LDI	R28,0x5F
      46 E0D4      LDI	R29,4
      47 BFCD      OUT	0x3D,R28
      48 BFDE      OUT	0x3E,R29
      49 51CE      SUBI	R28,0x1E
      4A 40D0      SBCI	R29,0
      4B EA0A      LDI	R16,0xAA
      4C 8308      STD	Y+0,R16
      4D 2400      CLR	R0
      4E E9E6      LDI	R30,0x96
      4F E0F0      LDI	R31,0
      50 E010      LDI	R17,0
      51 39E6      CPI	R30,0x96
      52 07F1      CPC	R31,R17
      53 F011      BEQ	0x0056
      54 9201      ST	R0,Z+
      55 CFFB      RJMP	0x0051
      56 8300      STD	Z+0,R16
      57 E5E4      LDI	R30,0x54
      58 E0F0      LDI	R31,0
      59 E6A0      LDI	R26,0x60
      5A E0B0      LDI	R27,0
      5B E010      LDI	R17,0
      5C E000      LDI	R16,0
      5D BF0B      OUT	0x3B,R16
      5E 38EA      CPI	R30,0x8A
      5F 07F1      CPC	R31,R17
      60 F021      BEQ	0x0065
      61 95C8      LPM
      62 9631      ADIW	R30,1
      63 920D      ST	R0,X+
      64 CFF9      RJMP	0x005E
      65 940E 011B CALL	_main
_exit:
      67 CFFF      RJMP	_exit
FILE: C:\DOCUME~1\wdd\MYDOCU~1\12864-7920液晶\12864-7920.c
(0001) //12864液晶的试验程序,驱动芯片为ST7920
(0002) //目标板为DDC-16A
(0003) //驱动方式-并口
(0004) //JP10短路块位于右侧,JP1两个短路块均插好
(0005) //调节V0电位器调整对比度
(0006) //注意:因为厂家不同液晶的19脚和20脚(背光)有时会不同,导致背光不亮,需要注意。
(0007) 
(0008) #include <iom16v.h>
(0009) #include <string.h>
(0010) 
(0011) #define uchar unsigned char 
(0012) #define uint unsigned int 
(0013) 
(0014) #define RS (1<<5)
(0015) #define RW (1<<6)
(0016) #define EN (1<<7)
(0017) 
(0018) //延时函数
(0019) void s_ms(uint ms)
(0020) {
(0021) 	for(;ms>1;ms--);
_s_ms:
  ms                   --> R16
      68 C002      RJMP	0x006B
      69 5001      SUBI	R16,1
      6A 4010      SBCI	R17,0
      6B E081      LDI	R24,1
      6C E090      LDI	R25,0
      6D 1780      CP	R24,R16
      6E 0791      CPC	R25,R17
      6F F3C8      BCS	0x0069
      70 9508      RET
_WriteDataLCM:
  WDLCM                --> R10
      71 92AA      ST	R10,-Y
      72 2EA0      MOV	R10,R16
(0022) }	
(0023) 
(0024) //此处定义字符串
(0025) char text_1[]={"北京东控开发板"};
(0026) char text_2[]={"WWW.ISMCU.COM"};
(0027) char text_3[]={"WDD_CN@126.COM"};
(0028) char text_4[]={"QQ:621520"};
(0029) 
(0030) //写数据
(0031) void WriteDataLCM(unsigned char WDLCM)
(0032) {
(0033) 	//ReadStatusLCM(); //检测忙
(0034) 	s_ms(100);
      73 E604      LDI	R16,0x64
      74 E010      LDI	R17,0
      75 DFF2      RCALL	_s_ms
(0035) 	PORTA|=RS;       //RS=1    
      76 9ADD      SBI	0x1B,5
(0036) 	s_ms(100);
      77 E604      LDI	R16,0x64
      78 E010      LDI	R17,0
      79 DFEE      RCALL	_s_ms
(0037) 	PORTA&=~RW;      //RW=0
      7A 98DE      CBI	0x1B,6
(0038) 	s_ms(100);
      7B E604      LDI	R16,0x64
      7C E010      LDI	R17,0
      7D DFEA      RCALL	_s_ms
(0039) 	PORTA|=EN;       //EN=1
      7E 9ADF      SBI	0x1B,7
(0040) 	s_ms(100);
      7F E604      LDI	R16,0x64
      80 E010      LDI	R17,0
      81 DFE6      RCALL	_s_ms
(0041) 	PORTD=WDLCM;     //输出数据
      82 BAA2      OUT	0x12,R10
(0042) 	s_ms(100);
      83 E604      LDI	R16,0x64
      84 E010      LDI	R17,0
      85 DFE2      RCALL	_s_ms
(0043) 	PORTA&=~EN;      //EN=0
      86 98DF      CBI	0x1B,7
(0044) 	s_ms(100);
      87 E604      LDI	R16,0x64
      88 E010      LDI	R17,0
      89 DFDE      RCALL	_s_ms
      8A 90A9      LD	R10,Y+
      8B 9508      RET
_WriteCommandLCM:
  WCLCM                --> R10
      8C 92AA      ST	R10,-Y
      8D 2EA0      MOV	R10,R16
(0045) }
(0046) 
(0047) //写指令
(0048) void WriteCommandLCM(unsigned char WCLCM) 
(0049) {
(0050) 	//ReadStatusLCM(); //根据需要检测忙
(0051) 	s_ms(100);
      8E E604      LDI	R16,0x64
      8F E010      LDI	R17,0
      90 DFD7      RCALL	_s_ms
(0052) 	PORTA&=~RS;      //RS=0
      91 98DD      CBI	0x1B,5
(0053) 	s_ms(100);
      92 E604      LDI	R16,0x64
      93 E010      LDI	R17,0
      94 DFD3      RCALL	_s_ms
(0054) 	PORTA&=~RW;      //RW=0
      95 98DE      CBI	0x1B,6
(0055) 	s_ms(100);
      96 E604      LDI	R16,0x64
      97 E010      LDI	R17,0
      98 DFCF      RCALL	_s_ms
(0056) 	PORTA|=EN;       //EN=1
      99 9ADF      SBI	0x1B,7
(0057) 	s_ms(100);
      9A E604      LDI	R16,0x64
      9B E010      LDI	R17,0
      9C DFCB      RCALL	_s_ms
(0058) 	PORTD=WCLCM;     //输出指令
      9D BAA2      OUT	0x12,R10
(0059) 	s_ms(100);
      9E E604      LDI	R16,0x64
      9F E010      LDI	R17,0
      A0 DFC7      RCALL	_s_ms
(0060) 	PORTA&=~EN;      //EN=0
      A1 98DF      CBI	0x1B,7
(0061) 	s_ms(100);
      A2 E604      LDI	R16,0x64
      A3 E010      LDI	R17,0
      A4 DFC3      RCALL	_s_ms
      A5 90A9      LD	R10,Y+
      A6 9508      RET
_ReadStatusLCM:
  flag                 --> R20
  temp                 --> R10
      A7 92AA      ST	R10,-Y
      A8 934A      ST	R20,-Y
(0062) }
(0063) 
(0064) //读状态:检测忙
(0065) void ReadStatusLCM(void)
(0066) {
(0067) 	uchar temp;
(0068)     uchar flag = 1;
      A9 E041      LDI	R20,1
      AA C02A      RJMP	0x00D5
(0069)     while(flag==1)
(0070) 	{
(0071) 	    DDRD=0x00;      //端口A改为输入
      AB 2422      CLR	R2
      AC BA21      OUT	0x11,R2
(0072) 		PORTD=0xff;    
      AD EF8F      LDI	R24,0xFF
      AE BB82      OUT	0x12,R24
(0073) 		s_ms(100);
      AF E604      LDI	R16,0x64
      B0 E010      LDI	R17,0
      B1 DFB6      RCALL	_s_ms
(0074) 		PORTA&=~RS;     //RS=0
      B2 98DD      CBI	0x1B,5
(0075) 		s_ms(100);
      B3 E604      LDI	R16,0x64
      B4 E010      LDI	R17,0
      B5 DFB2      RCALL	_s_ms
(0076) 		PORTA|=RW;      //RW=1
      B6 9ADE      SBI	0x1B,6
(0077) 		s_ms(100);
      B7 E604      LDI	R16,0x64
      B8 E010      LDI	R17,0
      B9 DFAE      RCALL	_s_ms
(0078) 		PORTA|=EN;      //EN=1
      BA 9ADF      SBI	0x1B,7
(0079) 		s_ms(1000);
      BB EE08      LDI	R16,0xE8
      BC E013      LDI	R17,3
      BD DFAA      RCALL	_s_ms
(0080) 		temp = PIND;    //读端口A
      BE B2A0      IN	R10,0x10
(0081) 		s_ms(1000);
      BF EE08      LDI	R16,0xE8
      C0 E013      LDI	R17,3
      C1 DFA6      RCALL	_s_ms
(0082) 		DDRD=0xff;      //端口A改为
      C2 EF8F      LDI	R24,0xFF
      C3 BB81      OUT	0x11,R24
(0083) 		s_ms(100);
      C4 E604      LDI	R16,0x64
      C5 E010      LDI	R17,0
      C6 DFA1      RCALL	_s_ms
(0084) 		PORTA&=~EN;     //EN=0
      C7 98DF      CBI	0x1B,7
(0085) 		s_ms(100);
      C8 E604      LDI	R16,0x64
      C9 E010      LDI	R17,0
      CA DF9D      RCALL	_s_ms
(0086) 		if(temp>>7==0)
      CB 2C2A      MOV	R2,R10
      CC 9426      LSR	R2
      CD 9426      LSR	R2
      CE 9426      LSR	R2
      CF 9426      LSR	R2
      D0 9426      LSR	R2
      D1 9426      LSR	R2
      D2 9426      LSR	R2
      D3 F409      BNE	0x00D5
(0087) 		flag = 0;
      D4 2744      CLR	R20
      D5 3041      CPI	R20,1
      D6 F2A1      BEQ	0x00AB
      D7 9149      LD	R20,Y+
      D8 90A9      LD	R10,Y+
      D9 9508      RET
(0088) 	}
(0089) }
(0090) 
(0091) //LCM初始化
(0092) void LCMInit(void) 
(0093) {
(0094) 	WriteCommandLCM(0x38);    //三次显示模式设置,不检测忙信号
_LCMInit:
      DA E308      LDI	R16,0x38
      DB DFB0      RCALL	_WriteCommandLCM
(0095) 	s_ms(1000);
      DC EE08      LDI	R16,0xE8
      DD E013      LDI	R17,3
      DE DF89      RCALL	_s_ms
(0096) 	WriteCommandLCM(0x38);
      DF E308      LDI	R16,0x38
      E0 DFAB      RCALL	_WriteCommandLCM
(0097) 	s_ms(1000); 
      E1 EE08      LDI	R16,0xE8
      E2 E013      LDI	R17,3
      E3 DF84      RCALL	_s_ms
(0098) 	WriteCommandLCM(0x38);
      E4 E308      LDI	R16,0x38
      E5 DFA6      RCALL	_WriteCommandLCM
(0099) 	s_ms(1000); 
      E6 EE08      LDI	R16,0xE8
      E7 E013      LDI	R17,3
      E8 DF7F      RCALL	_s_ms
(0100) 	WriteCommandLCM(0x38);    //显示模式设置,开始要求每次检测忙信号
      E9 E308      LDI	R16,0x38
      EA DFA1      RCALL	_WriteCommandLCM
(0101) 	WriteCommandLCM(0x08);    //关闭显示
      EB E008      LDI	R16,0x8
      EC DF9F      RCALL	_WriteCommandLCM
(0102) 	WriteCommandLCM(0x01);    //显示清屏
      ED E001      LDI	R16,1
      EE DF9D      RCALL	_WriteCommandLCM
(0103) 	WriteCommandLCM(0x06);    //显示光标移动设置
      EF E006      LDI	R16,6
      F0 DF9B      RCALL	_WriteCommandLCM
(0104) 	WriteCommandLCM(0x0C);    //显示开及光标设置
      F1 E00C      LDI	R16,0xC
      F2 DF99      RCALL	_WriteCommandLCM
      F3 9508      RET
_DisplayList:
  p                    --> R14
  length               --> R14
  i                    --> R10
  DData                --> R12
  X                    --> R20
      F4 940E 0153 CALL	push_xgset30FC
      F6 0169      MOVW	R12,R18
      F7 2F40      MOV	R20,R16
(0105) }
(0106) 
(0107) //按指定位置显示一串字符
(0108) //液晶显示:汉字为16*16,字母及数字为8*16,此次显示的文本
(0109) //          从第一行第一列开始,依次向左,如果想在不同的
(0110) //          位置显示,只需修改相应的行值即可。液晶显示
(0111) //          完毕后,转入语音文本发送。
(0112) //DisplsyList(X,DData)函数:X为0x80在第一行显示;X为0x90在
(0113) //			第二行显示;X为0x88在第三行显示;X为0x98在
(0114) //			第四行显示;DData为显示数组。
(0115) void DisplayList(unsigned char X,char *DData)
(0116) {
(0117) 	unsigned char length;
(0118) 	unsigned char i=0;
      F8 24AA      CLR	R10
(0119) 	char *p;
(0120) 	p = DData;
      F9 0176      MOVW	R14,R12
(0121) 	length = strlen(p);
      FA 0187      MOVW	R16,R14
      FB 940E 013C CALL	_strlen
      FD 2EE0      MOV	R14,R16
(0122) 	WriteCommandLCM(0x08);
      FE E008      LDI	R16,0x8
      FF DF8C      RCALL	_WriteCommandLCM
(0123) 	WriteCommandLCM(X);
     100 2F04      MOV	R16,R20
     101 DF8A      RCALL	_WriteCommandLCM
(0124) 	WriteCommandLCM(0x06);
     102 E006      LDI	R16,6
     103 DF88      RCALL	_WriteCommandLCM
(0125) 	WriteCommandLCM(0x0C);
     104 E00C      LDI	R16,0xC
     105 DF86      RCALL	_WriteCommandLCM
(0126) 	WriteCommandLCM(X);
     106 2F04      MOV	R16,R20
     107 DF84      RCALL	_WriteCommandLCM
(0127) 	for(i=0;i<length;i++)
     108 C00E      RJMP	0x0117
(0128) 	{
(0129) 		WriteDataLCM(DData[i]);
     109 2DEA      MOV	R30,R10
     10A 27FF      CLR	R31
     10B 0DEC      ADD	R30,R12
     10C 1DFD      ADC	R31,R13
     10D 8100      LDD	R16,Z+0
     10E DF62      RCALL	_WriteDataLCM
(0130) 		i++;
     10F 94A3      INC	R10
(0131) 		WriteDataLCM(DData[i]);
     110 2DEA      MOV	R30,R10
     111 27FF      CLR	R31
     112 0DEC      ADD	R30,R12
     113 1DFD      ADC	R31,R13
     114 8100      LDD	R16,Z+0
     115 DF5B      RCALL	_WriteDataLCM
     116 94A3      INC	R10
     117 14AE      CP	R10,R14
     118 F380      BCS	0x0109
     119 940C 0148 JMP	pop_xgset30FC
(0132) 	}
(0133) }
(0134) 
(0135) //主函数
(0136) void main(void)
(0137) {
(0138)     //端口初始化
(0139) 	DDRA=0xff;
_main:
     11B EF8F      LDI	R24,0xFF
     11C BB8A      OUT	0x1A,R24
(0140) 	PORTA=0xff;
     11D BB8B      OUT	0x1B,R24
(0141) 	DDRB=0xff;
     11E BB87      OUT	0x17,R24
(0142) 	PORTB=0xff;
     11F BB88      OUT	0x18,R24
(0143) 	DDRD=0xff;
     120 BB81      OUT	0x11,R24
(0144) 	PORTD=0x00;
     121 2422      CLR	R2
     122 BA22      OUT	0x12,R2
(0145) 	
(0146) 	s_ms(200); 
     123 EC08      LDI	R16,0xC8
     124 E010      LDI	R17,0
     125 DF42      RCALL	_s_ms
(0147) 	s_ms(200);  
     126 EC08      LDI	R16,0xC8
     127 E010      LDI	R17,0
     128 DF3F      RCALL	_s_ms
(0148) 	LCMInit(); //LCM初始化   //液晶初始化
     129 DFB0      RCALL	_LCMInit
(0149) 
(0150)     DisplayList(0x80,text_1);     //显示第一行
     12A E620      LDI	R18,0x60
     12B E030      LDI	R19,0
     12C E800      LDI	R16,0x80
     12D DFC6      RCALL	_DisplayList
(0151) 	DisplayList(0x90,text_2);     //显示第二行
     12E E62F      LDI	R18,0x6F
     12F E030      LDI	R19,0
     130 E900      LDI	R16,0x90
     131 DFC2      RCALL	_DisplayList
(0152) 	DisplayList(0x88,text_3);     //显示第三行
     132 E72D      LDI	R18,0x7D
     133 E030      LDI	R19,0
     134 E808      LDI	R16,0x88
     135 DFBE      RCALL	_DisplayList
(0153) 	DisplayList(0x98,text_4);     //显示第四行
     136 E82C      LDI	R18,0x8C
     137 E030      LDI	R19,0
     138 E908      LDI	R16,0x98
     139 DFBA      RCALL	_DisplayList
(0154) 	while(1);
FILE: <library>
     13A CFFF      RJMP	0x013A
     13B 9508      RET
_strlen:
     13C 2FE0      MOV	R30,R16
     13D 2FF1      MOV	R31,R17
     13E 27AA      CLR	R26
     13F 27BB      CLR	R27
     140 9001      LD	R0,Z+
     141 2000      TST	R0
     142 F011      BEQ	0x0145
     143 9611      ADIW	R26,1
     144 CFFB      RJMP	0x0140
     145 2F0A      MOV	R16,R26
     146 2F1B      MOV	R17,R27
     147 9508      RET
pop_xgset30FC:
     148 90A9      LD	R10,Y+
     149 90B9      LD	R11,Y+
     14A 90C9      LD	R12,Y+
     14B 90D9      LD	R13,Y+
     14C 90E9      LD	R14,Y+
     14D 90F9      LD	R15,Y+
     14E 9149      LD	R20,Y+
     14F 9159      LD	R21,Y+
     150 9508      RET
push_xgsetF0FC:
     151 937A      ST	R23,-Y
     152 936A      ST	R22,-Y
push_xgset30FC:
     153 935A      ST	R21,-Y
     154 934A      ST	R20,-Y
push_xgset00FC:
     155 92FA      ST	R15,-Y
     156 92EA      ST	R14,-Y
push_xgset003C:
     157 92DA      ST	R13,-Y
     158 92CA      ST	R12,-Y
     159 92BA      ST	R11,-Y
     15A 92AA      ST	R10,-Y
     15B 9508      RET

⌨️ 快捷键说明

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