標題:
51單片機LCD1602之簡易萬年歷源程序
[打印本頁]
作者:
LittleBear0
時間:
2020-4-1 16:28
標題:
51單片機LCD1602之簡易萬年歷源程序
這是小單采集到關于如何在LCD1602上顯示日歷表的一個51小程序,在這里和大家分享下,希望能幫助到有需要的師兄。LCD1602可以簡單的顯示一些字母數(shù)字,但是對于漢字來說,顯示起來還是不太好,不怎么好顯示,畢竟像素比較低,所以這次我們的程序里面用的是英文字母來代替漢字。
單片機源程序如下:
/*******lcd.h*******/
#ifndef _LCD_H_
#define _LCD_H_
#include <reg51.h>
#include <intrins.h>
sbit RS = P2^6;
sbit RW = P2^5;
sbit EN = P2^7;
#define RS_CLR RS = 0
#define RS_SET RS = 1
#define RW_CLR RW = 0
#define RW_SET RW = 1
#define EN_CLR EN = 0
#define EN_SET EN = 1
#define dataport P0
#define uchar unsigned char
extern void DelayUs2x(uchar t);
extern void DelayMs(uchar t);
extern void LCD_Write_COM(uchar com); //寫指令
extern void LCD_Write_Data(uchar Data);
extern void LCD_Clear();
extern void LCD_Write_String(uchar x, uchar y, uchar* s);
extern void LCD_Write_Char(uchar x, uchar y, uchar c);
extern void LCD_Init();
#endif
/*****lcd.c********/
#include "lcd.h"
void DelayUs2x(uchar t)
{
while(--t);
}
void DelayMs(uchar t)
{
while(t--)
{
DelayUs2x(245);
DelayUs2x(245);
}
}
/* bit LCD_Check_busy(void)
{
dataport = 0xff;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return (bit)(dataport&0x80);
} */
//寫指令
void LCD_Write_COM(uchar com)
{
DelayMs(5);
RS_CLR;
RW_CLR;
EN_SET;
dataport = com;
_nop_();
EN_CLR;
}
//寫數(shù)據(jù)
void LCD_Write_Data(uchar Data)
{
DelayMs(5);
RS_SET;
RW_CLR;
EN_SET;
dataport = Data;
_nop_();
EN_CLR;
}
//清屏
void LCD_Clear()
{
LCD_Write_COM(0x01);
DelayMs(5);
}
//輸入字符,x為橫坐標,y為縱坐標
void LCD_Write_String(uchar x, uchar y, uchar* s)
{
if(y == 0)
{
LCD_Write_COM(0x80+x);
}
else
{
LCD_Write_COM(0xC0+x);
}
while(*s)
{
LCD_Write_Data(*s);
s++;
}
}
//輸入字符,x為橫坐標,y為縱坐標
void LCD_Write_Char(uchar x, uchar y, uchar c)
{
if(y == 0)
{
LCD_Write_COM(0x80+x);
}
else
{
LCD_Write_COM(0xC0+x);
}
LCD_Write_Data(c);
}
void LCD_Init() //LCD初始化子程序
{
EN_CLR;
LCD_Write_COM(0x38); //設置顯示模式
DelayMs(5);
LCD_Write_COM(0x38); //設置顯示模式
DelayMs(5);
LCD_Write_COM(0x38); //設置顯示模式
DelayMs(5);
LCD_Write_COM(0x38); //設置顯示模式
DelayMs(5);
LCD_Write_COM(0x0c); //開顯示不顯示光標,光標閃爍
LCD_Write_COM(0x06); //寫一個指針加一
LCD_Write_COM(0x01); //清屏
LCD_Write_COM(0x80); //設置數(shù)據(jù)指針起點
}
/*****main.c*******/
#include "lcd.h"
uchar hour = 21, min = 43, sec = 0, count, date = 28, monse = 4;
unsigned int year = 2017;
void init_T0()
{
EA = 1;
ET0 = 1;
TMOD = 0X01;
TH0 = 0X3C;
TL0 = 0XB0;
TR0 = 1;
}
void main()
{
init_T0();
LCD_Init();
LCD_Clear();
while(1)
{
LCD_Write_String(0, 0, "Date:");
LCD_Write_Char(5, 0, year/1000+48);
LCD_Write_Char(6, 0, year%1000/100+48);
LCD_Write_Char(7, 0, year%100/10+48);
LCD_Write_Char(8, 0, year%10+48);
LCD_Write_Char(9, 0, '-');
LCD_Write_Char(10, 0, monse/10+48);
LCD_Write_Char(11, 0, monse%10+48);
LCD_Write_Char(12, 0, '-');
LCD_Write_Char(13, 0, date/10+48);
LCD_Write_Char(14, 0, date%10+48);
LCD_Write_String(0, 1, "Time:");
LCD_Write_Char(5, 1, hour/10+48);
LCD_Write_Char(6, 1, hour%10+48);
LCD_Write_Char(7, 1, '-');
LCD_Write_Char(8, 1, min/10+48);
LCD_Write_Char(9, 1, min%10+48);
LCD_Write_Char(0xa, 1, '-');
LCD_Write_Char(0xb, 1, sec/10+48);
LCD_Write_Char(0xc, 1, sec%10+48);
}
}
void inter() interrupt 1
{
TH0 = 0X3C;
TL0 = 0XB0;
count++;
if(count >= 20)
{
count = 0;
sec++;
}
if(sec >= 60)
{
sec = 0;
min++;
}
if(min >= 60)
{
min = 0;
hour++;
}
if(hour >= 24)
{
hour = 0;
date++;
}
if(date > 31)
{
date = 0;
monse++;
}
if(monse > 13)
{
monse = 0;
year++;
}
}
復制代碼
所有資料51hei提供下載:
新建 ZIP 壓縮文件.zip
(1.38 KB, 下載次數(shù): 14)
2020-4-1 16:28 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
admin
時間:
2020-4-2 20:34
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1