找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2818|回复: 1
收起左侧

stm32滴答定时器+LCD1602显示真实系统时钟Proteus仿真

[复制链接]
ID:548850 发表于 2021-10-7 14:20 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

LCD1602显示系统真实时钟

LCD1602显示系统真实时钟


单片机源程序如下:
#include "stm32f10x.h"
void LCD1602_GPIO_Config(void)
{
        RCC_APB2PeriphClockCmd(LCD1602_CLK, ENABLE);
        GPIO_InitTypeDef LCD1602_GPIOStruct;
        LCD1602_GPIOStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        LCD1602_GPIOStruct.GPIO_Speed = GPIO_Speed_10MHz;
        LCD1602_GPIOStruct.GPIO_Pin =  LCD1602_E | LCD1602_RS | LCD1602_RW ;
        GPIO_Init(LCD1602_GPIO_PORT,&LCD1602_GPIOStruct);
        //LCD1602_GPIOStruct.GPIO_Mode = GPIO_Mode_Out_OD;
        LCD1602_GPIOStruct.GPIO_Pin =   DB0 |  DB1 | DB2 |DB3 |  DB4 | DB5|
                                                                                                                                        DB6 |  DB7 ;     //若设置为开漏输出 需要上拉电阻
        GPIO_Init(LCD1602_GPIO_PORT,&LCD1602_GPIOStruct);
}

void LCD1602_WaitReady(void) //检测忙状态
{
        uint8_t sta;

        LCD1602_GPIO_PORT->ODR =0x00FF;
        RSO(0);
        RWO(1);
        EO(1);
        SysTick_Delay_Us(1);
        do{
                sta=GPIO_ReadInputDataBit(LCD1602_GPIO_PORT,GPIO_Pin_7);
                EO(0);
        }while(sta);
}

void LCD1602_WriteCmd(uint8_t cmd) //写指令
{
        LCD1602_WaitReady();
        RSO(0);
        RWO(0);
        EO(0);
        SysTick_Delay_Us(1);
        EO(1);
        LCD1602_GPIO_PORT->ODR &= (cmd|0xFF00);
        EO(0);
        SysTick_Delay_Us(400);
}

void LCD1602_WriteDat(uint8_t dat) //写数据
{
        LCD1602_WaitReady();
        RSO(1);
        RWO(0);
        SysTick_Delay_Us(30);
        EO(1);
        LCD1602_GPIO_PORT->ODR &=(dat|0xFF00);
        EO(0);
        SysTick_Delay_Us(400);
}

void LCD1602_SetCursor(uint8_t x, uint8_t y)
{
    uint8_t addr;

    if (y == 0)  //由输入的屏幕坐标计算显示RAM的地址
        addr = 0x00 + x;  //第一行字符地址从0x00起始
    else
        addr = 0x40 + x;  //第二行字符地址从0x40起始
    LCD1602_WriteCmd(addr|0x80);  //设置RAM地址
}

void LCD1602_ShowStr(uint8_t x, uint8_t y, uint8_t *str, uint8_t len)
{
    LCD1602_SetCursor(x, y);        //设置起始地址
    while (len--)         //连续写入len个字符数据
    {
        LCD1602_WriteDat(*str++);
    }
}





void LCD1602_Init(void)
{
          LCD1602_GPIO_Config();   //开启GPIO口
    LCD1602_WriteCmd(0X38);  //16*2显示,5*7点阵,8位数据接口
    LCD1602_WriteCmd(0x0C);  //显示器开,光标关闭
    LCD1602_WriteCmd(0x06);  //文字不动,地址自动+1
    LCD1602_WriteCmd(0x01);  //清屏
}
        
int main(void)
{ uint8_t str[8];
        RCC_ClocksTypeDef RCC_Clocks;                        //时钟结构体

        SysTick_Init(); //滴答定时器初始化
  LCD1602_Init();        


        RCC_GetClocksFreq(&RCC_Clocks);                //获取片上时钟
        str[0]=RCC_Clocks.SYSCLK_Frequency/10000000+0x30;
        str[1]=RCC_Clocks.SYSCLK_Frequency/1000000%10+0x30;
        LCD1602_ShowStr(0,0,"sysclk:",7);
        LCD1602_ShowStr(7,0,str,2);
        LCD1602_ShowStr(9,0,"MHz",3);
        while(1);
}
void SysTick_Delay_Us( __IO uint32_t us)  //us延时函数
{
        uint32_t i;
        RCC_GetClocksFreq(&RCC_Clocks);                //获取片上真实系统时钟
        SysTick_Config(RCC_Clocks.SYSCLK_Frequency/1000000);
        
        for(i=0;i<us;i++)
        {
                // 当计数器的值减小到0的时候,CRTL寄存器的位16会置1        
                while( !((SysTick->CTRL)&(1<<16)) );
        }
        // 关闭SysTick定时器
        SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}

void SysTick_Delay_Ms( __IO uint32_t ms)  // ms延时函数
{
        uint32_t i;        
        RCC_GetClocksFreq(&RCC_Clocks);                //获取片上真实系统时钟
        SysTick_Config(RCC_Clocks.SYSCLK_Frequency/1000);
        
        for(i=0;i<ms;i++)
        {
                // 当计数器的值减小到0的时候,CRTL寄存器的位16会置1
                // 当置1时,读取该位会清0
                while( !((SysTick->CTRL)&(1<<16)) );
        }
        // 关闭SysTick定时器
        SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}

51hei.png
全部资料51hei附件下载:
滴答定时器LCD1602仿真代码.7z (189.71 KB, 下载次数: 97)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:984343 发表于 2021-12-20 21:31 来自手机 | 显示全部楼层
仿真图是Proteus8.8版本的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表