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

📄 project1.lst

📁 7920中文液晶显示屏 程序一般 7920的优点是有个汉字库
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0042 E5CF      LDI	R28,0x5F
    0043 E0D4      LDI	R29,4
    0044 BFCD      OUT	0x3D,R28
    0045 BFDE      OUT	0x3E,R29
    0046 51C0      SUBI	R28,0x10
    0047 40D0      SBCI	R29,0
    0048 EA0A      LDI	R16,0xAA
    0049 8308      STD	Y+0,R16
    004A 2400      CLR	R0
    004B E9E0      LDI	R30,0x90
    004C E0F0      LDI	R31,0
    004D E010      LDI	R17,0
    004E 39E0      CPI	R30,0x90
    004F 07F1      CPC	R31,R17
    0050 F011      BEQ	0x0053
    0051 9201      ST	R0,Z+
    0052 CFFB      RJMP	0x004E
    0053 8300      STD	Z+0,R16
    0054 E5E4      LDI	R30,0x54
    0055 E0F0      LDI	R31,0
    0056 E6A0      LDI	R26,0x60
    0057 E0B0      LDI	R27,0
    0058 E010      LDI	R17,0
    0059 38E4      CPI	R30,0x84
    005A 07F1      CPC	R31,R17
    005B F021      BEQ	0x0060
    005C 95C8      LPM
    005D 9631      ADIW	R30,1
    005E 920D      ST	R0,X+
    005F CFF9      RJMP	0x0059
    0060 940E00C4  CALL	_main
_exit:
    0062 CFFF      RJMP	_exit
