📄 second.lst
字号:
(0105) void lcd_write_data(unsigned char char_data)
(0106) {
(0107) wait_enable();//等待LCD空闲
00E4 D00A RCALL _wait_enable
(0108) lcd_control_port|=lcd_RS;//RS=1
00E5 9ADE SBI 0x1B,6
(0109) lcd_control_port&=~lcd_RW;//RW=0
00E6 98DD CBI 0x1B,5
(0110) lcd_control_port&=~lcd_EN;//E=0,下面给LCD一个高脉冲
00E7 98DC CBI 0x1B,4
(0111) NOP();
00E8 0000 NOP
(0112) lcd_control_port|=lcd_EN;//E=1
00E9 9ADC SBI 0x1B,4
(0113) lcd_data_port=char_data;
00EA BB48 OUT 0x18,R20
(0114) lcd_control_port&=~lcd_EN;//重设E=0
00EB 98DC CBI 0x1B,4
(0115) }
00EC 940E0155 CALL pop_gset1
00EE 9508 RET
(0116)
(0117) //正常读写操作之前必须检测LCD控制器状态:E=1 RS=0 RW=1;DB7: 0 LCD控制器空闲,1 LCD控制器忙。
(0118) //检测忙信号,等待LCD空闲函数
(0119) void wait_enable(void)
(0120) {
(0121) lcd_busy_ddr&=~busy;//设置busy口为输入
_wait_enable:
00EF 98BF CBI 0x17,7
(0122) lcd_control_port&=~lcd_RS;//RS=0
00F0 98DE CBI 0x1B,6
(0123) lcd_control_port|=lcd_RW;//RW=1
00F1 9ADD SBI 0x1B,5
(0124) NOP();
00F2 0000 NOP
(0125) lcd_control_port|=lcd_EN;//E=1
00F3 9ADC SBI 0x1B,4
(0126) while(lcd_busy_pin&busy);//等待LCD_DB7为0
00F4 99B7 SBIC 0x16,7
00F5 CFFE RJMP 0x00F4
(0127) lcd_control_port&=~lcd_EN;//重设E=0
00F6 98DC CBI 0x1B,4
(0128) lcd_busy_ddr|=busy;//设置busy口为输出
00F7 9ABF SBI 0x17,7
(0129) }
00F8 9508 RET
FILE: D:\mega16学习板资料\例程\m16\1602\second.c
(0001) //ICC-AVR application builder : 2006-12-22 20:34:51
(0002) // Target : M8
(0003) // Crystal: 6.0000Mhz
(0004) //1602占用了PB口作为数据口,PA6,PA5,PA4分别是RS,WR,E
(0005) //按纽采用循环检测方式工作,不采用中断方式.
(0006)
(0007)
(0008) #include <iom16v.h>
(0009) #include <macros.h>
(0010) #include "1602.h"
(0011) unsigned char led_buff[]="qian ru shi LM! ";
(0012) unsigned char str1[]="www.ourembed.com";
(0013)
(0014)
(0015) void timer1_init(void);
(0016) void init_devices(void);
(0017) unsigned char KeyPress(void);
(0018) void delay_ms(unsigned int time);
(0019) void StartCount(void);
(0020) void StopCount(void);
(0021) void Clear(void);
(0022) unsigned int hour=0,minute=0,second=0,ms=0;
(0023) unsigned char c_next=0,choose=0;
(0024)
(0025) void port_init(void)
(0026) {
(0027) PORTB = 0xFF;
_port_init:
00F9 EF8F LDI R24,0xFF
00FA BB88 OUT 0x18,R24
(0028) DDRB = 0xFF;
00FB BB87 OUT 0x17,R24
(0029) PORTC = 0xFF; //m103 output only
00FC BB85 OUT 0x15,R24
(0030) DDRC = 0xFF;
00FD BB84 OUT 0x14,R24
(0031) PORTD = 0xFF;
00FE BB82 OUT 0x12,R24
(0032) DDRD = 0xFF;
00FF BB81 OUT 0x11,R24
(0033) }
0100 9508 RET
(0034)
(0035) //TIMER1 initialisation - prescale:8
(0036) // WGM: 0) Normal, TOP=0xFFFF
(0037) // desired value: 1mSec
(0038) // actual value: 1.000mSec (0.0%)
(0039) void timer1_init(void)
(0040) {
(0041) TCCR1B = 0x00; //stop
_timer1_init:
0101 2422 CLR R2
0102 BC2E OUT 0x2E,R2
(0042) TCNT1H = 0x63; //setup
0103 E683 LDI R24,0x63
0104 BD8D OUT 0x2D,R24
(0043) TCNT1L = 0xc0;
0105 EC80 LDI R24,0xC0
0106 BD8C OUT 0x2C,R24
(0044) OCR1AH = 0x17;
0107 E187 LDI R24,0x17
0108 BD8B OUT 0x2B,R24
(0045) OCR1AL = 0x70;
0109 E780 LDI R24,0x70
010A BD8A OUT 0x2A,R24
(0046) OCR1BH = 0x17;
010B E187 LDI R24,0x17
010C BD89 OUT 0x29,R24
(0047) OCR1BL = 0x70;
010D E780 LDI R24,0x70
010E BD88 OUT 0x28,R24
(0048) ICR1H = 0x17;
010F E187 LDI R24,0x17
0110 BD87 OUT 0x27,R24
(0049) ICR1L = 0x70;
0111 E780 LDI R24,0x70
0112 BD86 OUT 0x26,R24
(0050) TCCR1A = 0x00;
0113 BC2F OUT 0x2F,R2
(0051) TCCR1B = 0x00; //start Timer
0114 BC2E OUT 0x2E,R2
(0052) }
0115 9508 RET
_timer1_ovf_isr:
0116 938A ST R24,-Y
0117 B78F IN R24,0x3F
0118 938A ST R24,-Y
(0053)
(0054) #pragma interrupt_handler timer1_ovf_isr:9
(0055) void timer1_ovf_isr(void)
(0056) {
(0057) //TIMER1 has overflowed
(0058) TCNT1H = 0x63; //reload counter high value
0119 E683 LDI R24,0x63
011A BD8D OUT 0x2D,R24
(0059) TCNT1L = 0xc0; //reload counter low value
011B EC80 LDI R24,0xC0
011C BD8C OUT 0x2C,R24
(0060) }
011D 9189 LD R24,Y+
011E BF8F OUT 0x3F,R24
011F 9189 LD R24,Y+
0120 9518 RETI
(0061)
(0062) //call this routine to initialise all peripherals
(0063) void init_devices(void)
(0064) {
(0065) //stop errant interrupts until set up
(0066) CLI(); //disable all interrupts
_init_devices:
0121 94F8 BCLR 7
(0067) port_init();
0122 DFD6 RCALL _port_init
(0068) timer1_init();
0123 DFDD RCALL _timer1_init
(0069)
(0070) MCUCR = 0x0A;
0124 E08A LDI R24,0xA
0125 BF85 OUT 0x35,R24
(0071) GICR = 0x00;
0126 2422 CLR R2
0127 BE2B OUT 0x3B,R2
(0072) TIMSK = 0x04; //timer interrupt sources
0128 E084 LDI R24,4
0129 BF89 OUT 0x39,R24
(0073) SEI(); //re-enable interrupts
012A 9478 BSET 7
(0074) //all peripherals are now initialised
(0075) }
012B 9508 RET
(0076)
(0077) //
(0078) void main(void)
(0079) {
(0080) init_devices();
_main:
012C DFF4 RCALL _init_devices
(0081) lcd_init();
012D DF38 RCALL _lcd_init
(0082) //insert your functional code here...
(0083) display_a_string(0,led_buff);
012E E620 LDI R18,0x60
012F E030 LDI R19,0
0130 2700 CLR R16
0131 DF96 RCALL _display_a_string
(0084) display_a_string(1,str1);
0132 E721 LDI R18,0x71
0133 E030 LDI R19,0
0134 E001 LDI R16,1
(0085)
(0086)
(0087) }
0135 CF92 RJMP _display_a_string
_delay_ms:
j --> R20
i --> R22
time --> R16
0136 940E0169 CALL push_gset2
(0088)
(0089) //延时
(0090) void delay_ms(unsigned int time)
(0091) { unsigned int i,j;
(0092)
(0093) for(j=0;j<time;j++)
0138 2744 CLR R20
0139 2755 CLR R21
013A C00B RJMP 0x0146
(0094) { for(i=0;i<1000;i++)
013B 2766 CLR R22
013C 2777 CLR R23
013D C002 RJMP 0x0140
013E 5F6F SUBI R22,0xFF
013F 4F7F SBCI R23,0xFF
0140 3E68 CPI R22,0xE8
0141 E0E3 LDI R30,3
0142 077E CPC R23,R30
0143 F3D0 BCS 0x013E
0144 5F4F SUBI R20,0xFF
0145 4F5F SBCI R21,0xFF
0146 1740 CP R20,R16
0147 0751 CPC R21,R17
0148 F390 BCS 0x013B
(0095) time=time;
(0096) }
(0097) }
FILE: <library>
0149 940E014C CALL pop_gset2
014B 9508 RET
pop_gset2:
014C E0E2 LDI R30,2
014D 940C0156 JMP pop
pop_gset3:
014F E0E4 LDI R30,4
0150 940C0156 JMP pop
push_gset1:
0152 935A ST R21,-Y
0153 934A ST R20,-Y
0154 9508 RET
pop_gset1:
0155 E0E1 LDI R30,1
pop:
0156 9149 LD R20,Y+
0157 9159 LD R21,Y+
0158 FDE0 SBRC R30,0
0159 9508 RET
015A 9169 LD R22,Y+
015B 9179 LD R23,Y+
015C FDE1 SBRC R30,1
015D 9508 RET
015E 90A9 LD R10,Y+
015F 90B9 LD R11,Y+
0160 FDE2 SBRC R30,2
0161 9508 RET
0162 90C9 LD R12,Y+
0163 90D9 LD R13,Y+
0164 FDE3 SBRC R30,3
0165 9508 RET
0166 90E9 LD R14,Y+
0167 90F9 LD R15,Y+
0168 9508 RET
push_gset2:
0169 937A ST R23,-Y
016A 936A ST R22,-Y
016B 940C0152 JMP push_gset1
push_gset3:
016D 92BA ST R11,-Y
016E 92AA ST R10,-Y
016F 940C0169 JMP push_gset2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -