📄 lcd1602_刷新显示.c
字号:
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_()
#define CYCLE 50000
#define DB0_DB7 P0
/*"(桃心)This is a demo for 51 controlling 1602LCD!"的代码表*/
static const uchar code table[]={0x00,
0x54,0x68,0x69,0x73,
0x20,0x69,0x73,0x20,
0x61,0x20,0x64,0x65,
0x6d,0x6f,0x20,0x66,
0x6f,0x72,0x20,0x35,
0x31,0x40,0x63,0x6f,
0x6e,0x74,0x72,0x6f,
0x6c,0x6c,0x69};
static const uchar code table1[]={0x31,0x32,
0x34,0x36};
static const uchar code CGRAM_ADD[]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47}; //造字地址
static const uchar code CGRAM[]={0x0a,0x15,0x11,0x06,0x04,0x00,0x00,0x00}; //造字数据
sbit RS=P2^7;
sbit RW=P2^6;
sbit E=P2^5;
uchar Dataflag,Cmdflag;
uint counti,counti1;
void init();
void Write(uchar tempdata); /*写命令函数*/
void WriteDDR(uchar tempdata); /*写数据函数*/
void CheckBusy(); /*查询1602状态函数*/
void Delay(uint N); /*延时程序*/
void main(void)
{
TMOD=0x11; /*TIMER0工作在MODE1*/
TH0=(65536-CYCLE)/256; /*设定TIMER0每隔CYCLEμs中断一次*/
TL0=(65536-CYCLE)%256;
TH1=(65536-CYCLE)/256; /*设定TIMER0每隔CYCLEμs中断一次*/
TL1=(65536-CYCLE)%256;
TR0=1;
TR1=1;
IE=0x8a;
init();
counti=0;
counti1=0;
while(1)
nop;
}
void Delay(uint N) /*延时子程序*/
{
uint i;
for(i=0;i<N;i++)
{
i=i;
}
}
void init() /*1602初始化子程序*/
{
RS=0;
RW=0;
E=1;
Write(0x38);
Delay(1000);
Write(0x38);
Delay(1000);
Write(0x38);
Write(0x0C);
Write(0x01);
Write(0x0c);
Write(0x06);
Write(0x01); /*预清屏*/
}
void Write(uchar tempdata) /*1602写命令子程序*/
{
DB0_DB7=tempdata;
RS=0;
RW=0;
E=0;
nop;
E=1;
nop;
CheckBusy();
}
void WriteDDR(uchar tempdata) /*1602写数据子程序*/
{
DB0_DB7=tempdata;
RS=1;
nop;
RW=0;
E=0;
nop;
E=1;
nop;
CheckBusy();
}
void CheckBusy() /*1602查忙状态子程序*/
{
uchar temp;
DB0_DB7=0xff;
RW=1;
RS=0;
E=0;
nop;
E=1;
do
{
nop;
temp=DB0_DB7;
}while((temp&0x80)==0x80);
RW=0;
}
void service_int0 () interrupt 1 using 2 /*Timer0中断子程序*/
{
static uchar s_Counter;
TR0=0;
TF0=0;
if(s_Counter<=7) //写入CGRAM
{
Write(CGRAM_ADD[s_Counter]);
WriteDDR(CGRAM[s_Counter]);
}
if(s_Counter==7)
Write(0x80);
s_Counter++;
if(s_Counter>=8) /*判断一秒到否*/
{
if(counti<16) /*未到屏幕第一行的末尾*/
{
WriteDDR(table[counti]);
counti++;
}
else if(counti==16)
{
Write(0xc0);
WriteDDR(table[counti]);
counti++;
}
else if(counti>16 && counti<(sizeof(table))) /*到达屏幕第一行的末尾,开始滚动显示直至字符串末尾*/
{
WriteDDR(table[counti]);
counti++;
}
}
TH0=(65536-CYCLE)/256; /*设定TIMER0每隔CYCLEμs中断一次*/
TL0=(65536-CYCLE)%256;
if(counti<(sizeof(table)))
TR0=1;
}
void service_int1 () interrupt 3 using 3
{
static uchar s_Counter1=0;
TR1=0;
TF1=0;
s_Counter1++;
if(s_Counter1>=20) /*判断一秒到否*/
{
if(s_Counter1%50==0)
{
Write(0xc4);
WriteDDR(table1[counti1]);
counti1++;
WriteDDR(table1[counti1]);
if(counti1>=(sizeof(table1)))
counti1=0;
}
}
TH1=(65536-CYCLE)/256; /*设定TIMER0每隔CYCLEμs中断一次*/
TL1=(65536-CYCLE)%256;
TR1=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -