?? ds12887.lst
字號:
0105 CF7C RJMP _Delayms
_LCD1602_readBF:
busy --> R20
0106 940E02CF CALL push_gset1
(0132) /*******************************************
(0133) 函數名稱: LCD1602_readBF
(0134) 功 能: 1602液晶清屏
(0135) 參 數: 無
(0136) 返回值 : busy--為1時是忙狀態,為0時可以接收指令
(0137) /********************************************/
(0138) uchar LCD1602_readBF(void)
(0139) {
(0140) uchar busy;
(0141) busy=LCD1602_readbyte(iCmd); //讀回BF標志(忙標志)和地址
0108 2700 CLR R16
0109 DFBB RCALL _LCD1602_readbyte
010A 2F40 MOV R20,R16
(0142) if(busy&0x80) //如果忙返回正在忙的狀態
010B FF07 SBRS R16,7
010C C002 RJMP 0x010F
(0143) busy=1;
010D E041 LDI R20,1
010E C001 RJMP 0x0110
(0144) else //如果不忙,可以寫入
(0145) busy=0;
010F 2744 CLR R20
(0146) return busy;
0110 2F04 MOV R16,R20
0111 940E02D2 CALL pop_gset1
0113 9508 RET
_LCD1602_gotoXY:
Col --> R20
Row --> R22
0114 940E02E6 CALL push_gset2
0116 2F42 MOV R20,R18
0117 2F60 MOV R22,R16
(0147) }
(0148) /*******************************************
(0149) 函數名稱: LCD1602_gotoXY
(0150) 功 能: 移動到指定位置
(0151) 參 數: Row--指定的行
(0152) Col--指定的列
(0153) 返回值 : 無
(0154) /********************************************/
(0155) void LCD1602_gotoXY(uchar Row, uchar Col)
(0156) {
(0157) switch (Row) //選擇行
0118 2777 CLR R23
0119 3062 CPI R22,2
011A E0E0 LDI R30,0
011B 077E CPC R23,R30
011C F009 BEQ 0x011E
011D C005 RJMP 0x0123
(0158) {
(0159) case 2:
(0160) LCD1602_sendbyte(iCmd, LCDa_L2 + Col); break; //寫入第2行的指定列
011E 2F24 MOV R18,R20
011F 5420 SUBI R18,0x40
0120 2700 CLR R16
0121 DFBB RCALL _LCD1602_sendbyte
0122 C004 RJMP 0x0127
(0161) default:
(0162) LCD1602_sendbyte(iCmd, LCDa_L1 + Col); break; //寫入第1行的指定列
0123 2F24 MOV R18,R20
0124 5820 SUBI R18,0x80
0125 2700 CLR R16
0126 DFB6 RCALL _LCD1602_sendbyte
(0163) }
(0164) }
0127 940E02EA CALL pop_gset2
0129 9508 RET
(0165) /*******************************************
(0166) 函數名稱: LCD1602_initial
(0167) 功 能: 1602液晶初始化
(0168) 參 數: 無
(0169) 返回值 : 無
(0170) /********************************************/
(0171) void LCD1602_initial(void)
(0172) {
(0173) Delayms(100); //上電后等待內部復位
_LCD1602_initial:
012A E604 LDI R16,0x64
012B E010 LDI R17,0
012C DF55 RCALL _Delayms
(0174) LCD1602_portini(); //端口初始化
012D DF90 RCALL _LCD1602_portini
(0175)
(0176) LCD1602_sendbyte(iCmd, LCDa_FUNCTION); //功能、模式設定,具體的設定功能可以看C:\icc\include\AVR_PQ1A.H里面的常量定義
012E E328 LDI R18,0x38
012F 2700 CLR R16
0130 DFAC RCALL _LCD1602_sendbyte
(0177) while(LCD1602_readBF()); //等待不忙為止
0131 DFD4 RCALL _LCD1602_readBF
0132 2300 TST R16
0133 F7E9 BNE 0x0131
(0178) LCD1602_sendbyte(iCmd, LCDa_ON); //打開顯示
0134 E02C LDI R18,0xC
0135 2700 CLR R16
0136 DFA6 RCALL _LCD1602_sendbyte
(0179) while(LCD1602_readBF()); //等待不忙為止
0137 DFCE RCALL _LCD1602_readBF
0138 2300 TST R16
0139 F7E9 BNE 0x0137
(0180) LCD1602_clear(); //清屏
013A DFC5 RCALL _LCD1602_clear
(0181) while(LCD1602_readBF()); //等待不忙為止
013B DFCA RCALL _LCD1602_readBF
013C 2300 TST R16
013D F7E9 BNE 0x013B
(0182) LCD1602_sendbyte(iCmd, LCDa_ENTRY); //輸入模式設定
013E E026 LDI R18,6
013F 2700 CLR R16
(0183) }
0140 CF9C RJMP _LCD1602_sendbyte
_write_ds:
date --> R20
add --> R22
0141 940E02E6 CALL push_gset2
0143 2F42 MOV R20,R18
0144 2F60 MOV R22,R16
(0184)
(0185) void write_ds(uchar add,uchar date)
(0186) {
(0187) PORTC&=~BIT(RTC_CS); //選通時鐘
0145 98A8 CBI P15,0
(0188) PORTD|=BIT(RTC_AS);
0146 9A95 SBI P12,5
(0189) PORTD|=BIT(RTC_DS);
0147 9A97 SBI P12,7
(0190) PORTD|=BIT(RTC_RW);
0148 9A96 SBI P12,6
(0191) PORTA=add;
0149 BB6B OUT P1B,R22
(0192) Delayus(5);
014A E005 LDI R16,5
014B E010 LDI R17,0
014C DF1D RCALL _Delayus
(0193) PORTD&=~BIT(RTC_AS); //鎖存地址
014D 9895 CBI P12,5
(0194) PORTD&=~BIT(RTC_RW);
014E 9896 CBI P12,6
(0195) PORTA=date;
014F BB4B OUT P1B,R20
(0196) Delayus(5);
0150 E005 LDI R16,5
0151 E010 LDI R17,0
0152 DF17 RCALL _Delayus
(0197) PORTD|=BIT(RTC_RW); //寫數據
0153 9A96 SBI P12,6
(0198) PORTD|=BIT(RTC_AS);
0154 9A95 SBI P12,5
(0199) PORTC|=BIT(RTC_CS);
0155 9AA8 SBI P15,0
(0200) }
0156 940E02EA CALL pop_gset2
0158 9508 RET
_read_ds:
ds_date --> R20
add --> R20
0159 940E02CF CALL push_gset1
015B 2F40 MOV R20,R16
(0201)
(0202) uchar read_ds(uchar add)
(0203) {
(0204) uchar ds_date;
(0205) PORTC&=~BIT(RTC_CS); //選通時鐘
015C 98A8 CBI P15,0
(0206) PORTD|=BIT(RTC_AS);
015D 9A95 SBI P12,5
(0207) PORTD|=BIT(RTC_DS);
015E 9A97 SBI P12,7
(0208) PORTD|=BIT(RTC_RW);
015F 9A96 SBI P12,6
(0209) // PORTC&=~BIT(RTC_CS); //選通時鐘
(0210) PORTA=add;
0160 BB4B OUT P1B,R20
(0211) Delayus(5);
0161 E005 LDI R16,5
0162 E010 LDI R17,0
0163 DF06 RCALL _Delayus
(0212) PORTD&=~BIT(RTC_AS); //鎖存地址
0164 9895 CBI P12,5
(0213) PORTD&=~BIT(RTC_DS);
0165 9897 CBI P12,7
(0214) DDRA=0;
0166 2422 CLR R2
0167 BA2A OUT P1A,R2
(0215) // PORTA=0XFF;
(0216) Delayus(5);
0168 E005 LDI R16,5
0169 E010 LDI R17,0
016A DEFF RCALL _Delayus
(0217) ds_date=PINA; //讀數據
016B B349 IN R20,P19
(0218) DDRA=0XFF;
016C EF8F LDI R24,0xFF
016D BB8A OUT P1A,R24
(0219) PORTD|=BIT(RTC_DS);
016E 9A97 SBI P12,7
(0220) PORTD|=BIT(RTC_AS);
016F 9A95 SBI P12,5
(0221) PORTC|=BIT(RTC_CS);
0170 9AA8 SBI P15,0
(0222) return ds_date;
0171 2F04 MOV R16,R20
0172 940E02D2 CALL pop_gset1
0174 9508 RET
(0223) }
(0224)
(0225)
(0226) /*************************************************************
(0227) 函數功能:該函數用來啟動時鐘芯片工作
(0228) 應用范圍:僅在時鐘芯片首次使用時用到一次
(0229) 入口參數:
(0230) 出口參數:
(0231) *************************************************************/
(0232) void StartDs12c887(void)
(0233) {
(0234) write_ds(chRegA,CMD_START_DS12C887);
_StartDs12c887:
0175 E220 LDI R18,0x20
0176 E00A LDI R16,0xA
(0235) }
0177 CFC9 RJMP _write_ds
(0236)
(0237) /*************************************************************
(0238) 函數功能:該函數用來關閉時鐘芯片
(0239) 應用范圍:一般用不到
(0240) 入口參數:
(0241) 出口參數:
(0242) *************************************************************/
(0243) void CloseDs12c887(void)
(0244) {
(0245) write_ds(chRegA,CMD_CLOSE_DS12C887);
_CloseDs12c887:
0178 E320 LDI R18,0x30
0179 E00A LDI R16,0xA
(0246) }
017A CFC6 RJMP _write_ds
(0247) /*************************************************************
(0248) 函數功能:初始化ds12c887
(0249) 應用范圍:
(0250) 入口參數:
(0251) 出口參數:
(0252) *************************************************************/
(0253) void InitDs12c887()
(0254) {
(0255) StartDs12c887();
_InitDs12c887:
017B DFF9 RCALL _StartDs12c887
(0256) write_ds(chRegB,chRegB | MASK_SETB_SET);/* 禁止刷新 */
017C E82B LDI R18,0x8B
017D E00B LDI R16,0xB
017E DFC2 RCALL _write_ds
(0257) write_ds(chRegB,chRegB & MASK_CLR_DM | MASK_SETB_2412 & MASK_CLR_DSE);
017F E02B LDI R18,0xB
0180 E00B LDI R16,0xB
0181 DFBF RCALL _write_ds
(0258)
(0259) /* 使用BCD碼格式、24小時模式、不使用夏令時 */
(0260) write_ds(chCenturyChannel,0x21); /* 設置為21世紀 */
0182 E221 LDI R18,0x21
0183 E302 LDI R16,0x32
0184 DFBC RCALL _write_ds
(0261) write_ds(chRegB,chRegB & MASK_CLR_SET);
0185 E02B LDI R18,0xB
0186 E00B LDI R16,0xB
(0262) }
0187 CFB9 RJMP _write_ds
(0263)
(0264) /*************************************************************
(0265) 函數功能:該函數用來從時鐘芯片讀取秒字節
(0266) 應用范圍:
(0267) 入口參數:
(0268) 出口參數:
(0269) *************************************************************/
(0270) unsigned char GetSeconds(void)
(0271) {
(0272) return(read_ds(chSecondsChannel));
_GetSeconds:
0188 2700 CLR R16
0189 CFCF RJMP _read_ds
(0273) }
(0274)
(0275) /*************************************************************
(0276) 函數功能:該函數用來從時鐘芯片讀取分字節
(0277) 應用范圍:
(0278) 入口參數:
(0279) 出口參數:
(0280) *************************************************************/
(0281) unsigned char GetMinutes(void)
(0282) {
(0283) return(read_ds(chMinutesChannel));
_GetMinutes:
018A E002 LDI R16,2
018B CFCD RJMP _read_ds
(0284) }
(0285)
(0286) /*************************************************************
(0287) 函數功能:該函數用來從時鐘芯片讀取小時字節
(0288) 應用范圍:
(0289) 入口參數:
(0290) 出口參數:
(0291) *************************************************************/
(0292) unsigned char GetHours(void)
(0293) {
(0294) return(read_ds(chHoursChannel));
_GetHours:
018C E004 LDI R16,4
018D CFCB RJMP _read_ds
(0295) }
(0296)
(0297) /*************************************************************
(0298) 函數功能:該函數用來從時鐘芯片讀取日字節
(0299) 應用范圍:
(0300) 入口參數:
(0301) 出口參數:
(0302) *************************************************************/
(0303) unsigned char GetDate(void)
(0304) {
(0305) return(read_ds(chDateChannel));
_GetDate:
018E E007 LDI R16,7
018F CFC9 RJMP _read_ds
(0306) }
(0307) /*************************************************************
(0308) 函數功能:該函數用來從時鐘芯片讀取月字節
(0309) 應用范圍:
(0310) 入口參數:
(0311) 出口參數:
(0312) *************************************************************/
(0313) unsigned char GetMonth(void)
(0314) {
(0315) return(read_ds(chMonthChannel));
_GetMonth:
0190 E008 LDI R16,0x8
0191 CFC7 RJMP _read_ds
(0316) }
(0317)
(0318) /*************************************************************
(0319) 函數功能:該函數用來從時鐘芯片讀取年字節
(0320) 應用范圍:
(0321) 入口參數:
(0322) 出口參數:
(0323) *************************************************************/
(0324) unsigned char GetYear(void)
(0325) {
(0326) return(read_ds(chYearChannel));
_GetYear:
0192 E009 LDI R16,0x9
0193 CFC5 RJMP _read_ds
(0327) }
(0328)
(0329) /*************************************************************
(0330) 函數功能:該函數用來從時鐘芯片讀取世紀字節
(0331) 應用范圍:
(0332) 入口參數:
(0333) 出口參數:
(0334) *************************************************************/
(0335) unsigned char GetCentury(void)
(0336) {
(0337) return(read_ds(chCenturyChannel));
_GetCentury:
0194 E302 LDI R16,0x32
0195 CFC3 RJMP _read_ds
_SetTime:
chHours --> Y+4
chMinutes --> R20
chSeconds --> R22
0196 940E02E6 CALL push_gset2
0198 2F42 MOV R20,R18
0199 2F60 MOV R22,R16
(0338) }
(0339)
(0340) /*************************************************************
(0341) 函數功能:該函數用來設置時鐘芯片的時間
(0342) 應用范圍:
(0343) 入口參數:chSeconds、chMinutes、chHours是設定時間的壓縮BCD碼
(0344) 出口參數:
(0345) *************************************************************/
(0346) void SetTime(unsigned char chSeconds,unsigned char chMinutes,unsigned char
(0347) chHours)
(0348) {
(0349) write_ds(chRegB,chRegB | MASK_SETB_SET); /* 禁止刷新 */
019A E82B LDI R18,0x8B
019B E00B LDI R16,0xB
019C DFA4 RCALL _write_ds
(0350) write_ds(chSecondsChannel,chSeconds);
019D 2F26 MOV R18,R22
019E 2700 CLR R16
019F DFA1 RCALL _write_ds
(0351) write_ds(chMinutesChannel,chMinutes);
01A0 2F24 MOV R18,R20
01A1 E002 LDI R16,2
01A2 DF9E RCALL _write_ds
(0352) write_ds(chHoursChannel,chHours);
01A3 812C LDD R18,4+Y
01A4 E004 LDI R16,4
01A5 DF9B RCALL _write_ds
(0353) write_ds(chRegB,chRegB & MASK_CLR_SET);/* 使能刷新 */
01A6 E02B LDI R18,0xB
01A7 E00B LDI R16,0xB
01A8 DF98 RCALL _write_ds
(0354) }
01A9 940E02EA CALL pop_gset2
01AB 9508 RET
_SetDate:
chYear --> Y+4
chMonth --> R20
chDate --> R22
01AC 940E02E6 CALL push_gset2
01AE 2F42 MOV R20,R18
01AF 2F60 MOV R22,R16
(0355)
(0356) /*************************************************************
(0357) 函數功能:該函數用來設置時鐘芯片的日期
(0358) 應用范圍:
(0359) 入口參數:chDate、chMonth、chYear是設定日期的壓縮BCD碼
(0360) 出口參數:
(0361) *************************************************************/
(0362) void SetDate(unsigned char chDate,unsigned char chMonth,unsigned char chYear)
(0363) {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -