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

📄 lcd12864.lst

📁 用proteus仿真AVR单片机12864LCD,实现波形的实时显示。
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    0D3E E5CF      LDI	R28,0x5F
    0D3F E0D4      LDI	R29,4
    0D40 BFCD      OUT	0x3D,R28
    0D41 BFDE      OUT	0x3E,R29
    0D42 51C0      SUBI	R28,0x10
    0D43 40D0      SBCI	R29,0
    0D44 EA0A      LDI	R16,0xAA
    0D45 8308      STD	Y+0,R16
    0D46 2400      CLR	R0
    0D47 E6E5      LDI	R30,0x65
    0D48 E0F0      LDI	R31,0
    0D49 E010      LDI	R17,0
    0D4A 36E9      CPI	R30,0x69
    0D4B 07F1      CPC	R31,R17
    0D4C F011      BEQ	0x0D4F
    0D4D 9201      ST	R0,Z+
    0D4E CFFB      RJMP	0x0D4A
    0D4F 8300      STD	Z+0,R16
    0D50 E7E6      LDI	R30,0x76
    0D51 E1FA      LDI	R31,0x1A
    0D52 E6A0      LDI	R26,0x60
    0D53 E0B0      LDI	R27,0
    0D54 E11A      LDI	R17,0x1A
    0D55 37EB      CPI	R30,0x7B
    0D56 07F1      CPC	R31,R17
    0D57 F021      BEQ	0x0D5C
    0D58 95C8      LPM
    0D59 9631      ADIW	R30,1
    0D5A 920D      ST	R0,X+
    0D5B CFF9      RJMP	0x0D55
    0D5C 940E1081  CALL	_main
_exit:
    0D5E CFFF      RJMP	_exit
FILE: D:\练习\LCD显示12864\LCD12864.h
(0001) /**************************************************************************
(0002)   
(0003)                    		THE AMPIRE_12864 GRAPHIC LCD LIB
(0004)   
(0005)              		COPYRIGHT (c)   2007 BY zyg.
(0006)                        		--  ALL RIGHTS RESERVED  --
(0007)   
(0008)    File Name:       LCD12864.h
(0009)    Author:          zhuyiguo
(0010)    Created:         2007/4/27
(0011)    Finish:          2007/5/3
(0012)    Modified:		NO
(0013)    Revision: 		1.0
(0014)   
(0015) ***************************************************************************/
(0016) #ifndef LCD_CHAR_1602_2007_4_27
(0017) #define LCD_CHAR_1602_2007_4_27
(0018) #include <iom16v.h>
(0019) #include <macros.h>
(0020) #include "LCD12864_DATA.h"
(0021) 
(0022) //*****************************************************************
(0023) //控制脚定义
(0024) #pragma data:data
(0025) #define CSC1_1 asm("sbi 0x15,0")
(0026) #define CSC1_0 asm("cbi 0x15,0")
(0027) #define CSC2_1 asm("sbi 0x15,1")
(0028) #define CSC2_0 asm("cbi 0x15,1")
(0029) #define RS_D asm("sbi 0x15,2")
(0030) #define RS_I asm("cbi 0x15,2")
(0031) #define	RW_R asm("sbi 0x15,3")
(0032) #define RW_W asm("cbi 0x15,3")
(0033) #define E_1 asm("sbi 0x15,4")
(0034) #define E_0 asm("cbi 0x15,4")
(0035) //****************************************************************
(0036) #define uchar unsigned char
(0037) #define uint unsigned int
(0038) const uchar *p_to_flash; //指向程序存储区的指针,用来指向字模表
(0039) uchar hanzi_flag=1,graphy_flag=0,graphy_num=0;
(0040) uchar enter=0,flash_flag=0;
(0041) uint adc_value;
(0042) 
(0043) //*****************************************************************
(0044) void port_init(void)
(0045) {
(0046)  PORTA = 0x00;
_port_init:
    0D5F 2422      CLR	R2
    0D60 BA2B      OUT	0x1B,R2
(0047)  DDRA  = 0x00;
    0D61 BA2A      OUT	0x1A,R2
(0048)  PORTB = 0x00;
    0D62 BA28      OUT	0x18,R2
(0049)  DDRB  = 0x00;
    0D63 BA27      OUT	0x17,R2
(0050)  PORTC = 0x00; //m103 output only
    0D64 BA25      OUT	0x15,R2
(0051)  DDRC  = 0x1F;
    0D65 E18F      LDI	R24,0x1F
    0D66 BB84      OUT	0x14,R24
(0052)  PORTD = 0x00;
    0D67 BA22      OUT	0x12,R2
(0053)  DDRD  = 0xe0;
    0D68 EE80      LDI	R24,0xE0
    0D69 BB81      OUT	0x11,R24
    0D6A 9508      RET
(0054) }
(0055) 
(0056) //Watchdog initialize
(0057) // prescale: 2048K
(0058) void watchdog_init(void)
(0059) {
(0060)  WDR(); //this prevents a timout on enabling
_watchdog_init:
    0D6B 95A8      WDR
(0061)  WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
    0D6C E08F      LDI	R24,0xF
    0D6D BD81      OUT	0x21,R24
    0D6E 9508      RET
(0062) }
(0063) //*****************************
(0064) void timer1_init(void)
(0065) {
(0066)  TCCR1B = 0x00; //stop
_timer1_init:
    0D6F 2422      CLR	R2
    0D70 BC2E      OUT	0x2E,R2
(0067)  TCNT1H = 0xF3; //setup
    0D71 EF83      LDI	R24,0xF3
    0D72 BD8D      OUT	0x2D,R24
(0068)  TCNT1L = 0xCB;
    0D73 EC8B      LDI	R24,0xCB
    0D74 BD8C      OUT	0x2C,R24
(0069)  //OCR1AH = 0x3D;
(0070)  //OCR1AL = 0x09;
(0071)  //OCR1BH = 0x3D;
(0072)  //OCR1BL = 0x09;
(0073)  //OCR1CH = $OCR1CH$;
(0074)  //OCR1CL = $OCR1CL$;
(0075)  //ICR1H  = 0x3D;
(0076)  //ICR1L  = 0x09;
(0077)  TCCR1A = 0x00;
    0D75 BC2F      OUT	0x2F,R2
(0078)  TCCR1B = 0x04; //start Timer
    0D76 E084      LDI	R24,4
    0D77 BD8E      OUT	0x2E,R24
    0D78 9508      RET
(0079) }
(0080) 
(0081) //ADC initialize
(0082) // Conversion time: 52uS
(0083) void adc_init(void)
(0084) {
(0085)  ADCSRA = 0x00; //disable adc
_adc_init:
    0D79 2422      CLR	R2
    0D7A B826      OUT	0x06,R2
(0086)  ADMUX = 0x00; //select adc input 0
    0D7B B827      OUT	0x07,R2
(0087)  ACSR  = 0x80;
    0D7C E880      LDI	R24,0x80
    0D7D B988      OUT	0x08,R24
(0088)  ADCSRA = 0xCD;
    0D7E EC8D      LDI	R24,0xCD
    0D7F B986      OUT	0x06,R24
    0D80 9508      RET
(0089) }
(0090) 
(0091) //call this routine to initialize all peripherals
(0092) void init_devices(void)
(0093) {
(0094)  //stop errant interrupts until set up
(0095)  CLI(); //disable all interrupts
_init_devices:
    0D81 94F8      BCLR	7
(0096)  port_init();
    0D82 DFDC      RCALL	_port_init
(0097)  watchdog_init();
    0D83 DFE7      RCALL	_watchdog_init
(0098)  timer1_init();
    0D84 DFEA      RCALL	_timer1_init
(0099)  //adc_init();
(0100) 
(0101)  MCUCR = 0x00;
    0D85 2422      CLR	R2
    0D86 BE25      OUT	0x35,R2
(0102)  GICR  = 0xc0;
    0D87 EC80      LDI	R24,0xC0
    0D88 BF8B      OUT	0x3B,R24
(0103)  TIMSK = 0x04; //timer interrupt sources
    0D89 E084      LDI	R24,4
    0D8A BF89      OUT	0x39,R24
(0104)  SEI(); //re-enable interrupts
    0D8B 9478      BSET	7
    0D8C 9508      RET
(0105)  //all peripherals are now initialized
(0106) }
(0107) 
(0108) //******************************************************************
(0109) //延时函数
(0110) void delay_us(int time)//微妙级延时函数
(0111) {
(0112)  WDR();
_delay_us:
  time                 --> R16
    0D8D 95A8      WDR
    0D8E C008      RJMP	0x0D97
(0113)  while(time--)
(0114)  {
(0115)   NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
    0D8F 0000      NOP
    0D90 0000      NOP
    0D91 0000      NOP
    0D92 0000      NOP
    0D93 0000      NOP
    0D94 0000      NOP
    0D95 0000      NOP
    0D96 0000      NOP
    0D97 0118      MOVW	R2,R16
    0D98 5001      SUBI	R16,1
    0D99 4010      SBCI	R17,0
    0D9A 2022      TST	R2
    0D9B F799      BNE	0x0D8F
    0D9C 2033      TST	R3
    0D9D F789      BNE	0x0D8F
    0D9E 9508      RET
_delay_ms:
  time                 --> R20
    0D9F 940E135E  CALL	push_gset1
    0DA1 01A8      MOVW	R20,R16
(0116)  }
(0117) }
(0118) void delay_ms(int time)//毫秒级延时函数
(0119) {
(0120)   WDR();
    0DA2 95A8      WDR
    0DA3 C003      RJMP	0x0DA7
(0121)  while(time--)
(0122)   {
(0123)    delay_us(1000);
    0DA4 EE08      LDI	R16,0xE8
    0DA5 E013      LDI	R17,3
    0DA6 DFE6      RCALL	_delay_us
    0DA7 011A      MOVW	R2,R20
    0DA8 5041      SUBI	R20,1
    0DA9 4050      SBCI	R21,0
    0DAA 2022      TST	R2
    0DAB F7C1      BNE	0x0DA4
    0DAC 2033      TST	R3
    0DAD F7B1      BNE	0x0DA4
(0124)   }
(0125)   WDR();
    0DAE 95A8      WDR
    0DAF 940E1361  CALL	pop_gset1
    0DB1 9508      RET
_lcd_read_code:
  code                 --> R20
    0DB2 940E135E  CALL	push_gset1
(0126) }
(0127) //********************************************************************
(0128) //读LCD12864状态字
(0129) unsigned char lcd_read_code(void)
(0130) {
(0131)  unsigned char code;
(0132)  DDRA=0x00;
    0DB4 2422      CLR	R2
    0DB5 BA2A      OUT	0x1A,R2
(0133)  RS_I;
    0DB6 98AA      CBI	0x15,2
(0134)  NOP();
    0DB7 0000      NOP
(0135)  RW_R;
    0DB8 9AAB      SBI	0x15,3
(0136)  NOP();
    0DB9 0000      NOP
(0137)  code=PINB;
    0DBA B346      IN	R20,0x16
(0138)  E_1;
    0DBB 9AAC      SBI	0x15,4
(0139)  delay_us(1); 
    0DBC E001      LDI	R16,1
    0DBD E010      LDI	R17,0
    0DBE DFCE      RCALL	_delay_us
(0140)  E_0;
    0DBF 98AC      CBI	0x15,4
(0141)  DDRA=0xff;
    0DC0 EF8F      LDI	R24,0xFF
    0DC1 BB8A      OUT	0x1A,R24
(0142)  return code;
    0DC2 2F04      MOV	R16,R20
    0DC3 940E1361  CALL	pop_gset1
    0DC5 9508      RET
(0143)   //WDR();
(0144) }
(0145) 
(0146) //*******************************************************************
(0147) //判断LCD是否为忙状态
(0148) void judgebusy(void)
(0149) {
_judgebusy:
    0DC6 C001      RJMP	0x0DC8
(0150)  //unsigned char t;
(0151)  //t=lcd_read_code();
(0152)  while(((lcd_read_code())&0x80)==0x80)
(0153)  {
(0154)   //t=lcd_read_code();
(0155)   //if((t&0x80)!=0x80) break;
(0156)   WDR();
    0DC7 95A8      WDR
    0DC8 DFE9      RCALL	_lcd_read_code
    0DC9 2E20      MOV	R2,R16
    0DCA 2433      CLR	R3
    0DCB FC27      SBRC	R2,7
    0DCC CFFA      RJMP	0x0DC7
    0DCD 9508      RET
_lcd_write_data:
  data                 --> R20
    0DCE 940E135E  CALL	push_gset1
    0DD0 2F40      MOV	R20,R16
(0157)  }
(0158) }
(0159) 
(0160) //写显示数据*******************************************************************
(0161) void lcd_write_data(unsigned char data)
(0162) {
(0163)  WDR();
    0DD1 95A8      WDR
(0164)  DDRB=0xff;
    0DD2 EF8F      LDI	R24,0xFF
    0DD3 BB87      OUT	0x17,R24
(0165)  RS_D; 
    0DD4 9AAA      SBI	0x15,2
(0166)  NOP(); 
    0DD5 0000      NOP
(0167)  RW_W; 
    0DD6 98AB      CBI	0x15,3
(0168)  NOP();
    0DD7 0000      NOP
(0169)  PORTB=data;
    0DD8 BB48      OUT	0x18,R20
(0170)  E_1;          
    0DD9 9AAC      SBI	0x15,4
(0171)  //judgebusy();
(0172)  delay_us(1); 
    0DDA E001      LDI	R16,1
    0DDB E010      LDI	R17,0
    0DDC DFB0      RCALL	_delay_us
(0173)  E_0; 
    0DDD 98AC      CBI	0x15,4
(0174)  DDRB=0x00;
    0DDE 2422      CLR	R2
    0DDF BA27      OUT	0x17,R2
(0175)  WDR();
    0DE0 95A8      WDR
    0DE1 940E1361  CALL	pop_gset1
    0DE3 9508      RET
_lcd_write_code:
  code                 --> R20
    0DE4 940E135E  CALL	push_gset1
    0DE6 2F40      MOV	R20,R16
(0176) }
(0177) 
(0178) //写状态字********************************************************************
(0179) void lcd_write_code(unsigned char code)
(0180) {
(0181)  WDR();
    0DE7 95A8      WDR
(0182)  DDRB=0xff; 
    0DE8 EF8F      LDI	R24,0xFF
    0DE9 BB87      OUT	0x17,R24
(0183)  RS_I; 
    0DEA 98AA      CBI	0x15,2
(0184)  NOP();
    0DEB 0000      NOP
(0185)  RW_W;
    0DEC 98AB      CBI	0x15,3
(0186)  NOP(); 
    0DED 0000      NOP
(0187)  PORTB=code;
    0DEE BB48      OUT	0x18,R20
(0188)  E_1;
    0DEF 9AAC      SBI	0x15,4
(0189)  //judgebusy(); 
(0190)  delay_us(1);  
    0DF0 E001      LDI	R16,1
    0DF1 E010      LDI	R17,0
    0DF2 DF9A      RCALL	_delay_us
(0191)  E_0; 
    0DF3 98AC      CBI	0x15,4
(0192)  DDRB=0x00;
    0DF4 2422      CLR	R2
    0DF5 BA27      OUT	0x17,R2
(0193)  WDR();
    0DF6 95A8      WDR
    0DF7 940E1361  CALL	pop_gset1
    0DF9 9508      RET
_dis_one_zi:
  column               --> R22
  row                  --> R10
  i                    --> R20
  po_to_flash          --> R12
  y_add                --> R20
  x_add                --> R22
    0DFA 940E1358  CALL	push_gset4
    0DFC 2F42      MOV	R20,R18
    0DFD 2F60      MOV	R22,R16
    0DFE 84C8      LDD	R12,Y+8
    0DFF 84D9      LDD	R13,Y+9
(0194) }
(0195) 
(0196) //**************************************************************
(0197) //写一个汉字
(0198) void dis_one_zi(uchar x_add,uchar y_add,const uchar *po_to_flash) 
(0199)                
(0200) { 
(0201)   
(0202)   uchar i,row,column; 
(0203)   row=x_add*2+0xb8;
    0E00 E082      LDI	R24,2
    0E01 9F86      MUL	R24,R22
    0E02 2D80      MOV	R24,R0
    0E03 5488      SUBI	R24,0x48
    0E04 2EA8      MOV	R10,R24
(0204)   column=(y_add<4?y_add:y_add-4)*16+0x40; //左右半屏判断, 
    0E05 3044      CPI	R20,4
    0E06 F418      BCC	0x0E0A
    0E07 2F64      MOV	R22,R20
    0E08 2777      CLR	R23
    0E09 C004      RJMP	0x0E0E
    0E0A 2F64      MOV	R22,R20
    0E0B 2777      CLR	R23
    0E0C 5064      SUBI	R22,4
    0E0D 4070      SBCI	R23,0
    0E0E E100      LDI	R16,0x10
    0E0F E010      LDI	R17,0
    0E10 019B      MOVW	R18,R22
    0E11 940E133A  CALL	empy16s

⌨️ 快捷键说明

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