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

📄 1602.lst

📁 有关1602液晶显示的驱动函数
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
      53 EFCF      LDI	R28,0xFF
      54 E1D0      LDI	R29,0x10
      55 BFCD      OUT	0x3D,R28
      56 BFDE      OUT	0x3E,R29
      57 51CE      SUBI	R28,0x1E
      58 40D0      SBCI	R29,0
      59 EA0A      LDI	R16,0xAA
      5A 8308      STD	Y+0,R16
      5B 2400      CLR	R0
      5C E1E9      LDI	R30,0x19
      5D E0F1      LDI	R31,1
      5E E011      LDI	R17,1
      5F 31E9      CPI	R30,0x19
      60 07F1      CPC	R31,R17
      61 F011      BEQ	0x0064
      62 9201      ST	R0,Z+
      63 CFFB      RJMP	0x005F
      64 8300      STD	Z+0,R16
      65 E8EC      LDI	R30,0x8C
      66 E0F0      LDI	R31,0
      67 E0A0      LDI	R26,0
      68 E0B1      LDI	R27,1
      69 E010      LDI	R17,0
      6A E000      LDI	R16,0
      6B BF0B      OUT	0x3B,R16
      6C 3AE5      CPI	R30,0xA5
      6D 07F1      CPC	R31,R17
      6E F021      BEQ	0x0073
      6F 95C8      LPM
      70 9631      ADIW	R30,1
      71 920D      ST	R0,X+
      72 CFF9      RJMP	0x006C
      73 940E 028C CALL	_main
_exit:
      75 CFFF      RJMP	_exit
FILE: E:\产品\开发板\mega128-board\光盘\实验程序\1602液晶\1602.h
(0001) #define uchar unsigned char 
(0002) #define uint unsigned int 
(0003) 
(0004) #define RS 0
(0005) #define RW 1
(0006) #define EN 2
(0007) 
(0008) void s_ms(uint ms)
(0009) {
(0010) 	for(;ms>1;ms--);
_s_ms:
  ms                   --> R16
      76 C002      RJMP	0x0079
      77 5001      SUBI	R16,1
      78 4010      SBCI	R17,0
      79 E081      LDI	R24,1
      7A E090      LDI	R25,0
      7B 1780      CP	R24,R16
      7C 0791      CPC	R25,R17
      7D F3C8      BCS	0x0077
      7E 9508      RET
_busy:
  temp                 --> R20
      7F 934A      ST	R20,-Y
(0011) }	
(0012) 
(0013) //查忙
(0014) void busy(void)
(0015) {
(0016)     uchar temp;
(0017) 	s_ms(500);
      80 EF04      LDI	R16,0xF4
      81 E011      LDI	R17,1
      82 DFF3      RCALL	_s_ms
(0018) 	PORTG&=~(1<<RS);    //RS=0
      83 9180 0065 LDS	R24,0x0065
      85 7F8E      ANDI	R24,0xFE
      86 9380 0065 STS	0x0065,R24
(0019) 	s_ms(500);
      88 EF04      LDI	R16,0xF4
      89 E011      LDI	R17,1
      8A DFEB      RCALL	_s_ms
(0020) 	PORTG|=(1<<RW);     //RW=1
      8B 9180 0065 LDS	R24,0x0065
      8D 6082      ORI	R24,2
      8E 9380 0065 STS	0x0065,R24
(0021) 	s_ms(500);
      90 EF04      LDI	R16,0xF4
      91 E011      LDI	R17,1
      92 DFE3      RCALL	_s_ms
      93 C022      RJMP	0x00B6
(0022) 	while(temp)
(0023) 	{
(0024) 		PORTG|=(1<<EN); //EN=1
      94 9180 0065 LDS	R24,0x0065
      96 6084      ORI	R24,4
      97 9380 0065 STS	0x0065,R24
(0025) 		s_ms(500);
      99 EF04      LDI	R16,0xF4
      9A E011      LDI	R17,1
      9B DFDA      RCALL	_s_ms
(0026) 		DDRA=0x00;      //A口变输入
      9C 2422      CLR	R2
      9D BA2A      OUT	0x1A,R2
(0027) 		PORTA=0xff;     //上拉使能
      9E EF8F      LDI	R24,0xFF
      9F BB8B      OUT	0x1B,R24
(0028) 		s_ms(500);
      A0 EF04      LDI	R16,0xF4
      A1 E011      LDI	R17,1
      A2 DFD3      RCALL	_s_ms
(0029) 		temp = PINA&0x80;    //读取A口
      A3 B349      IN	R20,0x19
      A4 7840      ANDI	R20,0x80
(0030) 		s_ms(500);      
      A5 EF04      LDI	R16,0xF4
      A6 E011      LDI	R17,1
      A7 DFCE      RCALL	_s_ms
(0031) 		DDRA=0xff;      
      A8 EF8F      LDI	R24,0xFF
      A9 BB8A      OUT	0x1A,R24
(0032) 		PORTA=0xff;        //A口变输出
      AA BB8B      OUT	0x1B,R24
(0033) 		s_ms(500);
      AB EF04      LDI	R16,0xF4
      AC E011      LDI	R17,1
      AD DFC8      RCALL	_s_ms
(0034) 		PORTG&=~(1<<EN);   //EN=0
      AE 9180 0065 LDS	R24,0x0065
      B0 7F8B      ANDI	R24,0xFB
      B1 9380 0065 STS	0x0065,R24
(0035) 		s_ms(500);
      B3 EF04      LDI	R16,0xF4
      B4 E011      LDI	R17,1
      B5 DFC0      RCALL	_s_ms
      B6 2344      TST	R20
      B7 F6E1      BNE	0x0094
      B8 9149      LD	R20,Y+
      B9 9508      RET
_writecom:
  com                  --> R10
      BA 92AA      ST	R10,-Y
      BB 2EA0      MOV	R10,R16
(0036) 	}
(0037) }
(0038) 
(0039) //写指令
(0040) void writecom(uchar	com)
(0041) {
(0042) 	busy();
      BC DFC2      RCALL	_busy
(0043) 	s_ms(500);
      BD EF04      LDI	R16,0xF4
      BE E011      LDI	R17,1
      BF DFB6      RCALL	_s_ms
(0044) 	PORTG&=~(1<<RS);   //RS=0
      C0 9180 0065 LDS	R24,0x0065
      C2 7F8E      ANDI	R24,0xFE
      C3 9380 0065 STS	0x0065,R24
(0045) 	s_ms(500);
      C5 EF04      LDI	R16,0xF4
      C6 E011      LDI	R17,1
      C7 DFAE      RCALL	_s_ms
(0046) 	PORTG&=~(1<<RW);   //RW=0
      C8 9180 0065 LDS	R24,0x0065
      CA 7F8D      ANDI	R24,0xFD
      CB 9380 0065 STS	0x0065,R24
(0047) 	s_ms(500);
      CD EF04      LDI	R16,0xF4
      CE E011      LDI	R17,1
      CF DFA6      RCALL	_s_ms
(0048) 	PORTG|=(1<<EN);    //EN=1
      D0 9180 0065 LDS	R24,0x0065
      D2 6084      ORI	R24,4
      D3 9380 0065 STS	0x0065,R24
(0049) 	s_ms(500);
      D5 EF04      LDI	R16,0xF4
      D6 E011      LDI	R17,1
      D7 DF9E      RCALL	_s_ms
(0050) 	PORTA = com;       //输出指令
      D8 BAAB      OUT	0x1B,R10
(0051) 	s_ms(500);
      D9 EF04      LDI	R16,0xF4
      DA E011      LDI	R17,1
      DB DF9A      RCALL	_s_ms
(0052) 	PORTG&=~(1<<EN);   //EN=0
      DC 9180 0065 LDS	R24,0x0065
      DE 7F8B      ANDI	R24,0xFB
      DF 9380 0065 STS	0x0065,R24
(0053) 	s_ms(500);
      E1 EF04      LDI	R16,0xF4
      E2 E011      LDI	R17,1
      E3 DF92      RCALL	_s_ms
      E4 90A9      LD	R10,Y+
      E5 9508      RET
(0054) }
(0055) 
(0056) //1602初始化
(0057) void	LcdInit(void)
(0058) {
(0059) 	writecom(0x38);
_LcdInit:
      E6 E308      LDI	R16,0x38
      E7 DFD2      RCALL	_writecom
(0060) 	s_ms(1000);
      E8 EE08      LDI	R16,0xE8
      E9 E013      LDI	R17,3
      EA DF8B      RCALL	_s_ms
(0061) 	writecom(0x01);
      EB E001      LDI	R16,1
      EC DFCD      RCALL	_writecom
(0062) 	s_ms(10000);
      ED E100      LDI	R16,0x10
      EE E217      LDI	R17,0x27
      EF DF86      RCALL	_s_ms
(0063) 	s_ms(1000);
      F0 EE08      LDI	R16,0xE8
      F1 E013      LDI	R17,3
      F2 DF83      RCALL	_s_ms
(0064) 	s_ms(1000);
      F3 EE08      LDI	R16,0xE8
      F4 E013      LDI	R17,3
      F5 DF80      RCALL	_s_ms
(0065) 	s_ms(1000);
      F6 EE08      LDI	R16,0xE8
      F7 E013      LDI	R17,3
      F8 DF7D      RCALL	_s_ms
(0066) 	s_ms(1000);
      F9 EE08      LDI	R16,0xE8
      FA E013      LDI	R17,3
      FB DF7A      RCALL	_s_ms
(0067) 	s_ms(1000);
      FC EE08      LDI	R16,0xE8
      FD E013      LDI	R17,3
      FE DF77      RCALL	_s_ms
(0068) 	s_ms(1000);
      FF EE08      LDI	R16,0xE8
     100 E013      LDI	R17,3
     101 DF74      RCALL	_s_ms
(0069) 	writecom(0x02);
     102 E002      LDI	R16,2
     103 DFB6      RCALL	_writecom
(0070) 	s_ms(1000);
     104 EE08      LDI	R16,0xE8
     105 E013      LDI	R17,3
     106 DF6F      RCALL	_s_ms
(0071) 	writecom(0x06);
     107 E006      LDI	R16,6
     108 DFB1      RCALL	_writecom
(0072) 	s_ms(1000);
     109 EE08      LDI	R16,0xE8
     10A E013      LDI	R17,3
     10B DF6A      RCALL	_s_ms
(0073) 	writecom(0x0c);
     10C E00C      LDI	R16,0xC
     10D DFAC      RCALL	_writecom
(0074) 	s_ms(1000);
     10E EE08      LDI	R16,0xE8
     10F E013      LDI	R17,3
     110 DF65      RCALL	_s_ms
(0075) 	writecom(0x38);	
     111 E308      LDI	R16,0x38
     112 DFA7      RCALL	_writecom
(0076) 	s_ms(1000);
     113 EE08      LDI	R16,0xE8
     114 E013      LDI	R17,3
     115 DF60      RCALL	_s_ms
     116 9508      RET
_writedata:
  data                 --> R10
     117 92AA      ST	R10,-Y
     118 2EA0      MOV	R10,R16
(0077) }	
(0078) 
(0079) //写数据
(0080) void	writedata(uchar data)
(0081) {
(0082) 	busy();
     119 DF65      RCALL	_busy
(0083) 	s_ms(500);
     11A EF04      LDI	R16,0xF4
     11B E011      LDI	R17,1
     11C DF59      RCALL	_s_ms
(0084) 	PORTG|=(1<<RS);   //RS=1
     11D 9180 0065 LDS	R24,0x0065
     11F 6081      ORI	R24,1
     120 9380 0065 STS	0x0065,R24
(0085) 	s_ms(500);
     122 EF04      LDI	R16,0xF4
     123 E011      LDI	R17,1
     124 DF51      RCALL	_s_ms
(0086) 	PORTG&=~(1<<RW);   //RW=0
     125 9180 0065 LDS	R24,0x0065
     127 7F8D      ANDI	R24,0xFD
     128 9380 0065 STS	0x0065,R24
(0087) 	s_ms(500);
     12A EF04      LDI	R16,0xF4
     12B E011      LDI	R17,1
     12C DF49      RCALL	_s_ms
(0088) 	PORTG|=(1<<EN);    //EN=1
     12D 9180 0065 LDS	R24,0x0065
     12F 6084      ORI	R24,4
     130 9380 0065 STS	0x0065,R24
(0089) 	s_ms(500);
     132 EF04      LDI	R16,0xF4
     133 E011      LDI	R17,1
     134 DF41      RCALL	_s_ms
(0090) 	PORTA = data;      //输出数据
     135 BAAB      OUT	0x1B,R10
(0091) 	s_ms(500);
     136 EF04      LDI	R16,0xF4
     137 E011      LDI	R17,1
     138 DF3D      RCALL	_s_ms
(0092) 	PORTG&=~(1<<EN);   //EN=0
     139 9180 0065 LDS	R24,0x0065
     13B 7F8B      ANDI	R24,0xFB
     13C 9380 0065 STS	0x0065,R24
(0093) 	s_ms(500);
     13E EF04      LDI	R16,0xF4
     13F E011      LDI	R17,1
     140 DF35      RCALL	_s_ms
     141 90A9      LD	R10,Y+
     142 9508      RET
_readdata:
  temp                 --> R10
     143 92AA      ST	R10,-Y
(0094) }
(0095) 
(0096) 
(0097) //读数据
(0098) uchar	readdata(void)
(0099) {
(0100) 	uchar temp;
(0101) 	busy();
     144 DF3A      RCALL	_busy
(0102) 	s_ms(500);
     145 EF04      LDI	R16,0xF4
     146 E011      LDI	R17,1
     147 DF2E      RCALL	_s_ms
(0103) 	PORTG|=(1<<RS);  //RS=1
     148 9180 0065 LDS	R24,0x0065
     14A 6081      ORI	R24,1
     14B 9380 0065 STS	0x0065,R24
(0104) 	s_ms(500);
     14D EF04      LDI	R16,0xF4
     14E E011      LDI	R17,1
     14F DF26      RCALL	_s_ms
(0105) 	PORTG|=(1<<RW);  //RW=1
     150 9180 0065 LDS	R24,0x0065
     152 6082      ORI	R24,2
     153 9380 0065 STS	0x0065,R24
(0106) 	s_ms(500);
     155 EF04      LDI	R16,0xF4
     156 E011      LDI	R17,1
     157 DF1E      RCALL	_s_ms
(0107) 	PORTG|=(1<<EN);  //EN=1
     158 9180 0065 LDS	R24,0x0065
     15A 6084      ORI	R24,4
     15B 9380 0065 STS	0x0065,R24
(0108) 	s_ms(500);
     15D EF04      LDI	R16,0xF4
     15E E011      LDI	R17,1
     15F DF16      RCALL	_s_ms
(0109) 	DDRA=0x00;       //A端口变输入
     160 2422      CLR	R2
     161 BA2A      OUT	0x1A,R2
(0110) 	s_ms(500);
     162 EF04      LDI	R16,0xF4
     163 E011      LDI	R17,1
     164 DF11      RCALL	_s_ms
(0111) 	temp = PINA;     //读A端口
     165 B2A9      IN	R10,0x19
(0112) 	s_ms(500);
     166 EF04      LDI	R16,0xF4
     167 E011      LDI	R17,1
     168 DF0D      RCALL	_s_ms
(0113) 	DDRA=0xff;       //A端口变输出
     169 EF8F      LDI	R24,0xFF
     16A BB8A      OUT	0x1A,R24
(0114) 	s_ms(500);
     16B EF04      LDI	R16,0xF4
     16C E011      LDI	R17,1
     16D DF08      RCALL	_s_ms
(0115) 	PORTG&=~(1<<EN); //EN=0
     16E 9180 0065 LDS	R24,0x0065
     170 7F8B      ANDI	R24,0xFB
     171 9380 0065 STS	0x0065,R24
(0116) 	s_ms(500);
     173 EF04      LDI	R16,0xF4
     174 E011      LDI	R17,1
     175 DF00      RCALL	_s_ms
(0117) 	return temp;	
     176 2D0A      MOV	R16,R10
     177 90A9      LD	R10,Y+
     178 9508      RET
_WriteCGRAM:
  t                    --> R10
  i                    --> R20
  pBuffer              --> R22
  num                  --> R10
     179 940E 02AD CALL	push_xgsetF00C
     17B 01B9      MOVW	R22,R18
     17C 0158      MOVW	R10,R16
(0118) }
(0119) 
(0120) //=================================================
(0121) // 描述: 写LCD内部CGRAM函数
(0122) // 入口: ‘num’要写的数据个数
(0123) //        ‘pbuffer’要写的数据的首地址
(0124) // 出口: 无
(0125) //================================================
(0126) void	WriteCGRAM(uint	num, const uint	*pBuffer)
(0127) {
(0128) 	uint	i,t;
(0129) 	writecom(0x40);
     17D E400      LDI	R16,0x40
     17E DF3B      RCALL	_writecom
(0130) 	PORTG|=(1<<RS);
     17F 9180 0065 LDS	R24,0x0065
     181 6081      ORI	R24,1
     182 9380 0065 STS	0x0065,R24
(0131) 	PORTG&=~(1<<RW);
     184 9180 0065 LDS	R24,0x0065
     186 7F8D      ANDI	R24,0xFD
     187 9380 0065 STS	0x0065,R24
(0132) 	for(i=num;i!=0;i--)
     189 01A5      MOVW	R20,R10
     18A C012      RJMP	0x019D
(0133) 	{

⌨️ 快捷键说明

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