STM32电子时钟1602显示仿真加程序

发布者:星尘散落最新更新时间:2020-07-24 来源: 51hei关键字:STM32  电子时钟  1602显示 手机看文章 扫描二维码
随时随地手机看文章

#include "stm32f4xx.h"
#include "delay.h"

#include "seg.h"

#include "timer.h"
unsigned int nian = 2020;
char yue = 7;
char ri = 16;
char shi = 9;
char fen = 31;
char miao = 30;
u8  bs=0;//存储时间的变量
u8 date[8]={0,0,0,0,0,0,0,0};//数据
u16 address[8]={0x0101,0x0102,0x0104,0x0108,0x0110,0x0120,0x0140,0x0180};//位码
char wendu[] = "Date:";
char shidu[] = "Time:";
       
#define LCD_DATA_PORT GPIOC

#define        LCD_RS_Set()        GPIO_SetBits(GPIOB, GPIO_Pin_8)
#define        LCD_RS_Clr()        GPIO_ResetBits(GPIOB, GPIO_Pin_8)

#define        LCD_RW_Set()        GPIO_SetBits(GPIOB, GPIO_Pin_9)
#define        LCD_RW_Clr()        GPIO_ResetBits(GPIOB, GPIO_Pin_9)

#define        LCD_EN_Set()        GPIO_SetBits(GPIOB, GPIO_Pin_10)
#define        LCD_EN_Clr()        GPIO_ResetBits(GPIOB, GPIO_Pin_10)

#define        DATAOUT(x)        GPIO_Write(GPIOC, x)

#define u8  unsigned char

void GPIO_Configuration(void);     
void LCD1602_Wait_Ready(void);        //判忙                              
void LCD1602_Write_Cmd(u8 cmd);             //写命令                     
void LCD1602_Write_Dat(u8 dat);              //写数据                     
void LCD1602_ClearScreen(void);              //清屏                     
void LCD1602_Set_Cursor(u8 x, u8 y);              
void LCD1602_Show_Str(u8 x, u8 y, char *str);    //显示                     
void LCD1602_Init(void);                        //初始化   
void GPIO_Configuration(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);

       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;                           
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
        GPIO_Init(LCD_DATA_PORT, &GPIO_InitStructure);                               
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;   
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;                           
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;       
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;          //上拉
        GPIO_Init(GPIOB, &GPIO_InitStructure);                               
}

void LCD1602_Wait_Ready(void)   //检测忙
{
        int8_t sta=0;
       
        DATAOUT(0xff);      //PC全置1
        LCD_RS_Clr();       //RS 0
        LCD_RW_Set();       //RW 1
        do
        {
                LCD_EN_Set();   //EN 1
                delay_ms(10);
                sta = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7); //读取状态字   
                LCD_EN_Clr();   //EN 0
        }while(sta & 0x80);
}

void LCD1602_Write_Cmd(u8 cmd)    //写入指令
{
        LCD1602_Wait_Ready();     //判忙
        LCD_RS_Clr();   
        LCD_RW_Clr();
        DATAOUT(cmd);  
        delay_us(10);
        LCD_EN_Set();
        LCD_EN_Clr();

}

void LCD1602_Write_Dat(u8 dat)
{
        LCD1602_Wait_Ready();
        LCD_RS_Set();   
        LCD_RW_Clr();   
        DATAOUT(dat);
    delay_us(10);       
        LCD_EN_Set();  
        LCD_EN_Clr();

       
}

void LCD1602_ClearScreen(void)  //清屏
{
        LCD1602_Write_Cmd(0x01);
       
}

void LCD1602_Set_Cursor(u8 x, u8 y)   //光标设置位置
{
        u8 addr;
       
        if (y == 0)
                addr = 0x00 + x;
        else
                addr = 0x40 + x;
        LCD1602_Write_Cmd(addr | 0x80);
}

void LCD1602_Show_Str(u8 x, u8 y, char *str)//字符串
{
        LCD1602_Set_Cursor(x, y);
        while(*str != '')
        {
                LCD1602_Write_Dat(*str++);
        }
}

