📄 最后完整的串行显示程序.c
字号:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit L_SCK =P3^2;
sbit L_SI =P3^1;
sbit L_EN =P3^0;
sbit L_PS= P3^3;
#define LOW 0
#define HIGH 1
void lcd_writecmd(unsigned char lcddata)
{
unsigned char lcdopt;
register unsigned char i;
register unsigned char temp;
EA=0;
L_EN = LOW;
L_SI = LOW;
L_SCK = LOW;
L_EN = HIGH;
L_SI = HIGH;
for (i=0;i<5;i++)//写前五位1
{
L_SCK = HIGH;L_SCK = LOW;
}
L_SI = LOW; //写如后三位0
L_SCK = HIGH;
L_SCK = LOW;
L_SI = LOW;
L_SCK = HIGH;
L_SCK = LOW;
L_SI = LOW;
L_SCK = HIGH;
L_SCK = LOW;
temp = lcddata&0xf0;
for (i=0;i<8;i++)
{
L_SI = (temp&0x80)?HIGH:LOW;
temp <<=1;
L_SCK = HIGH;
L_SCK = LOW;
}
temp = (lcddata<<4)&0xf0;
for (i=0;i<8;i++)
{
L_SI = (temp&0x80)?HIGH:LOW;
temp <<=1;
L_SCK = HIGH;L_SCK = LOW;
}
L_EN = LOW;
L_SI = LOW;
L_SCK = LOW;
lcdopt = 0;
EA=1;
}
/***************************************************
//写数据
/**************************************************/
void lcd_writedata(unsigned char lcddata)
{
register unsigned char temp;
register unsigned char i;
unsigned char lcdopt;
EA=0;
L_EN = LOW;
L_SI = LOW;
L_SCK = LOW;
L_EN = HIGH;
// 11111 010,写数据
L_SI = HIGH;
for (i=0;i<5;i++){L_SCK = HIGH;L_SCK = LOW;}
L_SI = LOW;
L_SCK = HIGH;L_SCK = LOW;
L_SI = HIGH;
L_SCK = HIGH;L_SCK = LOW;
L_SI = LOW;
L_SCK = HIGH;L_SCK = LOW;
// HHHH0000,写高四位
temp = (lcddata)&0xf0;
for (i=0;i<8;i++)
{
L_SI = (temp&0x80)?HIGH:LOW;
temp <<=1;
L_SCK = HIGH;L_SCK = LOW;
}
// LLLL0000,写低四位
temp = ((lcddata)<<4)&0xf0;
for (i=0;i<8;i++)
{
L_SI = (temp&0x80)?HIGH:LOW;
temp <<=1;
L_SCK = HIGH;L_SCK = LOW;
}
L_EN = LOW;
L_SI = LOW;
L_SCK = LOW;
lcdopt = 0;
EA=1;
}
void lcd_cmd(unsigned char cmd,unsigned char opt)
{
switch (cmd)
{
//基本指令 //扩展指令
case 0:lcd_writecmd(0x01);break; //清除 //待命模式
case 1:lcd_writecmd(0x02);break; //位址归位 //卷动位址或RAM位址选择
case 2:opt&=0x03;lcd_writecmd(0x04|opt);break; //进入点设定 //反白选择
case 3:opt&=0x07;lcd_writecmd(0x08|opt);break; //显示状态 //睡眠模式
case 4:opt&=0x0f;lcd_writecmd(0x10|opt);break; //游标或显示移位控制 //扩充功能设定
case 5:opt&=0x1f;lcd_writecmd(0x20|opt);break; //功能设定 //设定ICONRAM位址或卷动位址
case 6:opt&=0x3f;lcd_writecmd(0x40|opt);break; //CGRAM位址 //设定绘图RAM位址
case 7:opt&=0x3f;lcd_writecmd(0x80|opt);break; //DDRAM位址
}
}
void lcd_home(void)
{
lcd_cmd(1,0);
lcd_cmd(2,0x02);
}
/***************************************************
//LCD初始化
/**************************************************/
void lcd_init(void)
{
L_PS = 0;
lcd_cmd(5,0x10);
lcd_cmd(5,0x10);
lcd_cmd(3,0x04);
lcd_cmd(2,0x02);
lcd_cmd(0,0);
}
/***************************************************
//写入字符串
/**************************************************/
void lcd_writestr(unsigned char l_line,unsigned char l_site,unsigned char * words)
{
// l_line:行0-3; l_site:列 0-7; words:中英字符
unsigned char c;
c = 0;
l_site = l_site % 8; //使列在0-7范围
if(l_line>1) //若行=2,3
{
l_line = l_line % 2; //2行变0行,3行变1行
l_site = l_site + 8; //列加8
}
l_site = (l_line<<4) + l_site; //行*16+列
lcd_cmd(7,l_site); //DDRAM地址
while(*words != 0) //写字符
{
unsigned char tempdata;
tempdata = *words;
lcd_writedata(tempdata);
words++;
l_site++;
c++;
}
if (c%2) //写完数据,若最后一个字符列号是奇数则补空格
{
lcd_writedata(0x20);
}
}
/***************************************************
//主函数
/**************************************************/
void main()
{
unsigned int shuiliang1=456;
unsigned int shuiliang2=411;
unsigned int zongshuiliang=shuiliang1+shuiliang2;
unsigned int FT=64;
unsigned int ST=66;
unsigned char s1[6];
unsigned char s2[6];
unsigned char zong[6];
unsigned char time1[6];
unsigned char time2[6];
s1[2] = (unsigned char)((shuiliang1 % 10) + 0x30);
s1[1] = (unsigned char)(((shuiliang1 / 10) % 10) + 0x30);
s1[0] = (unsigned char)(((shuiliang1 / 100) % 10) + 0x30);
s2[2] = (unsigned char)((shuiliang2 % 10) + 0x30);
s2[1] = (unsigned char)(((shuiliang2 / 10) % 10) + 0x30);
s2[0] = (unsigned char)(((shuiliang2 / 100) % 10) + 0x30);
zong[3] = (unsigned char)((zongshuiliang % 10) + 0x30);
zong[2] = (unsigned char)(((zongshuiliang / 10) % 10) + 0x30);
zong[1] = (unsigned char)(((zongshuiliang / 100) % 10) + 0x30);
zong[0] = (unsigned char)(((zongshuiliang / 1000) % 10) + 0x30);
time1[1] = (unsigned char)((FT % 10) + 0x30);
time1[0] = (unsigned char)(((FT / 10) % 10) + 0x30);
time2[1] = (unsigned char)((ST % 10) + 0x30);
time2[0] = (unsigned char)(((ST / 10) % 10) + 0x30);
lcd_init();//初始化,开机调用一次
lcd_home();
lcd_writestr(0,0,"第一次:");
lcd_writestr(0,4,s1);
lcd_writestr(0,7,"ml");
lcd_writestr(1,0,"第二次:");
lcd_writestr(1,4,s2);
lcd_writestr(1,7,"ml");
lcd_writestr(2,0,"总水量:");
lcd_writestr(2,4,zong);
lcd_writestr(3,0,"FT:");
lcd_writestr(3,2,time1);
lcd_writestr(3,3,"秒");
lcd_writestr(3,4,"ST:");
lcd_writestr(3,6,time2);
lcd_writestr(3,7,"秒");
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -