|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
剛寫的一個PCF8563匯編程序,請教高手!! |
| 作者:oscar126 欄目:單片機 |
;*************************************************************** ;PCF8563時鐘程序,不帶設(shè)置采用RT1602C液晶顯示 ;*************************************************************** ;=============================================================== ; 地址分配 ;=============================================================== BITCNT DATA 30H //I2C位計數(shù)器地址 BYTECNT DATA 31H //I2C字節(jié)計數(shù)器地址 RTCADR DATA 32H //RTC(PCF8563)在I2C上的地址 RTCREGADR DATA 33H //RTC 單元地址(16個寄存器地址) RECVDATBUF DATA 40H //接收數(shù)據(jù)緩沖區(qū) SENDDATBUF DATA 50H //發(fā)送數(shù)據(jù)緩沖區(qū) RT1602CBUF DATA 60H //液晶顯示緩沖區(qū) ACK BIT 20H //接收數(shù)據(jù)非應(yīng)答標(biāo)志 ;--------------------------------------------------------------- ; 端口位定義 ;--------------------------------------------------------------- SDA BIT P3.6 //PCF8563 SCL BIT P3.7 ;--------------------------------------------------------------- RS BIT P2.5 //RT1602C RW BIT P2.6 E BIT P2.7 ;--------------------------------------------------------------- ;=============================================================== ;名稱:主程序 ;描述:初始化程序,寫入時鐘,液晶顯示,讀出時鐘,報警設(shè)置,循環(huán) ;=============================================================== ORG 0000H AJMP MAIN ORG 000BH //定時器0的入口地址 AJMP TIME0 ORG 0013H //INT1的入口地址 AJMP ALARMINT ORG 0020H MAIN: MOV SP,#70H //堆棧指針 MOV IP,#04H //設(shè)置INT1中斷優(yōu)先級高 LCALL SENDTIME //寫入時鐘 ;--------------------------------------------------------------- ; 報警設(shè)置 ;--------------------------------------------------------------- MOV 50H,#10H //10分鐘報警時刻送發(fā)送緩沖區(qū) MOV RTCADR,#0A2H //送PCF8563在I2C的寫的地址 MOV RTCREGADR,#09H //取小時報警控制字節(jié)地址 MOV BYTECNT,#1 LCALL SENDDATA //送報警信息 GOAHEAD: LCALL READTIME //讀出時鐘 LCALL RT1602CDISP //顯示時鐘 LCALL D10MS AJMP GOAHEAD ;*************************************************************** ; 子程序 ;*************************************************************** ;=============================================================== ;名稱:RT1602CDISP ;描述:40H開始的接收數(shù)據(jù)緩沖區(qū)數(shù)據(jù)移入到以60H開始的顯示緩沖區(qū) ;顯示緩沖區(qū)的內(nèi)容送RT1602C顯示 ;=============================================================== RT1602CDISP: ;--------------------------------------------------------------- ;將年月日時分秒星期存到顯示緩沖區(qū) ;60H-69H:2006090900:00:00'FRI' ;--------------------------------------------------------------- ; 初始化RT1602C ;-------------------------------------------------------------- MOV P0,#00000001B //清屏并光標(biāo)復(fù)位 ACALL WORDER //調(diào)用寫入命令子程序 MOV P0,#00111100B //設(shè)置顯示模式,8位2行5*10點陣 ACALL WORDER MOV P0,#00001100B //顯示器開,光標(biāo)關(guān),光標(biāo)不閃爍 ACALL WORDER MOV P0,#00000110B //文字不動,光標(biāo)自動右移 ACALL WORDER ;--------------------------------------------------------------- MOV 60H,#20H MOV 65H,#3AH //':'ASCII代碼 MOV 67H,#3AH //':'ASCII代碼 MOV A,46H MOV 61H,A MOV A,45H MOV 62H,A MOV A,43H MOV 63H,A MOV A,42H MOV 64H,A MOV A,41H MOV 66H,A MOV A,40H MOV 68H,A MOV A,44H MOV 69H,A ;-------------------------------------------------------------- ; RT1602C開始顯示程序 ;-------------------------------------------------------------- MOV P0,#81H //年顯示地址,第一行第二位置開始 ACALL WORDER MOV R5,60H //'20'送R5 ACALL BREAK ;-------------------------------------------------------------- MOV P0,#83H //年顯示地址 ACALL WORDER MOV R5,61H //'06' ACALL BREAK ;-------------------------------------------------------------- MOV P0,#86H //月顯示地址 ACALL WORDER &n |
| 2樓: | >>參與討論 |
| 作者: oscar126 于 2006/9/30 23:13:00 發(fā)布:
我是初學(xué)者 下載到電路版上,顯示的是 2077 0< 27 TUE。 11:15:31 而且一直保持這樣的數(shù)據(jù), 我不知道問題出現(xiàn)在哪了,檢查了很久!還是檢查不出來,液晶顯示模塊沒問題!我調(diào)試過的。。。。所以拿進來請教下高手,本人不甚感激! |
|
| 3樓: | >>參與討論 |
| 作者: oscar126 于 2006/9/30 23:15:00 發(fā)布:
在線等。。。。。。 |
|
| 4樓: | >>參與討論 |
| 作者: stycx 于 2006/10/1 7:57:00 發(fā)布:
有幾個問題 1、設(shè)置時間前須停止時鐘, 設(shè)置時間后才能啟動時鐘 2、設(shè)置時間的參數(shù)中,除星期外,都必須是bcd碼 3、用匯編效率低了點吧 |
|
| 5樓: | >>參與討論 |
| 作者: oscar126 于 2006/10/13 11:11:00 發(fā)布:
謝謝!真的好多問題! 匯編效率是低了點,,我現(xiàn)在正在學(xué)習(xí)C語言,不知道大家對學(xué)習(xí)C有什么好的建議??我還是在校的學(xué)生,,感覺有點迷茫 |
|
| 6樓: | >>參與討論 |
| 作者: stycx 于 2006/10/13 11:29:00 發(fā)布:
設(shè)置時間前須停止時鐘, 設(shè)置時間后才能啟動時鐘 你的程序好像沒有吧 |
|
| 7樓: | >>參與討論 |
| 作者: oscar126 于 2006/10/13 12:13:00 發(fā)布:
謝謝stycx! 我一開始調(diào)用寫入時鐘子程序,其中有啟動時鐘的指令 SENDPCF8563: MOV 50H,#00H //啟動時鐘 MOV 51H,#1FH //設(shè)置報警及定時器中斷,定時器中斷為脈沖形式 你的意思是不是這之前要把時鐘停止?具體怎么設(shè)置?能說一下嗎?我找到的資料里好象沒有相關(guān)的介紹,謝謝了! |
|
| 8樓: | >>參與討論 |
| 作者: oscar126 于 2006/10/14 11:14:00 發(fā)布:
還有那個BCD碼。。。。。 那個BCD碼不就是用四位二進制表示1~9的十進制嗎?我好象沒寫錯啊,,請指教!謝謝~! |
|
| 9樓: | >>參與討論 |
| 作者: stycx 于 2006/10/14 16:51:00 發(fā)布:
8563芯片的手冊里頭就有說明 |
|
| 10樓: | >>參與討論 |
| 作者: stycx 于 2006/10/14 18:36:00 發(fā)布:
給個8563的c函數(shù)庫你參考一下吧 /* CodeVisionAVR C Compiler (C) 1998-2004 Pavel Haiduc, HP InfoTech S.R.L. PHILIPS PCF8563 I2C bus Real Time Clock functions */ #include <i2c.h> #include <bcd.h> unsigned CHAR rtc_read(unsigned CHAR address) { unsigned CHAR d; i2c_start(); i2c_write(0xa2); i2c_write(address); i2c_start(); i2c_write(0xa3); d=i2c_read(0); i2c_stop(); return d; } void rtc_write(unsigned CHAR address,unsigned CHAR data) { i2c_start(); i2c_write(0xa2); i2c_write(address); i2c_write(data); i2c_stop(); } void rtc_stop(void) { rtc_write(0,0x20); } void rtc_start(void) { rtc_write(0,0); } void rtc_init(unsigned CHAR ctrl2,unsigned CHAR clkout,unsigned CHAR timer_ctrl) { rtc_write(1,ctrl2); rtc_write(0xd,clkout); rtc_write(0xe,timer_ctrl); rtc_start(); } unsigned CHAR rtc_read_bcd(unsigned CHAR addr,unsigned CHAR mask) { return bcd2bin(rtc_read(addr) & mask); } void rtc_write_bcd(unsigned CHAR addr,unsigned CHAR data) { rtc_write(addr,bin2bcd(data)); } unsigned CHAR rtc_get_time(unsigned CHAR *hour,unsigned CHAR *min,unsigned CHAR *sec) { unsigned CHAR d; d=rtc_read(2); *sec=bcd2bin(d & 0x7f); if (d & 0x80) d=0; else d=1; *min=rtc_read_bcd(3,0x7f); *hour=rtc_read_bcd(4,0x3f); return d; } void rtc_set_time(unsigned CHAR hour,unsigned CHAR min,unsigned CHAR sec) { rtc_stop(); rtc_write_bcd(2,sec); rtc_write_bcd(3,min); rtc_write_bcd(4,hour); rtc_start(); } void rtc_get_date(unsigned CHAR *date,unsigned CHAR *month,unsigned *year) { unsigned CHAR mc; unsigned y=1900; *date=rtc_read_bcd(5,0x3f); mc=rtc_read(7); *month=bcd2bin(mc & 0x1f); if (mc & 0x80) y=2000; *year=rtc_read_bcd(8,0xff)+y; } void rtc_set_date(unsigned CHAR date,unsigned CHAR month,unsigned year) { unsigned CHAR mc; mc=bin2bcd(month); if (year>=2000) mc|=0x80; rtc_stop(); rtc_write_bcd(5,date); rtc_write(7,mc); rtc_write_bcd(8,year%100); rtc_start(); } void rtc_alarm_off(void) { rtc_write(9,rtc_read(9) | 0x80); rtc_write(10,rtc_read(10) | 0x80); rtc_write(11,rtc_read(11) | 0x80); rtc_write(12,0x80); } void rtc_alarm_on(void) { unsigned CHAR d; rtc_write(9,rtc_read(9) & 0x7f); rtc_write(10,rtc_read(10) & 0x3f); d=rtc_read(11) & 0x3f; if (d==0) d|=0x80; rtc_write(11,d); } void rtc_write_alarm(unsigned CHAR addr,unsigned CHAR data) { rtc_write(addr,bin2bcd(data) | 0x80); } void rtc_set_alarm(unsigned CHAR date,unsigned CHAR hour,unsigned CHAR min) { rtc_write_alarm(9,min); rtc_write_alarm(10,hour); rtc_write_alarm(11,date); rtc_write(12,0x80); } void rtc_get_alarm(unsigned CHAR *date,unsigned CHAR *hour,unsigned CHAR *min) { *min=rtc_read_bcd(9,0x7f); *hour=rtc_read_bcd(10,0x3f); *date=rtc_read_bcd(11,0x3f); } void rtc_set_timer(unsigned CHAR val) { rtc_write(0xf,val); } |
|
| 11樓: | >>參與討論 |
| 作者: oscar126 于 2006/10/14 23:24:00 發(fā)布:
恩,謝謝。。。 我參考的是標(biāo)有 廣州周立功單片機發(fā)展有限公司 的資料,8563的DATASHEET是英文的,,我就沒看了哈,,謝謝你提醒,也謝謝你提供8563的C函數(shù)! |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號 |