智能广告牌设计
可选择左右屏幕移动
通过串口修改字幕内容
显示实时时间和温度
cpp#号按键可以清空广告,别的字符串广告直接串口输入即可
c#include <reg52.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int rtc_hour = 16, rtc_min = 59, rtc_sec = 55; /* 时间 */
bit flag1s = 0; /* 1s定时标志 */
unsigned char T0RH = 0; /* T0重载值的高字节 */
unsigned char T0RL = 0; /* T0重载值的低字节 */
unsigned char count_str = 0; /* 计数多少个字符 */
void ConfigTimer0( unsigned int ms );
unsigned char IntToString( unsigned char *str, int dat );
extern bit Start18B20();
extern bit Get18B20Temp( int *temp );
extern void InitLcd1602();
extern void LcdShowStr( unsigned char x, unsigned char y, unsigned char *str );
void dis_time(); /* 刷新时间显示 */
void display( char num ); /* 显示一个字符串 */
void SerInit( void ); /* 初始化串口 */
char start_char_num = 0;
char zifu1[16] = "123456789aqwerty";
sbit out = P2 ^ 3;
sbit key_in1 = P2 ^ 4;
void main()
{
bit res;
int temp; /* 读取到的当前温度值 */
int intT, decT; /* 温度值的整数和小数部分 */
unsigned char len;
unsigned char str[12];
char dir = 0;
out = 0; /* 输出低电平 */
EA = 1; /* 开总中断 */
ConfigTimer0( 10 ); /* T0定时10ms */
Start18B20(); /* 启动DS18B20 */
InitLcd1602(); /* 初始化液晶 */
SerInit();
while ( 1 )
{
if ( key_in1 == 0 )
{
if ( key_in1 == 0 )
{
while ( key_in1 == 0 )
;
dir = !dir;
start_char_num=2;
}
}
if ( flag1s ) /* 每秒更新一次温度 */
{
TR0 = 0; /* 短暂关闭计时 防止冲突 */
flag1s = 0;
res = Get18B20Temp( &temp ); /* 读取当前温度 */
if ( res ) /* 读取成功时,刷新当前温度显示 */
{
intT = temp >> 4; /* 分离出温度值整数部分 */
decT = temp & 0xF; /* 分离出温度值小数部分 */
len = IntToString( str, intT ); /* 整数部分转换为字符串 */
str[len++] = '.'; /* 添加小数点 */
decT = (decT * 10) / 16; /* 二进制的小数部分转换为1位十进制位 */
str[len++] = decT + '0'; /* 十进制小数位再转换为ASCII字符 */
while ( len < 6 ) /* 用空格补齐到6个字符长度 */
{
str[len++] = ' ';
}
str[len] = '\0'; /* 添加字符串结束符 */
LcdShowStr( 0, 0, str ); /* 显示到液晶屏上 */
}else { /* 读取失败时,提示错误信息 */
LcdShowStr( 0, 0, "error!" );
}
Start18B20(); /* 重新启动下一次转换 */
if ( dir == 0 )
{
start_char_num++; /* 从哪里开始显示 */
if ( start_char_num >= 16 )
{
start_char_num = 0;
}
display( start_char_num ); /* 显示哪一个字符 从哪开始显示 */
}else{
start_char_num--; /* 从哪里开始显示 */
if ( start_char_num == -1 )
{
start_char_num = 15;
}
display( start_char_num ); /* 显示哪一个字符 从哪开始显示 */
}
TR0 = 1; /* 打开计时 */
}
}
}
/* 整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度 */
unsigned char IntToString( unsigned char *str, int dat )
{
signed char i = 0;
unsigned char len = 0;
unsigned char buf[6];
if ( dat < 0 ) /* 如果为负数,首先取绝对值,并在指针上添加负号 */
{
dat = -dat;
*str++ = '-';
len++;
}
do /* 先转换为低
}
*str = '\0'; /* 添加字符串结束符 */
return(len); /* 返回字符串长度 */
}
/* 配置并启动T0,ms-T0定时时间 */
void ConfigTimer0( unsigned int ms )
TH0 = T0RH; /* 加载T0重载值 */
TL0 = T0RL;
ET0 = 1; /* 使能T0中断 */
TR0 = 1; /* 启动T0 */
}
/* T0中断服务函数,完成1秒定时 */
void InterruptTimer0() interrupt 1
{
static unsigned char tmr1s = 0;
TH0 = T0RH; /* 重新加载重载值 */
TL0 = T0RL;
tmr1s++;
if ( tmr1s >= 100 )
}
/* /刷新时间的显示 */
dis_time();
}
}
void Uart_isr() interrupt 4 /* 中断接收程序 */
{
char Txd_data = 0;
if ( RI ) /* 判断是否接收完,接收完成后,由硬件置RI位 */
{
Txd_data = SBUF; /* 读入缓冲区 */
RI = 0; /* RI清标志 */
if ( Txd_data == '~' ) /* 清空数组 */
{
memset( zifu1, ' ', 16 );
count_str = 0;
}else{
zifu1[count_str++] = Txd_data; /* 字符存入 */
}
}
}
代码工程打开下载:
cpphttps://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!