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