FILE: E:\_opt\___7920_serial\source\7920.c
(0001) //本程序是7920的LM3037的液晶驱动程序
(0002) //汉字2x9
(0003) //ATMEGA16, 内部晶振8M  
(0004) //使用串行传输 
(0005) //本程序测试通过
(0006) 
(0007) //绿叶子整理 -- 2005.08.30
(0008) 
(0009) #include <iom16v.h>
(0010) #include <macros.h>
(0011) 
(0012) #define LCD_DATA_PORT  PORTA
(0013) #define LCD_DATA_DDR   DDRA
(0014) #define LCD_DATA_PIN   PINA
(0015) #define LCD_DATA       0x0ff   //portA   out
(0016) 
(0017) #define LCD_CONTROL_PORT    PORTB
(0018) #define LCD_CONTROL_DDR     DDRB
(0019) 
(0020) #define	RS	 0      //RS(CS) 可直接接VCC -- 替代
(0021) #define	RW	 1      //RW(SID) 
(0022) #define	E	 2      //E(sclk)
(0023) #define	PSB	 3      //可以直接接地  -- 替代
(0024) #define	_RES	 4  //可以去掉
(0025) 
(0026) /*--------------------------------------------------------------------------------------------------
(0027) Public function prototypes
(0028) --------------------------------------------------------------------------------------------------*/
(0029) void delay_1us(void);
(0030) void delay_1ms(void);
(0031) void delay_nus          (unsigned int n);
(0032) void delay_nms          (unsigned int n);
(0033) 
(0034) #define	SETBIT(x,y) (x|=(1<<y))      //set bit y in byte x
(0035) #define	CLRBIT(x,y) (x&=(~(1<<y)))   //clear bit y in byte x
(0036) #define	CHKBIT(x,y) (x&(1<<y))       //check bit y in byte x
(0037) 
(0038) #define uchar unsigned char // 0~255
(0039) #define uint unsigned int   // 0~65535
(0040) 
(0041) void  CheckState();
(0042) void initLCDM(void);
(0043) void Send(unsigned char senddata);
(0044) void SdCmd(unsigned char scmd);
(0045) void SdData(unsigned char DData); 
(0046) void WriteTextScreen(unsigned char *TxtData);
(0047) void WriteTextScreen2(unsigned char *pstr);
(0048) void WriteGraphicScreen(unsigned char *GDData);
(0049) 
(0050) void DispSetCursor(unsigned char LineNum, unsigned char ColumnNum);
(0051) 
(0052) unsigned char  TextLogo[]={"液晶显示模块(LCDM)"};
(0053) 
(0054) void initLCDM(void)
(0055) {
(0056) 	delay_nms(100);
_initLCDM:
    0063 E604      LDI	R16,0x64
    0064 E010      LDI	R17,0
    0065 D107      RCALL	_delay_nms
(0057) 
(0058)  	//端口初始化
(0059) 	//LCD_DATA_DDR=0xFF;
(0060) 	LCD_CONTROL_DDR=0xFF; 
    0066 EF8F      LDI	R24,0xFF
    0067 BB87      OUT	0x17,R24
(0061) 
(0062) 	CLRBIT(LCD_CONTROL_PORT,E);
    0068 98C2      CBI	0x18,2
(0063) 	CLRBIT(LCD_CONTROL_PORT,RW);
    0069 98C1      CBI	0x18,1
(0064) 	CLRBIT(LCD_CONTROL_PORT,RS);
    006A 98C0      CBI	0x18,0
(0065) 	CLRBIT(LCD_CONTROL_PORT,PSB);
    006B 98C3      CBI	0x18,3
(0066) 	
(0067) 	//LCD_DATA_PORT|=0x0;	
(0068) 	//delay_nms(1500);
(0069) 		
(0070) 	LCD_DATA_PORT|=0xFF;
    006C B38B      IN	R24,0x1B
    006D 6F8F      ORI	R24,0xFF
    006E BB8B      OUT	0x1B,R24
(0071) 		
(0072) 	//SETBIT(LCD_CONTROL_PORT,_RES);
(0073) 	CLRBIT(LCD_CONTROL_PORT,_RES);
    006F 98C4      CBI	0x18,4
(0074) 	delay_nms(1);
    0070 E001      LDI	R16,1
    0071 E010      LDI	R17,0
    0072 D0FA      RCALL	_delay_nms
(0075) 	SETBIT(LCD_CONTROL_PORT,_RES);
    0073 9AC4      SBI	0x18,4
(0076) 
(0077) 	SdCmd(0x20);    // 8bit I/F, basic command, graphic off
    0074 E200      LDI	R16,0x20
    0075 D026      RCALL	_SdCmd
(0078) 	SdCmd(0x20);    // 8bit I/F, basic command, graphic off
    0076 E200      LDI	R16,0x20
    0077 D024      RCALL	_SdCmd
(0079) 	SdCmd(0x0C);    // display on
    0078 E00C      LDI	R16,0xC
    0079 D022      RCALL	_SdCmd
(0080) 	SdCmd(0x06);    // cursor right shift
    007A E006      LDI	R16,6
    007B D020      RCALL	_SdCmd
(0081) 	SdCmd(0x01);    // cursor right shift
    007C E001      LDI	R16,1
    007D D01E      RCALL	_SdCmd
    007E 9508      RET
(0082) 
(0083) }
(0084) 
(0085) /*-----------------------------------------------------
(0086)   状态检查函数,判断是否处于忙状态
(0087) -------------------------------------------------------*/
(0088) void  CheckState()
(0089) {
(0090)  	unsigned char dat;
(0091)  	CLRBIT(LCD_CONTROL_PORT,RS);  //RS=0
_CheckState:
  dat                  --> Y+1
    007F 98C0      CBI	0x18,0
(0092)  	SETBIT(LCD_CONTROL_PORT,RW);  //RW=1
    0080 9AC1      SBI	0x18,1
(0093)  	LCD_DATA_DDR=0x00;			// portA as input
    0081 2422      CLR	R2
    0082 BA2A      OUT	0x1A,R2
(0094)  	do
(0095)  	{
(0096)  	   	SETBIT(LCD_CONTROL_PORT,E);
    0083 9AC2      SBI	0x18,2
(0097) 		NOP();
    0084 0000      NOP
(0098) 		CLRBIT(LCD_CONTROL_PORT,E);
    0085 98C2      CBI	0x18,2
(0099)     }
(0100)  	while (LCD_DATA_PIN&0x80);
    0086 99CF      SBIC	0x19,7
    0087 CFFB      RJMP	0x0083
    0088 9508      RET
_Send:
  i                    --> R20
  senddata             --> R16
    0089 940E01A2  CALL	push_gset1
(0101) }
(0102) 
(0103) void Send(unsigned char senddata)
(0104) {
(0105) 	unsigned char i;
(0106) 
(0107) 	for(i=0;i<8;i++)
    008B 2744      CLR	R20
    008C C00A      RJMP	0x0097
(0108) 	{
(0109) 		if((senddata)&0x80)
    008D FF07      SBRS	R16,7
    008E C002      RJMP	0x0091
(0110) 		{
(0111) 			//D_OUT=1	   ;	
(0112) 			SETBIT(LCD_CONTROL_PORT,RW);	
    008F 9AC1      SBI	0x18,1
(0113) 		}
    0090 C001      RJMP	0x0092
(0114) 		else
(0115) 		{
(0116) 			//D_OUT=0;	
(0117) 			CLRBIT(LCD_CONTROL_PORT,RW);		
    0091 98C1      CBI	0x18,1
(0118) 		}
(0119) 		
(0120) 		//SCK=1;
(0121) 		SETBIT(LCD_CONTROL_PORT,E);	
    0092 9AC2      SBI	0x18,2
(0122) 		NOP();
    0093 0000      NOP
(0123) 		//SCK=0;
(0124) 		CLRBIT(LCD_CONTROL_PORT,E);	
    0094 98C2      CBI	0x18,2
(0125) 		
(0126) 		senddata<<=1;
    0095 0F00      LSL	R16
    0096 9543      INC	R20
    0097 3048      CPI	R20,0x8
    0098 F3A0      BCS	0x008D
    0099 940E01A5  CALL	pop_gset1
    009B 9508      RET
_SdCmd:
  scmd                 --> R20
    009C 940E01A2  CALL	push_gset1
    009E 2F40      MOV	R20,R16
(0127) 	}
(0128) }
(0129) 
(0130) void SdCmd(unsigned char scmd)   //send command
(0131) {
(0132) 	//ST7920CS=1;
(0133) 	SETBIT(LCD_CONTROL_PORT,RS);
    009F 9AC0      SBI	0x18,0
(0134) 	Send(0xf8);
    00A0 EF08      LDI	R16,0xF8
    00A1 DFE7      RCALL	_Send
(0135) 	Send(scmd&0xf0);
    00A2 2F04      MOV	R16,R20
    00A3 7F00      ANDI	R16,0xF0
    00A4 DFE4      RCALL	_Send
(0136) 	Send(scmd<<4);	
    00A5 2F04      MOV	R16,R20
    00A6 700F      ANDI	R16,0xF
    00A7 9502      SWAP	R16
    00A8 DFE0      RCALL	_Send
(0137) 	
(0138) 	//ST7920CS=0;
(0139) 	SETBIT(LCD_CONTROL_PORT,RS);
    00A9 9AC0      SBI	0x18,0
(0140) 	delay_nus(20);
    00AA E104      LDI	R16,0x14
    00AB E010      LDI	R17,0
    00AC D0A7      RCALL	_delay_nus
    00AD 940E01A5  CALL	pop_gset1
    00AF 9508      RET
_SdData:
  DData                --> R20
    00B0 940E01A2  CALL	push_gset1
    00B2 2F40      MOV	R20,R16
(0141) 	
(0142) }
(0143) 
(0144) void SdData(unsigned char DData) 
(0145) {
(0146) 	//ST7920CS=1;
(0147) 	SETBIT(LCD_CONTROL_PORT,RS);
    00B3 9AC0      SBI	0x18,0
(0148) 	Send(0xfa);
    00B4 EF0A      LDI	R16,0xFA
    00B5 DFD3      RCALL	_Send
(0149) 	Send(DData&0xf0);
    00B6 2F04      MOV	R16,R20
    00B7 7F00      ANDI	R16,0xF0
    00B8 DFD0      RCALL	_Send
(0150) 	Send(DData<<4);	
    00B9 2F04      MOV	R16,R20
    00BA 700F      ANDI	R16,0xF
    00BB 9502      SWAP	R16
    00BC DFCC      RCALL	_Send
(0151) 	
(0152) 	//ST7920CS=0;
(0153) 	SETBIT(LCD_CONTROL_PORT,RS);
    00BD 9AC0      SBI	0x18,0
(0154) 	delay_nus(20);
    00BE E104      LDI	R16,0x14
    00BF E010      LDI	R17,0
    00C0 D093      RCALL	_delay_nus
    00C1 940E01A5  CALL	pop_gset1
    00C3 9508      RET
(0155) 	
(0156) }
(0157) 
(0158) void main(void)
(0159) {
(0160)  
(0161) 	CLI();                 // disable interrupts
_main:
    00C4 94F8      BCLR	7
(0162) 
(0163)    	initLCDM();
    00C5 DF9D      RCALL	_initLCDM
    00C6 C013      RJMP	0x00DA
(0164) 	
(0165) 	while(1)
(0166) 	{
(0167) 	SdCmd(0x20);          // 8bit I/F, basic command, graphic off
    00C7 E200      LDI	R16,0x20
    00C8 DFD3      RCALL	_SdCmd
(0168) 	SdCmd(0x01);          // clr text screen
    00C9 E001      LDI	R16,1
    00CA DFD1      RCALL	_SdCmd
(0169) 	delay_nms(100);
    00CB E604      LDI	R16,0x64
    00CC E010      LDI	R17,0
    00CD D09F      RCALL	_delay_nms
(0170) 	
(0171)     WriteTextScreen2(TextLogo);
    00CE E600      LDI	R16,0x60
    00CF E010      LDI	R17,0
    00D0 D035      RCALL	_WriteTextScreen2
(0172)    	delay_nms(1500);
    00D1 ED0C      LDI	R16,0xDC
    00D2 E015      LDI	R17,5
    00D3 D099      RCALL	_delay_nms
(0173) 
(0174)     WriteTextScreen2("世界你好12345678901234567890");
    00D4 E703      LDI	R16,0x73
    00D5 E010      LDI	R17,0
    00D6 D02F      RCALL	_WriteTextScreen2
(0175)    	delay_nms(1500);
    00D7 ED0C      LDI	R16,0xDC
    00D8 E015      LDI	R17,5
    00D9 D093      RCALL	_delay_nms
    00DA CFEC      RJMP	0x00C7
    00DB 9508      RET
_DispSetCursor:
  i                    --> R20
  ColumnNum            --> R22

⌨️ 快捷键说明

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