历史上的今天
今天是:2025年06月29日(星期日)
2020年06月29日 | 使用C8051F驱动PCF8563时钟芯片
2020-06-29 来源:eefocus
系统功能
利用C8051F驱动PCF8563时钟芯片,显示时钟。
硬件设计

LCD12864液晶电路原理图

使用C8051F驱动PCF8563时钟芯片电路原理图
软件设计
下面部分从TXT拷出,拷到网页,代码部分缺省了很多空格,比较凌乱,请谅解!
I2C(SMBus)详细程序请查看C8051F I2C(SMBus)程序。
LCD12864液晶详细程序请查看C8051F LCD12864程序。
//目标系统: 基于C8051F单片机
//应用软件: Silicon IDE / Keil
/*01010101010101010101010101010101010101010101010101010101010101010101
----------------------------------------------------------------------
实验内容:
使用C8051F驱动PCF8563时钟芯片,把读取到的时间在LCD12864上显示
----------------------------------------------------------------------
硬件连接:
DVK501(PCF8563PrlPort) F320 EX
VCC --------- VCC
GND --------- GND
SDA --------- P1.0
SCL --------- P1.1
DVK501(LCD12864PrlPort) F320 EX
VCC --------- VCC
GND --------- GND
CS --------- P0.7
SID --------- P0.6
SCK --------- P0.0
----------------------------------------------------------------------
注意事项:
(1)若有加载库程序,请将光盘根目录下的“library”下的“C8051F”文件夹拷到D盘
(2)请详细阅读:光盘根目录下的“说明书首页.htm”里的相应产品说明
----------------------------------------------------------------------
10101010101010101010101010101010101010101010101010101010101010101010*/
#define _DVK501_F320_EX_
#include #include <../../../../library/C8051F/ws_clock.h> #include <../../../../library/C8051F/ws_delay.h> #include <../../../../library/C8051F/ws_iic_port.h> #include <../../../../library/C8051F/ws_pcf8563_port.h> #include <../../../../library/C8051F/ws_lcd_st7920_port.h> void main(void) { uchar time[3],tmp=0; PCA0MD &= ~0x40; // Clear watchdog timer enable clock_external(); // Set oscillator in external,the clock is 12M delay_ms(100); Check_SDA(); XBR1 = 0x40; // Enable crossbar and weak pull-ups SPI_Init(); st7920LcdInit(); showLine(0,0,lcd_buffer,"PCF8563 Example"); showLine(0,1,lcd_buffer,"Set Time: OK"); showLine(0,2,lcd_buffer,"Read Time:"); refreshLCD(lcd_buffer); SMBus_Init(); Enb_Interrupt(); PCF8563_init(); PCF8563_setTime(12,0,0); delay_ms(10); while(1) { PCF8563_getTime(time); if(time[0]!=tmp) { showLine(8,3,lcd_buffer,"%d2:%d2:%d2",time[2],time[1],time[0]); refreshLCD(lcd_buffer); } tmp=time[0]; } } /*-------------------------------------------------------------------- 函数全称:十进制强制转换为十六进制 函数功能: 注意事项: 提示说明:调用changeIntToHex(33),return 0x33 输 入: 返 回: --------------------------------------------------------------------*/ #define changeIntToHex(dec) ( (((dec)/10) <<4) + ((dec)%10) ) /*-------------------------------------------------------------------- 函数全称:十进制化为十六进制,并以十进制格式返回 函数功能: 注意事项:传参必须为 unsigned 类型,否则移位结果可能吓你一跳 提示说明:调用converseIntToHex(33),return 21 输 入: 返 回: --------------------------------------------------------------------*/ #define converseIntToHex(dec) ( (((dec)>>4) *10) + ((dec)%16) ) /*-------------------------------------------------------------------- 函数全称:十六进制强制转换为十进制 函数功能: 注意事项:传参必须为 unsigned 类型,否则移位结果可能吓你一跳 提示说明:调用changeHexToInt(0x33),return 33 输 入: 返 回: --------------------------------------------------------------------*/ #define changeHexToInt(hex) ( (((hex)>>4) *10 ) + ((hex)%16) ) /*-------------------------------------------------------------------- 函数全称:十六进制化为十进制,,并以十六进制格式返回 函数功能: 注意事项: 提示说明:调用converseHexToInt(0x33),return 0x51 输 入: 返 回: --------------------------------------------------------------------*/ #define converseHexToInt(hex) ( (((hex)/10) <<4 ) + ((hex)%10) ) void WriteAByte(uchar wordAdr,uchar dat); void ReadNByte(uchar wordAdr,uchar *pRdDat); void PCF8563_getTime(uchar *buf); void PCF8563_setTime(uchar hour,uchar minute,uchar second); void PCF8563_init(void); #define CTRL_BUF1 0x00 #define CTRL_BUF2 0x01 #define SECOND_DATA_BUF 0x02 #define MINUTE_DATA_BUF 0x03 #define HOUR_DATA_BUF 0x04 #define DAY_DATA_BUF 0x05 #define WEEK_DATA_BUF 0x06 #define MONTH_DATA_BUF 0x07 #define YEAR_DATA_BUF 0x08 #define MINUTE_AE_BUF 0x09 #define HOUR_AE_BUF 0x0A #define DAY_AE_BUF 0x0B #define WEEK_AE_BUF 0x0C #define CLK_FRQ_BUF 0x0D #define TIMER_CTRL_BUF 0x0E #define COUNT_VAL_BUF 0x0F void WriteAByte(uchar wordAdr,uchar dat) { SMBus_Write(0xA2,wordAdr,dat,2); } void ReadNByte(uchar wordAdr,uchar *pRdDat) { SMBus_Write(0xA2,wordAdr,0,1); SMBus_Read(0xA3,pRdDat,3); } void PCF8563_getTime(uchar *buf) { ReadNByte(SECOND_DATA_BUF,buf); buf[0] = buf[0] & 0x7f; //get second data buf[1] = buf[1] & 0x7f; //get minute data buf[2] = buf[2] & 0x3f; //get hour data buf[0] = changeHexToInt(buf[0]); buf[1] = changeHexToInt(buf[1]); buf[2] = changeHexToInt(buf[2]); } void PCF8563_setTime(uchar hour,uchar minute,uchar second) { hour = changeIntToHex(hour); //将数据的Dex格式转换为Hex格式 minute = changeIntToHex(minute); second = changeIntToHex(second); WriteAByte(HOUR_DATA_BUF,hour); WriteAByte(MINUTE_DATA_BUF,minute); WriteAByte(SECOND_DATA_BUF,second); } void PCF8563_init(void) { WriteAByte(CTRL_BUF1,0x00); //basic setting WriteAByte(CTRL_BUF2,0x12); //alarm enable } 系统调试 改变初始化时间,将语句“PCF8563_setTime(12,0,0);”改成 “PCF8563_setTime(1,2,3);”,断电重启后查看现象。
上一篇:C8051F SPI程序
史海拾趣
|
《ARM Linux入门与实践》一书当中,关于触摸屏的那一节有几个地方不理解。 该程序的说明是:“代码并没有使用S3C2410A中的触摸屏控制器,而是通过直接控制FPIO的4个晶体管的导通和截止” P220: void Wait_Touch(void) { XMON_O ...… 查看全部问答> |
|
1、支持wince5.0可使用 .net + sqlce2.0 开发应用程序; 2、必须的外部接口包括:usb、以太网接口、打印串口 3、能控制按键音、报警音 4、能控制屏幕背光 5、需支持对5v左右电压的电池或电板充电 6、128X128支持汉显屏幕 7、主板长宽… 查看全部问答> |
|
组建一个简单的工业以太网,一台x86工控机当服务器,用网线联一台工业以太网交换机,交换机再连一台PLC,PLC 连接底层设备。 假设服务器上我装的就是普通的windows XP操作系统,上面运行我的工控软件。 请问我这个算是工业以太网吗?工业以太网不 ...… 查看全部问答> |
|
近来忙着家事,有一段时间没有上来了,今天顺着2011-1-11,这么多棍棍的日子,上来溜达一下。 看到自从夏老师到网站上来座镇解答FPGA的相关问题,网站上FPGA的热情洋溢,很有气氛,觉得这里有蛮多朋友 ...… 查看全部问答> |
|
main函数,我想大家都了解,只要你会C编程,你就会知道main?我想它是比你第一个 "hello world!"还早的程序。可是它的作用呢?我想不是每个会C编程的人都知道?如果 当你有一天可以对main说拜拜时,那你就算是入门了!这里高手如云,望 ...… 查看全部问答> |




