📄 yj12864.lst
字号:
0471 E021 LDI R18,1
0472 2700 CLR R16
0473 DFD7 RCALL _LCD12864_sendbyte
(0146) Delayms(2);// 清屏指令写入后,2ms 的延时是很必要的!!!
0474 E002 LDI R16,2
0475 E010 LDI R17,0
0476 DEC8 RCALL _Delayms
0477 9508 RET
_LCD12864_readBF:
busy --> R20
0478 940E0A80 CALL push_gset1
(0147) }
(0148) /*******************************************
(0149) 函数名称: LCD12864_readBF
(0150) 功 能: 12864液晶清屏
(0151) 参 数: 无
(0152) 返回值 : busy--为1时忙,为0时可以接收指令
(0153) /********************************************/
(0154) uchar LCD12864_readBF(void)
(0155) {
(0156) uchar busy;
(0157) busy=LCD12864_readbyte(iCmd); //读回BF标志和地址
047A 2700 CLR R16
047B DFB7 RCALL _LCD12864_readbyte
047C 2F40 MOV R20,R16
(0158) if(busy&0x80) //如果忙,返回忙状态
047D FF07 SBRS R16,7
047E C002 RJMP 0x0481
(0159) busy=1;
047F E041 LDI R20,1
0480 C001 RJMP 0x0482
(0160) else //不忙,可以写入
(0161) busy=0;
0481 2744 CLR R20
(0162) return busy;
0482 2F04 MOV R16,R20
0483 940E0A83 CALL pop_gset1
0485 9508 RET
_LCD12864_gotoXY:
Col --> R20
Row --> R22
0486 940E0A7E CALL push_gset2
0488 2F42 MOV R20,R18
0489 2F60 MOV R22,R16
(0163) }
(0164) /*******************************************
(0165) 函数名称: LCD12864_gotoXY
(0166) 功 能: 移动到指定位置
(0167) 参 数: Row--指定的行
(0168) Col--指定的列
(0169) 返回值 : 无
(0170) /********************************************/
(0171) void LCD12864_gotoXY(uchar Row, uchar Col)
(0172) {
(0173) switch (Row) //选择行
048A 2777 CLR R23
048B 3062 CPI R22,2
048C E0E0 LDI R30,0
048D 077E CPC R23,R30
048E F049 BEQ 0x0498
048F 3063 CPI R22,3
0490 E0E0 LDI R30,0
0491 077E CPC R23,R30
0492 F051 BEQ 0x049D
0493 3064 CPI R22,4
0494 E0E0 LDI R30,0
0495 077E CPC R23,R30
0496 F059 BEQ 0x04A2
0497 C00F RJMP 0x04A7
(0174) {
(0175) case 2:
(0176) LCD12864_sendbyte(iCmd, LCDb_L2 + Col); break; //写入第2行的指定列
0498 2F24 MOV R18,R20
0499 5720 SUBI R18,0x70
049A 2700 CLR R16
049B DFAF RCALL _LCD12864_sendbyte
049C C00E RJMP 0x04AB
(0177) case 3:
(0178) LCD12864_sendbyte(iCmd, LCDb_L3 + Col); break; //写入第3行的指定列
049D 2F24 MOV R18,R20
049E 5728 SUBI R18,0x78
049F 2700 CLR R16
04A0 DFAA RCALL _LCD12864_sendbyte
04A1 C009 RJMP 0x04AB
(0179) case 4:
(0180) LCD12864_sendbyte(iCmd, LCDb_L4 + Col); break; //写入第4行的指定列
04A2 2F24 MOV R18,R20
04A3 5628 SUBI R18,0x68
04A4 2700 CLR R16
04A5 DFA5 RCALL _LCD12864_sendbyte
04A6 C004 RJMP 0x04AB
(0181) default:
(0182) LCD12864_sendbyte(iCmd, LCDb_L1 + Col); break; //写入第1行的指定列
04A7 2F24 MOV R18,R20
04A8 5820 SUBI R18,0x80
04A9 2700 CLR R16
04AA DFA0 RCALL _LCD12864_sendbyte
04AB 940E0A6F CALL pop_gset2
04AD 9508 RET
(0183) }
(0184) }
(0185) /*******************************************
(0186) 函数名称: LCD12864_initial
(0187) 功 能: 12864液晶初始化
(0188) 参 数: 无
(0189) 返回值 : 无
(0190) /********************************************/
(0191) void LCD12864_initial(void)
(0192) {
(0193) Delayms(100); // 等待内部复位
_LCD12864_initial:
04AE E604 LDI R16,0x64
04AF E010 LDI R17,0
04B0 DE8E RCALL _Delayms
(0194) LCD12864_portini(); //端口初始化
04B1 DF79 RCALL _LCD12864_portini
(0195)
(0196) LCD12864_sendbyte(iCmd, LCDb_FUNCTION); //功能、模式设定
04B2 E328 LDI R18,0x38
04B3 2700 CLR R16
04B4 DF96 RCALL _LCD12864_sendbyte
(0197) while(LCD12864_readBF());
04B5 DFC2 RCALL _LCD12864_readBF
04B6 2300 TST R16
04B7 F7E9 BNE 0x04B5
(0198) LCD12864_sendbyte(iCmd, LCDb_ON); //打开显示
04B8 E02C LDI R18,0xC
04B9 2700 CLR R16
04BA DF90 RCALL _LCD12864_sendbyte
(0199) while(LCD12864_readBF());
04BB DFBC RCALL _LCD12864_readBF
04BC 2300 TST R16
04BD F7E9 BNE 0x04BB
(0200) LCD12864_clear(); //清屏
04BE DFB2 RCALL _LCD12864_clear
(0201) while(LCD12864_readBF());
04BF DFB8 RCALL _LCD12864_readBF
04C0 2300 TST R16
04C1 F7E9 BNE 0x04BF
(0202) LCD12864_sendbyte(iCmd, LCDb_ENTRY); // 输入模式设定
04C2 E026 LDI R18,6
04C3 2700 CLR R16
04C4 DF86 RCALL _LCD12864_sendbyte
04C5 9508 RET
_LCD12864_opGDRAM:
i --> R20
x --> R22
j --> R10
ptGDRAM --> R12
04C6 940E0A7A CALL push_gset4
04C8 0168 MOVW R12,R16
(0203) }
(0204) /*******************************************
(0205) 函数名称: LCD12864_opGDRAM
(0206) 功 能: 向GDRAM写入数据,并显示(完成绘图功能)
(0207) 参 数: ptGDRAM--GDRAM数据指针
(0208) 返回值 : 无
(0209) /********************************************/
(0210) void LCD12864_opGDRAM(const uchar *ptGDRAM)
(0211) {
(0212) uchar i,j;
(0213) uint x=0;
04C9 2766 CLR R22
04CA 2777 CLR R23
(0214) while(LCD12864_readBF()); //读忙标志
04CB DFAC RCALL _LCD12864_readBF
04CC 2300 TST R16
04CD F7E9 BNE 0x04CB
(0215) LCD12864_sendbyte(iCmd,LCDb_EXTCMD1); //扩充指令集,并关闭绘图显示
04CE E324 LDI R18,0x34
04CF 2700 CLR R16
04D0 DF7A RCALL _LCD12864_sendbyte
(0216) //写入并显示上半屏幕
(0217) for(i=0;i<32;i++) //行地址计数
04D1 2744 CLR R20
04D2 C02D RJMP 0x0500
(0218) {
(0219) for(j=0;j<8;j++) //列地址计数
04D3 24AA CLR R10
04D4 C027 RJMP 0x04FC
(0220) {
(0221) LCD12864_sendbyte(iCmd,0x80|i);//输入行地址
04D5 2F24 MOV R18,R20
04D6 6820 ORI R18,0x80
04D7 2700 CLR R16
04D8 DF72 RCALL _LCD12864_sendbyte
(0222) Delayus(10);
04D9 E00A LDI R16,0xA
04DA E010 LDI R17,0
04DB DE4B RCALL _Delayus
(0223) LCD12864_sendbyte(iCmd,0x80|j);//输入列地址
04DC 2D2A MOV R18,R10
04DD 6820 ORI R18,0x80
04DE 2700 CLR R16
04DF DF6B RCALL _LCD12864_sendbyte
(0224) Delayus(10);
04E0 E00A LDI R16,0xA
04E1 E010 LDI R17,0
04E2 DE44 RCALL _Delayus
(0225) LCD12864_sendbyte(iDat,ptGDRAM[x++]); //输入高位字节数据
04E3 011B MOVW R2,R22
04E4 5F6F SUBI R22,0xFF
04E5 4F7F SBCI R23,0xFF
04E6 01F1 MOVW R30,R2
04E7 0DEC ADD R30,R12
04E8 1DFD ADC R31,R13
04E9 9124 LPM R18,0(Z)
04EA E001 LDI R16,1
04EB DF5F RCALL _LCD12864_sendbyte
(0226) Delayus(10);
04EC E00A LDI R16,0xA
04ED E010 LDI R17,0
04EE DE38 RCALL _Delayus
(0227) LCD12864_sendbyte(iDat,ptGDRAM[x++]); //输入低位字节数据
04EF 011B MOVW R2,R22
04F0 5F6F SUBI R22,0xFF
04F1 4F7F SBCI R23,0xFF
04F2 01F1 MOVW R30,R2
04F3 0DEC ADD R30,R12
04F4 1DFD ADC R31,R13
04F5 9124 LPM R18,0(Z)
04F6 E001 LDI R16,1
04F7 DF53 RCALL _LCD12864_sendbyte
(0228) Delayus(10);
04F8 E00A LDI R16,0xA
04F9 E010 LDI R17,0
04FA DE2C RCALL _Delayus
04FB 94A3 INC R10
04FC 2D8A MOV R24,R10
04FD 3088 CPI R24,0x8
04FE F2B0 BCS 0x04D5
04FF 9543 INC R20
0500 3240 CPI R20,0x20
0501 F408 BCC 0x0503
0502 CFD0 RJMP 0x04D3
(0229) }
(0230) }
(0231) //写入并显示下半屏幕
(0232) for(i=0;i<32;i++)
0503 2744 CLR R20
0504 C02E RJMP 0x0533
(0233) {
(0234) for(j=8;j<16;j++)
0505 E088 LDI R24,0x8
0506 2EA8 MOV R10,R24
0507 C027 RJMP 0x052F
(0235) {
(0236) LCD12864_sendbyte(iCmd,0x80|i);//输入行地址
0508 2F24 MOV R18,R20
0509 6820 ORI R18,0x80
050A 2700 CLR R16
050B DF3F RCALL _LCD12864_sendbyte
(0237) Delayus(10);
050C E00A LDI R16,0xA
050D E010 LDI R17,0
050E DE18 RCALL _Delayus
(0238) LCD12864_sendbyte(iCmd,0x80|j);//输入列地址
050F 2D2A MOV R18,R10
0510 6820 ORI R18,0x80
0511 2700 CLR R16
0512 DF38 RCALL _LCD12864_sendbyte
(0239) Delayus(10);
0513 E00A LDI R16,0xA
0514 E010 LDI R17,0
0515 DE11 RCALL _Delayus
(0240) LCD12864_sendbyte(iDat,ptGDRAM[x++]); //输入高位字节数据
0516 011B MOVW R2,R22
0517 5F6F SUBI R22,0xFF
0518 4F7F SBCI R23,0xFF
0519 01F1 MOVW R30,R2
051A 0DEC ADD R30,R12
051B 1DFD ADC R31,R13
051C 9124 LPM R18,0(Z)
051D E001 LDI R16,1
051E DF2C RCALL _LCD12864_sendbyte
(0241) Delayus(10);
051F E00A LDI R16,0xA
0520 E010 LDI R17,0
0521 DE05 RCALL _Delayus
(0242) LCD12864_sendbyte(iDat,ptGDRAM[x++]); //输入低位字节数据
0522 011B MOVW R2,R22
0523 5F6F SUBI R22,0xFF
0524 4F7F SBCI R23,0xFF
0525 01F1 MOVW R30,R2
0526 0DEC ADD R30,R12
0527 1DFD ADC R31,R13
0528 9124 LPM R18,0(Z)
0529 E001 LDI R16,1
052A DF20 RCALL _LCD12864_sendbyte
(0243) Delayus(10);
052B E00A LDI R16,0xA
052C E010 LDI R17,0
052D DDF9 RCALL _Delayus
052E 94A3 INC R10
052F 2D8A MOV R24,R10
0530 3180 CPI R24,0x10
0531 F2B0 BCS 0x0508
0532 9543 INC R20
0533 3240 CPI R20,0x20
0534 F408 BCC 0x0536
0535 CFCF RJMP 0x0505
(0244) }
(0245) }
(0246) Delayus(10);
0536 E00A LDI R16,0xA
0537 E010 LDI R17,0
0538 DDEE RCALL _Delayus
(0247) LCD12864_sendbyte(iCmd,LCDb_EXTCMD2); //打开绘图显示
0539 E326 LDI R18,0x36
053A 2700 CLR R16
053B DF0F RCALL _LCD12864_sendbyte
(0248) LCD12864_sendbyte(iCmd,LCDb_BASCMD); //还原回基本指令集模式
053C E320 LDI R18,0x30
053D 2700 CLR R16
053E DF0C RCALL _LCD12864_sendbyte
053F 940E0A75 CALL pop_gset4
0541 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\12864液晶菜单显示时钟不过不能调2\RTC.C
(0001) /*******************************************
(0002) 文件:RTC.C
(0003) 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
(0004) 硬件:ATMEGA16芯片
(0005) 日期:2006年12月10日
(0006) 功能:驱动开发板上的DS1302时钟芯片
(0007) 备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
(0008) /******************************************/
(0009) //#include <iom16v.h> //包含型号头文件
(0010) //#include <macros.h> //包含"位"操作头文件
(0011) //#include <stdio.h> //标准输入输出头文件
(0012)
(0013) //#include <AVR_PQ1A.h> //包含自定义常量头文件
(0014) //#include "YJ12864.C"
(0015) //#include "YJ1602.C" //包含1602液晶函数文件
(0016) //#include "MKEY.C" //包含矩阵键盘函数文件
(0017)
(0018)
(0019) /*******************************************
(0020) 函数名称: DS1302_init
(0021) 功 能: 初始化DS1302的数据接口
(0022) 参 数: 无
(0023) 返回值 : 无
(0024) /********************************************/
(0025) void DS1302_portinit(void)
(0026) {
(0027) DDRB|=BIT(RTC_CLK)|BIT(RTC_DATA)|BIT(RTC_CS);//将时钟端(RTC_CLK)数据端(RTC_DATA)片选端(RTC_CS)设置为输出
_DS1302_portinit:
0542 B387 IN R24,0x17
0543 6A80 ORI R24,0xA0
0544 BB87 OUT 0x17,R24
0545 9508 RET
_DS1302_writeB:
i --> R20
byte --> R22
0546 940E0A7E CALL push_gset2
0548 2F60 MOV R22,R16
(0028) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -