|
本帖最后由 HuaShine2015 于 2015-3-28 20:06 编辑
用ATmega8做了个仿苹果风格的二进制时钟,现在M8真便宜才2.5元/片。
先上图:
源码如下: - //二进制时钟源代码 Hua.Shine 2015-03-28
- //Mega8-16MHZ x 1; 74HC595 x 2; 共阳8x8LED x 1; DS1302 RTC模块
- //5v锂电池模块 x 1; 220欧电阻 x 8; 按钮开关 x 1;
- //接线方式:
- // Mega8 D3 --> 按钮开关 pin1
- // Mega GND --> 按钮开关 pin2
- // Mega8 D5 --> DS1302 RTC RST_PIN
- // Mega8 D6 --> DS1302 RTC DATA_PIN
- // Mega8 D7 --> DS1302 RTC CLK_PIN
- // Mega8 D8 --> 74HC595 ST_CP
- // Mega8 D12 --> 74HC595 SH_CP
- // Mega8 D11 --> 74HC595 DS
- #include <stdio.h>
- #include <string.h>
- #include <DS1302.h>
- /* Create buffers */
- //char buf[50];
- //char day[10];
- //Pin connected to ST_CP of 74HC595
- int latchPin = 8;
- //Pin connected to SH_CP of 74HC595
- int clockPin = 12;
- //Pin connected to DS of 74HC595
- int dataPin = 11;
- //Pin connected to SRCLR of 74HC595
- //int clearPin = 10;
- /* Set the appropriate digital I/O pin connections */
- uint8_t CE_PIN = 5;
- uint8_t IO_PIN = 6;
- uint8_t SCLK_PIN = 7;
- /* Create a DS1302 object */
- String inputString = "";
- boolean stringComplete = false;
- int numdata[7] = {0}, j = 0;
- DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);
- const byte LEDnum[12][9] = { //定义数字的点阵映射
-
- {B00111100,B00100100,B00100100,B00100100,B00100100,B00100100,B00100100,B00111100},//0
- {B00100000,B00100000,B00100000,B00100000,B00100000,B00100000,B00100000,B00100000},//1
- {B00111100,B00100000,B00100000,B00111100,B00000100,B00000100,B00000100,B00111100},//2
- {B00111100,B00100000,B00100000,B00111100,B00100000,B00100000,B00100000,B00111100},//3
- {B00100100,B00100100,B00100100,B00111100,B00100000,B00100000,B00100000,B00100000},//4
- {B00111100,B00000100,B00000100,B00111100,B00100000,B00100000,B00100000,B00111100},//5
- {B00111100,B00000100,B00000100,B00111100,B00100100,B00100100,B00100100,B00111100},//6
- {B00111100,B00100000,B00100000,B00100000,B00100000,B00100000,B00100000,B00100000},//7
- {B00111100,B00100100,B00100100,B00111100,B00100100,B00100100,B00100100,B00111100},//8
- {B00111100,B00100100,B00100100,B00111100,B00100000,B00100000,B00100000,B00111100},//9
- {B00000000,B00000000,B00011000,B00000000,B00000000,B00011000,B00000000,B00000000} //:
-
- };
- const byte col[9] = { //列选择
-
- B01111111, //col number 1
- B10111111, //col number 2
- B11011111, //col number 3
- B11101111, //col number 4
- B11110111, //col number 5
- B11111011, //col number 6
- B11111101, //col number 7
- B11111110 //col number 8
-
- };
- const byte bset[11] = {
-
- B00000000,
- B10000000,
- B01000000,
- B11000000,
- B00100000,
- B10100000,
- B01100000,
- B11100000,
- B00010000,
- B10010000,
-
- };
- boolean bmode = false;
- void print_time() //显示时间到点阵
- {
- if(bmode == false){ ////24小时格式顺序显示
- Time t = rtc.time();
- for(int i=0;i<250;i++){
- numplay((int)(t.hr/10));
- }
- for(int i=0;i<250;i++){
- numplay((int)(t.hr%10));
- }
- for(int i=0;i<150;i++){
- numplay(10);
- }
- for(int i=0;i<250;i++){
- numplay((int)(t.min/10));
- }
- for(int i=0;i<250;i++){
- numplay((int)(t.min%10));
- }
- delay(1200);
- }else{ //二进制格式显示
- Time t = rtc.time();
- for(int i=0;i<1000;i++){
- bitplay((int)(t.hr/10),0);
- bitplay((int)(t.hr%10),1);
- bitplay((int)(t.min/10),2);
- bitplay((int)(t.min%10),3);
- bitplay((int)(t.sec/10),4);
- bitplay((int)(t.sec%10),5);
- bitplay(0,6);
- bitplay(0,7);
- }
- }
- }
- void wake_up(){ //按钮中断函数,切换显示格式
- bmode=(!bmode);
- }
- void setup() { //主函数
-
- Serial.begin(9600);
- inputString.reserve(25);
- pinMode(latchPin,OUTPUT);
- pinMode(3,INPUT_PULLUP);
- attachInterrupt(1, wake_up, FALLING);
- rtc.write_protect(false);
- rtc.halt(false);
-
- }
-
- void loop() {
-
- if (stringComplete) { //有串口输入事件响应代码块
- Serial.println("You inputed : " + inputString);
- for(int i = 0; i < inputString.length() ; i++){ //此处使用论坛例程处理串口时间数据
- if(inputString[i] == ',' || inputString[i] == 0x10 || inputString[i] == 0x13)
- {
- j++;
- }
- else
- {
- numdata[j] = numdata[j] * 10 + (inputString[i] - '0');
- }
- }
-
- Time t(numdata[0], numdata[1], numdata[2], numdata[3], numdata[4], numdata[5], numdata[6]); //转换成int型的年月日时分秒星期数据在此写入RTC模块
- for(int i = 0; i < 7 ; i++){
- numdata[i]=0;
- }
- rtc.time(t);
- j=0;
- inputString = "";
- stringComplete = false;
- }
- print_time();
-
- }
- void bitplay(int num, int cl){ //预处理二进制格式显示数据
-
- digitalWrite(latchPin, 0);
- shiftOut(dataPin, clockPin, col[cl]);
- shiftOut(dataPin, clockPin, bset[num]);
- digitalWrite(latchPin, 1);
-
- }
- void numplay(int num){ //预处理24小时格式显示数据
-
- for(int i=0;i<9;i++){
- digitalWrite(latchPin, 0);
- shiftOut(dataPin, clockPin, col[i]);
- shiftOut(dataPin, clockPin, LEDnum[num][i]);
- digitalWrite(latchPin, 1);
- }
- }
- void shiftOut(int myDataPin, int myClockPin, byte myDataOut) { //此处使用Ariduino官方4HC595移位显示处理方法代码,具体可以参考Arduino官方教程ShiftOut:http://www.arduino.cc/en/Tutorial/ShiftOut
-
- int i=0;
- int pinState;
- pinMode(myClockPin, OUTPUT);
- pinMode(myDataPin, OUTPUT);
-
- digitalWrite(myDataPin, 0);
- digitalWrite(myClockPin, 0);
-
- for (i=7; i>=0; i--) {
- digitalWrite(myClockPin, 0);
- if ( myDataOut & (1<<i) ) {
- pinState= 1;
- }
- else {
- pinState= 0;
- }
-
- //Sets the pin to HIGH or LOW depending on pinState
- digitalWrite(myDataPin, pinState);
- //register shifts bits on upstroke of clock pin
- digitalWrite(myClockPin, 1);
- //zero the data pin after shift to prevent bleed through
- digitalWrite(myDataPin, 0);
- }
-
- //stop shifting
- digitalWrite(myClockPin, 0);
- }
- void serialEvent() { //串口事件响应代码
- while (Serial.available()) {
- // get the new byte:
- char inChar = (char)Serial.read();
- inputString += inChar;
-
- if (inChar == '\n') {
- stringComplete = true;
- }
- }
- }
复制代码
线路原理图
下面是来源于网络的对74HC595的应用示范
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
评分
-
查看全部评分
|