void LCD1602_Init(void)//初始化
{
        GPIO_Configuration();
        LCD1602_Write_Cmd(0x38);       
        LCD1602_Write_Cmd(0x0C);       
        LCD1602_Write_Cmd(0x06);       
        LCD1602_Write_Cmd(0x01);       
}


int main(void)
{


        TIM3_Int_Init(15-1,2100-1);        //定时器3初始化
        LCD1602_Init();
        LCD1602_Show_Str(0,0,wendu);          //日期显示
        LCD1602_Show_Str(0,2,shidu);           //时间显示
        while(1)
        {
       
        get_time(); //计时
              LCD1602_Write_Cmd( 0x80+5 );
                                LCD1602_Write_Dat( nian/1000 + 0x30 );//显示年
                                LCD1602_Write_Dat( nian%1000/100 + 0x30 );
                                LCD1602_Write_Dat( nian%100/10 + 0x30 );
                                LCD1602_Write_Dat( nian%10 + 0x30 );
                                LCD1602_Write_Dat( '-' );
                                LCD1602_Write_Dat( yue/10 + 0x30 );//显示月
                                LCD1602_Write_Dat( yue%10 + 0x30 );
                          LCD1602_Write_Dat( '-' );
                                LCD1602_Write_Dat( ri/10 + 0x30 );//显示日
                                LCD1602_Write_Dat( ri%10 + 0x30 );
               
                               
                                LCD1602_Write_Cmd( 0x80 +0x40+5);
                       
                                LCD1602_Write_Dat( shi/10 + 0x30 ); //显示时
                                LCD1602_Write_Dat( shi%10 + 0x30 );
                                LCD1602_Write_Dat( ':' );
                                LCD1602_Write_Dat( fen/10 + 0x30 );//显示分
                                LCD1602_Write_Dat( fen%10 + 0x30 );
                                LCD1602_Write_Dat( ':' );
                                LCD1602_Write_Dat( miao/10 + 0x30 );//显示秒
                                LCD1602_Write_Dat( miao%10 + 0x30 );
        }
}

[1] [1]
关键字:STM32  电子时钟  1602显示 引用地址:STM32电子时钟1602显示仿真加程序

上一篇:一款DAC模块(TLV5608&TLV5610)STM32源程序
下一篇:STM32用DAC播放WAV数据源程序

推荐阅读最新更新时间:2024-11-06 12:22

