📄 project1.lst
字号:
__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 + -