今天看到一個論壇提問,怎么防止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)
2023-5-24 23:30 上傳
點擊文件名下載附件
非阻塞lcd1602 下載積分: 黑幣 -5
|