今天看到一个论坛提问,怎么防止lcd1602的忙判断导致的阻塞,进而影响其他程序的运行。特此写了一下代码,该代码在stm32f1 72M情况下运行时间大概十几微妙,51单片机环境下应该会更久一下,没办法,51性能比较弱。
代码分为lcd1602.c、lcd1602.h、以及main.c(主要演示下怎么使用该代码。)
lcd1602.h如下所示。
- #ifndef __LCD1602_H_
- #define __LCD1602_H_
- /**********************************
- 包含头文件
- **********************************/
- #include <REGX52.H>
- typedef unsigned long uint32_t;
- typedef unsigned int uint16_t;
- typedef unsigned char uint8_t;
- /**********************************
- PIN口定义
- **********************************/
- #define LCD1602_DATAPINS P0
- sbit LCD1602_RS = P2 ^ 6;
- sbit LCD1602_RW = P2 ^ 5;
- sbit LCD1602_E = P2 ^ 7;
- /**********************************
- 函数声明
- **********************************/
- extern void MngLCD1602_Init( void );
- extern void MngLCD1602_Handle( void );
- extern void displayString( uint8_t x, uint8_t y, uint8_t* dat, uint8_t len);
- #endif
复制代码 lcd1602.c如下所示
- #include "lcd1602.h"
- #include <string.h>
- #define LCD1602_ROW_NUM 2u
- #define LCD1602_COLUMN_NUM 16u
- #define LCD1602_READ_DATA() (LCD1602_DATAPINS)
- #define LCD1602_WRITE_DATA(dat) (LCD1602_DATAPINS = (uint8_t)dat)
- #define LCD1602_SET_RS_H() (LCD1602_RS = 1)
- #define LCD1602_SET_RS_L() (LCD1602_RS = 0)
- #define LCD1602_SET_RW_H() (LCD1602_RW = 1)
- #define LCD1602_SET_RW_L() (LCD1602_RW = 0)
- #define LCD1602_SET_E_H() (LCD1602_E = 1)
- #define LCD1602_SET_E_L() (LCD1602_E = 0)
复制代码 main.c
- #include <REGX52.H>
- #include <stdio.h>
- #include "lcd1602.h"
- #define MAIN_FOSC_DELAY 12000000UL
- #define T1MS_0 (65536-MAIN_FOSC_DELAY/12/1000) //1ms timer calculation method in 12T mode
- #define T1MS_1 (65536-MAIN_FOSC_DELAY/12/1000) //1ms timer calculation method in 12T mode
- #define TIMER_MODE0 0x00
- #define TIMER_MODE1 0x01
- #define TIMER_MODE2 0x02
- #define TIMER_MODE3 0x03
- static bit _1_ms_flag = 0; //1ms标志位
- static bit _100ms_flag = 0; //100ms标志位
- static bit _500ms_flag = 0; //500ms标志位
- static void Timer0Init( void );
- //主函数
- int main( void )
- {
- idata float disTemp[4] = {0};
- idata unsigned char display_buf[16];//显示数组
- idata unsigned int display_len;//显示数据长度
- Timer0Init();
- MngLCD1602_Init();//LCD1602初始化
- EA = 1;
- while( 1 )
- {
- if(1 == _100ms_flag)
复制代码 Keil代码与Proteus7.8仿真下载::
keil.zip
(135.3 KB, 下载次数: 42)
|