STM32PB2(BOOT1)使用注意
STM32 PB2(BOOT1)使用注意 由于STM32 PB2脚是复用引脚,而且该复用功能是用于启动选择,使用时就要小心了 ------------------------------------------------------------------------- BOOT1 BOOT0 启动模式 说明 X 0 用户闪存存储器 用户闪存存储器被选为启动区域 0 1 系统存储器 系统存储器被选为启动区域(进入ISP模式) 1 1 内嵌SRAM 内嵌SRAM被选为启动区域 ----------------------------
[单片机]
STM32中SYSTICK定时器、端口复用和重映射
第一部分STM32SYSTICK定时器: systick 定时器按照字面意思就知道是一个简单的定时器,主要用来做延时,以避免MCU的资源浪费。 它是一个24位的倒置计数器,倒置的意思就是从最大数字递减到0,SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常,即用于中断系统。 systick有四个寄存器分别如下: 1、CTRL SysTick 控制和状态寄存器 LOAD :主要用于使能 systick定时器,异常请求,选择内部还是外部时钟,计数是否为零标志位 2、SysTick 自动重装载除值寄存器 :就是存放计数递减到零以后所自动装载的值。 3、VAL SysTick 当前值寄存器 CALIB :按照意思
[单片机]
使用STM32的TIMER进行外部计数
使用ETR引脚的输入信号作为计数时钟,本例程使用Timer 2,其ETR输入引脚为PA1,该引脚工作模式为输 入模式,Timer的工作模式为从模式;另外使用PC6输出一模拟方波时钟信号。 测试时将PC6与PA1短接。(用户也可另外连接一个时钟信号到PA1引脚上。) 代码见下: int main(void) { unsigned char i_Loop; unsigned char n_Counter; #ifdef DEBUG debug(); #endif RCC_Configuration(); // System Clocks Configuration NVIC_Configuration();
[单片机]
STM32的硬件I2C实现及问题
虽然软件可实现I2C读取三轴传感器数据,但I2C作为一种重要的通信协议是一定要搞清楚问题所在的,SO继续研究之前的问题。(网上传言STM32硬件I2C有问题,但仍然有人实现出来) 再次启动程序,依旧是停在原来的位置 等待EV6,网上搜索相关问题好多人都停在了等待EV5上。分析EV5等待问题,主机发送起始信号,没能接受从设备发送的应答, 或者可能都没有发送。此问题应该是接线或IIC初始化代码的问题。 而我此时停在等待EV6,说明已检测到该设备。换句话说从设备已经知道了主设备的存在。却在主设备发送设备地址之后,接受不到从设备的应答信号,自己分析有两种可能,一是设备地址错误,从设备接受到不是自身的设备而地址自然不会应答
[单片机]
<font color='red'>STM32</font>的硬件I2C实现及问题
STM32—RTC
什么是RTC ? RTC:实时时钟(Real-Time Clock),利用RTC可以实现产品的精确计时,比如平时用的笔记本电脑、电子日历等都有RTC模块,当主电源断电时,RTC的模块用电池来供电,继续进行计时。STM32中的RTC和定时器有点类似,有一个32位的计数器,可以计数2的32次方,大约可以计时136年。 RTC的结构框图 RTC的时钟源(STM32L1系列,其它系列的芯片时钟源会略有不同,但都是这三类): (1) LSE 32.768kHz (2)HSE,最大1Mhz (3)LSI,内部低速时钟,L1系列是37k,F2系列是32K,F4系列是40K,频率不一样,预分频值的设定也不一样。 RT
[单片机]
<font color='red'>STM32</font>—RTC
STM32通用定时器TIM25基本用法
STM32的定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以做PWM输出或者输入捕获功能。从系统框架图下看,名为TIMx的有八个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在APB1总线上。其中TIM1&TIM8称为高级控制定时器(advancedcontroltimer).他们所在的APB2总线也比APB1总线要好。APB2可以工作在72MHz下,而APB1最大是36MHz。 由上图可知,当APB1的预分频系数为1 时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8 或16)时,这个倍频
[单片机]
<font color='red'>STM32</font>通用定时器TIM25基本用法
STM32 Dali库是什么?
DALI库适用于STM32F系列和STM32L系列单片机。 在STM32单片机中的DALI包中有: 1.STM32F和STM32L系列的Dali从机示例 2.用户手册DALI从机接口 STM32 Dali Slave库根据DALI规范进行了测试。 STM32L1xx Dali 从机接口的文档是UM1629. STM32F1xx Dali 从机接口的文档是UM1728 用于DALI通信的STM8S-Discovery接口的插入式硬件模块是STEVAL-ILM001V1 以上是STM32 Dali的基础知识,希望对用户有所帮助。
[单片机]
STM32软件学习】ST-LINK Utility的使用
STM32 ST-LINK Utility软件主要的功能就是量产(批量下载代码的工具)。 它也是比较实用的一个工具,当我们需要查看芯片FLASH数据时,可以很快定位查找到想要的数据(前提是没有添加保护)。 需要配和STLink使用。 接线,SWD接口。 VCC GND SCLK SDIO和单片机分别相对即可! keil在线使用 选择ST-Linker Debugger 这里务必检查,又没出出现DeviceName,没有出现的话就得,重新检查接线!! 擦除整片扇区,然后选择相应的Flash大小编程算法,比如我用C8T6,那就选对应128K的F10X算法! 最后load到单片机! 使用STM32
[单片机]
【<font color='red'>STM32</font>软件学习】ST-LINK Utility的使用
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved