📄 can
字号:
__start:
__text_start:
01AC EFCF LDI R28,0xFF
01AD E1D0 LDI R29,0x10
01AE BFCD OUT 0x3D,R28
01AF BFDE OUT 0x3E,R29
01B0 51C0 SUBI R28,0x10
01B1 40D0 SBCI R29,0
01B2 EA0A LDI R16,0xAA
01B3 8308 STD Y+0,R16
01B4 2400 CLR R0
01B5 E3E0 LDI R30,0x30
01B6 E0F3 LDI R31,3
01B7 E013 LDI R17,3
01B8 33E0 CPI R30,0x30
01B9 07F1 CPC R31,R17
01BA F011 BEQ 0x01BD
01BB 9201 ST R0,Z+
01BC CFFB RJMP 0x01B8
01BD 8300 STD Z+0,R16
01BE E2E8 LDI R30,0x28
01BF E0F1 LDI R31,1
01C0 E0A0 LDI R26,0
01C1 E0B1 LDI R27,1
01C2 E013 LDI R17,3
01C3 35E8 CPI R30,0x58
01C4 07F1 CPC R31,R17
01C5 F021 BEQ 0x01CA
01C6 95C8 LPM
01C7 9631 ADIW R30,1
01C8 920D ST R0,X+
01C9 CFF9 RJMP 0x01C3
01CA 940E0315 CALL _main
_exit:
01CC CFFF RJMP _exit
_delay_us:
i --> R20
j --> R22
t --> R16
01CD 940E033D CALL push_gset2
FILE: C:\DOCUME~1\Administrator\桌面\nokia5110lcd\nokia.c
(0001) /***********************************************************************
(0002) 程序名称: nokia.c
(0003) 程序功能: nokia5110驱动程序
(0004) 程序说明:
(0005) /**********************************************************************/
(0006) #include <iom128v.h>
(0007) #include <macros.h>
(0008) #include <BIT.h>
(0009) #include"code_table.c"
(0010)
(0011) #define uchar unsigned char
(0012) #define uint unsigned int
(0013)
(0014) //位操作定义
(0015) #define SCLK _PA5
(0016) #define SDIN _PA4
(0017) #define LCD_DC _PA3
(0018) #define LCD_CE _PA2
(0019) #define LCD_RST _PA1
(0020)
(0021) //函数声明
(0022) void delay_us(uint t);
(0023) void delay_ms(uint t);
(0024) void LCD_init(void);
(0025) void LCD_clear(void);
(0026) void LCD_write_english_string(uchar X,uchar Y,char *s);
(0027) void LCD_write_char(uchar c);
(0028) void LCD_write_byte(uchar dat, uchar dc);
(0029) void LCD_set_XY(uchar X, uchar Y);
(0030)
(0031) /***********************************************************************
(0032) * 函数名称:delay_us()
(0033) * 函数功能:16M晶振,延时t微秒
(0034) * 入口参数:t 延时t微秒
(0035) * 出口参数:无
(0036) ***********************************************************************/
(0037) void delay_us(uint t)
(0038) {
(0039) uint i,j;
(0040) for(i=t;i>0;i--)
01CF 01A8 MOVW R20,R16
01D0 C00A RJMP 0x01DB
(0041) for(j=1;j>0;j--);
01D1 E061 LDI R22,1
01D2 E070 LDI R23,0
01D3 C002 RJMP 0x01D6
01D4 5061 SUBI R22,1
01D5 4070 SBCI R23,0
01D6 3060 CPI R22,0
01D7 0767 CPC R22,R23
01D8 F7D9 BNE 0x01D4
01D9 5041 SUBI R20,1
01DA 4050 SBCI R21,0
01DB 3040 CPI R20,0
01DC 0745 CPC R20,R21
01DD F799 BNE 0x01D1
01DE 940E032B CALL pop_gset2
01E0 9508 RET
_delay_ms:
i --> R20
j --> R22
t --> R16
01E1 940E033D CALL push_gset2
(0042) }
(0043)
(0044) /**********************************************************************
(0045) * 函数名称:delay_ms()
(0046) * 函数功能:16M晶振,延时t毫秒
(0047) * 入口参数:t 延时t毫秒
(0048) * 出口参数:无
(0049) ***********************************************************************/
(0050) void delay_ms(uint t)
(0051) {
(0052) uint i,j;
(0053) for(i=t;i>0;i--)
01E3 01A8 MOVW R20,R16
01E4 C00A RJMP 0x01EF
(0054) for(j=2670;j>0;j--);
01E5 E66E LDI R22,0x6E
01E6 E07A LDI R23,0xA
01E7 C002 RJMP 0x01EA
01E8 5061 SUBI R22,1
01E9 4070 SBCI R23,0
01EA 3060 CPI R22,0
01EB 0767 CPC R22,R23
01EC F7D9 BNE 0x01E8
01ED 5041 SUBI R20,1
01EE 4050 SBCI R21,0
01EF 3040 CPI R20,0
01F0 0745 CPC R20,R21
01F1 F799 BNE 0x01E5
01F2 940E032B CALL pop_gset2
01F4 9508 RET
(0055) }
(0056)
(0057) /**********************************************************************
(0058) * 函数名称:LCD_init()
(0059) * 函数功能:初始化nokia5110
(0060) * 入口参数:无
(0061) * 出口参数:无
(0062) **********************************************************************/
(0063) void LCD_init(void)
(0064) {
(0065) LCD_RST = 0; // 产生一个让LCD复位的低电平脉冲
_LCD_init:
01F5 B38B IN R24,0x1B
01F6 7F8D ANDI R24,0xFD
01F7 BB8B OUT 0x1B,R24
(0066) delay_us(1);
01F8 E001 LDI R16,1
01F9 E010 LDI R17,0
01FA DFD2 RCALL _delay_us
(0067) LCD_RST = 1;
01FB B38B IN R24,0x1B
01FC 6082 ORI R24,2
01FD BB8B OUT 0x1B,R24
(0068) LCD_CE = 0;// 关闭LCD
01FE B38B IN R24,0x1B
01FF 7F8B ANDI R24,0xFB
0200 BB8B OUT 0x1B,R24
(0069) delay_us(1);
0201 E001 LDI R16,1
0202 E010 LDI R17,0
0203 DFC9 RCALL _delay_us
(0070) LCD_CE = 1;// 使能LCD
0204 B38B IN R24,0x1B
0205 6084 ORI R24,4
0206 BB8B OUT 0x1B,R24
(0071) delay_us(1);
0207 E001 LDI R16,1
0208 E010 LDI R17,0
0209 DFC3 RCALL _delay_us
(0072) LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式
020A 2722 CLR R18
020B E201 LDI R16,0x21
020C D06A RCALL _LCD_write_byte
(0073) LCD_write_byte(0xc8, 0); // 设置偏置电压
020D 2722 CLR R18
020E EC08 LDI R16,0xC8
020F D067 RCALL _LCD_write_byte
(0074) LCD_write_byte(0x06, 0); // 温度校正
0210 2722 CLR R18
0211 E006 LDI R16,6
0212 D064 RCALL _LCD_write_byte
(0075) LCD_write_byte(0x13, 0); // 1:48
0213 2722 CLR R18
0214 E103 LDI R16,0x13
0215 D061 RCALL _LCD_write_byte
(0076) LCD_write_byte(0x20, 0); // 使用基本命令
0216 2722 CLR R18
0217 E200 LDI R16,0x20
0218 D05E RCALL _LCD_write_byte
(0077) LCD_clear(); // 清屏
0219 D007 RCALL _LCD_clear
(0078) LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示
021A 2722 CLR R18
021B E00C LDI R16,0xC
021C D05A RCALL _LCD_write_byte
(0079) LCD_CE = 0; // 关闭LCD
021D B38B IN R24,0x1B
021E 7F8B ANDI R24,0xFB
021F BB8B OUT 0x1B,R24
0220 9508 RET
_LCD_clear:
i --> R20
0221 940E033F CALL push_gset1
(0080) }
(0081)
(0082) /**********************************************************************
(0083) * 函数名称:LCD_clear()
(0084) * 函数功能:液晶清屏
(0085) * 入口参数:无
(0086) * 出口参数:无
(0087) **********************************************************************/
(0088) void LCD_clear(void)
(0089) {
(0090) uint i;
(0091) LCD_write_byte(0x0c, 0);
0223 2722 CLR R18
0224 E00C LDI R16,0xC
0225 D051 RCALL _LCD_write_byte
(0092) LCD_write_byte(0x80, 0);
0226 2722 CLR R18
0227 E800 LDI R16,0x80
0228 D04E RCALL _LCD_write_byte
(0093) for (i=0; i<504; i++)
0229 2744 CLR R20
022A 2755 CLR R21
022B C005 RJMP 0x0231
(0094) LCD_write_byte(0, 1);
022C E021 LDI R18,1
022D 2700 CLR R16
022E D048 RCALL _LCD_write_byte
022F 5F4F SUBI R20,0xFF
0230 4F5F SBCI R21,0xFF
0231 3F48 CPI R20,0xF8
0232 E0E1 LDI R30,1
0233 075E CPC R21,R30
0234 F3B8 BCS 0x022C
0235 940E0342 CALL pop_gset1
0237 9508 RET
_LCD_set_XY:
Y --> R22
X --> R20
0238 940E033D CALL push_gset2
023A 2F62 MOV R22,R18
023B 2F40 MOV R20,R16
(0095) }
(0096)
(0097) /**********************************************************************
(0098) * 函数名称:LCD_set_XY()
(0099) * 函数功能:光标定位x行y列
(0100) * 入口参数:X,Y x行y列
(0101) * 出口参数:无
(0102) **********************************************************************/
(0103) void LCD_set_XY(uchar X, uchar Y)
(0104) {
(0105) LCD_write_byte(0x40 | Y, 0); // column
023C 2722 CLR R18
023D 2F06 MOV R16,R22
023E 6400 ORI R16,0x40
023F D037 RCALL _LCD_write_byte
(0106) LCD_write_byte(0x80 | X, 0); // row
0240 2722 CLR R18
0241 2F04 MOV R16,R20
0242 6800 ORI R16,0x80
0243 D033 RCALL _LCD_write_byte
0244 940E032B CALL pop_gset2
0246 9508 RET
_LCD_write_char:
line --> R20
c --> R22
0247 940E033D CALL push_gset2
0249 2F60 MOV R22,R16
(0107) }
(0108)
(0109) /***********************************************************************
(0110) * 函数名称:LCD_write_char()
(0111) * 函数功能:写入1个字符
(0112) * 入口参数:c 要写入的数据
(0113) * 出口参数:无
(0114) **********************************************************************/
(0115) void LCD_write_char(uchar c)
(0116) {
(0117) uchar line;
(0118) c -= 32;
024A 5260 SUBI R22,0x20
(0119) for (line=0; line<6; line++)
024B 2744 CLR R20
024C C00F RJMP 0x025C
(0120) LCD_write_byte(font6x8[c][line], 1);//从ACSII码表中读取字节,然后写入液晶
024D E021 LDI R18,1
024E E086 LDI R24,6
024F 9F86 MUL R24,R22
0250 0110 MOVW R2,R0
0251 E080 LDI R24,0
0252 E091 LDI R25,1
0253 0E28 ADD R2,R24
0254 1E39 ADC R3,R25
0255 2FE4 MOV R30,R20
0256 27FF CLR R31
0257 0DE2 ADD R30,R2
0258 1DF3 ADC R31,R3
0259 8100 LDD R16,Z+0
025A D01C RCALL _LCD_write_byte
025B 9543 INC R20
025C 3046 CPI R20,6
025D F378 BCS 0x024D
025E 940E032B CALL pop_gset2
0260 9508 RET
_LCD_write_english_string:
s --> R20
Y --> R10
X --> R22
0261 940E033B CALL push_gset3
0263 2EA2 MOV R10,R18
0264 2F60 MOV R22,R16
0265 814E LDD R20,Y+6
0266 815F LDD R21,Y+7
(0121) }
(0122)
(0123) /***********************************************************************
(0124) * 函数名称
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -