oyt88 发表于 2013-8-19 15:19:10

'SD2403时钟实例

'*********************************************************************************
'SD2403时钟程序

'软件版本Bascom_version:1.11.8.4

'Windows_:Microsoft Windows XP

'设计  OYT88

'日期2013年5月27日

'-----------------------------------------------------------------------------------------------------------------------------
'///////////////////////////////////////////////////////
$regfile = "m8def.dat"                                      '使用CPU为M8
$crystal = 7372800                                          '晶体频率
$baud = 9600

Config I2cdelay = 5
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , Rs = Portd.3 , E = Portd.2
Config Lcd = 16 * 2

Config Scl = Portc.5                                       '定义I2C端口
Config Sda = Portc.4

Declare Sub Write_eeprom(byval Adres As Byte , Byval Value As Byte)       '声明过程

Declare Sub Read_eeprom(byval Adres As Byte , Value As Byte)
                                                             '定义器件地址  常量

Const Addressw = &H64                                       '写地址

Const Addressr = &H65                                       '读地址


Dim B1 As Byte , Adres As Byte , Value(7) As Byte

'/////////////////变量声明///////////////////
Dim S As Byte , M As Byte , H As Byte
Dim Day As Byte , Month As Byte , Week As Byte
Dim Year As Byte

Config Pinb.0 = Input
        Portb.0 = 1

'//////////////////主程序////////////////////

Cls

Waitms 50
Locate 1 , 3
Lcd "bascom--time"
Locate 2 , 5
Lcd "start ok"
Waitms 500
Cls
If Pinb.0 = 0 Then                                          'PB0=0写数据
Gosub Wd_time
End If
Do

   Gosub Rd_time
   Waitms 20
   Gosub Szxs
   Waitms 100

Loop

'///////////////时钟显示子程序///////////////
Szxs:
   Locate 1 , 4
   Lcd 20
   Locate 1 , 6
   Lcd Hex(year) ; "/" ; Hex(month) ; "/" ; Hex(day)
'  Print "20" ; Hex(nian) ; "/" ; Hex(month) ; "/" ; Hex(day)
   Locate 2 , 3
   Lcd Hex(h) ; ":"                                         '显示时数据
   Locate 2 , 6
   Lcd Hex(m) ; ":"                                         '显示分数据
   Locate 2 , 9
   Lcd Hex(s) ; " "                                         '显示秒数据
   Locate 2 , 13
   Lcd Hex(week)                                            '显示星期数据

Return

'///////////////写入时间子程序///////////////
Wd_time:

     Call Write_eeprom(&H10 , &HE9)                         '打开写保护置WRTC1=1
     Call Write_eeprom(&H11 , &HFF)                         '设置为1秒频率中断
     Call Write_eeprom(&H0f , &H84)                         '设置写地址0FH 置WRTC2,WRTC3=1 ,

     Call Write_eeprom(&H00 , &H00)                         '写入秒数据(地址0)0秒

     Call Write_eeprom(&H01 , &H12)                         '写入分数据(地址1)00分

     Call Write_eeprom(&H02 , &H14)                         '写入小时数据(地址2)8点

     Call Write_eeprom(&H03 , &H06)                         '写入星期数据(地址3)星期1

     Call Write_eeprom(&H04 , &H25)                         '写入日数据(地址4) 01日

     Call Write_eeprom(&H05 , &H05)                         '写入月/世纪数据(地址5)07月

     Call Write_eeprom(&H06 , &H13)                         '写入年数据(地址6)   13年



Cls
   Locate 2 , 2
   Lcd "Wtime time ok"

   Wait 1

  Cls
Return
'///////////////读取时间子程序///////////////
Rd_time:


   Call Read_eeprom(&H00 , Value(1))
                                                            '读秒数据 从指定地址H00读数据给数组Value(1)
     S = Value(1)

   Call Read_eeprom(&H01 , Value(2))

     M = Value(2)
                                                            '读分数据
   Call Read_eeprom(&H02 , Value(3))

     H = Value(3)                                           '读时数据

   Call Read_eeprom(&H03 , Value(4))
                                                            '读星期数据
      Week = Value(4)

   Call Read_eeprom(&H04 , Value(5))
                                                            '读日数据
     Day = Value(5)

   'If Week = 0 Then Week = 7                               '将星期天转换为week7
   Call Read_eeprom(&H05 , Value(6))

     Month = Value(6)
                                                            '读月数据
   Call Read_eeprom(&H06 , Value(7))

     Year = Value(7)                                        '读年数据

Return

Sub Write_eeprom(byval Adres As Byte , Byval Value As Byte) '写子过程

    I2cstart                                                ' 发出起始信号

    I2cwbyte Addressw                                       ' 主控器件寻址被控器件,写操作

    I2cwbyte Adres                                          ' 指定单元地址ADRES

    I2cwbyte Value                                          ' 在现行地址写入变量 VALUE

    I2cstop                                                 ' 发出停止信号

    Waitms 10                                               ' 写操作等候10毫秒

End Sub

Sub Read_eeprom(byval Adres As Byte , Value As Byte)        '读子过程

   I2cstart                                                 ' 发出起始信号

   I2cwbyte Addressw                                        ' 主控器件寻址被控器件,写操作

   I2cwbyte Adres                                           ' 向写入指定单元地址ADRES

   I2cstart                                                 ' 重启动

   I2cwbyte Addressr                                        ' 主控器件寻址被控器件,读操作

   I2crbyte Value , Nack                                    ' 指定单元地址读出数据给变量VALUE

   I2cstop                                                  ' 发出停止信号

End Sub

箫天 发表于 2013-8-19 19:18:17

不错,很有用的例程。

赵彬 发表于 2013-9-3 20:40:12

不错大家都努力 bascom的例程就会多了起来
页: [1]
查看完整版本: 'SD2403时钟实例