怎样才能用51单片机串口打开失败接收的数据,刷新到Lcd12864

查看: 3263|回复: 0
lcd12864以串行的方式进行通信的单片机源程序
/********************************************************************
* 文件名&&: 串行12864显示.c
* 描述& & :&&该程序实现了12864以串行的方式进行通信。
* 创建人&&: 东流,日
* 版本号&&: 2.0
***********************************************************************/
#include &reg52.h&
#include &intrins.h&
#define uchar unsigned char
#define uint&&unsigned int
sbit CS=P2^5;& &&&//片选信号
sbit SID=P2^6;&&//数据信号
sbit SCLK=P2^7;&&//时钟信号
sbit RST=P2^2;&&//复位信号
sbit CH = P2^4;&&//并行、串行选择信号
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间为 100us * t。这是通过软件延时,有一定误差。
* 输入 : t
* 输出 : 无
***********************************************************************/
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0; i&t;&&i++)
& & for(j=0; j&10; j++);
}
/********************************************************************
* 名称 : sendbyte()
* 功能 : 按照液晶的串口通信协议,发送数据
* 输入 : zdata
* 输出 : 无
***********************************************************************/
void sendbyte(unsigned char zdata)
{
for(i=0; i&8; i++)
{
&&if((zdata && i) & 0x80)
&&{
& &SID = 1;
&&}
&&else
&&{
& &SID = 0;
&&}
&&SCLK = 0;
&&SCLK = 1;
}
}
/********************************************************************
* 名称 : write_com()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void write_com(unsigned char cmdcode)
{
CS = 1;
sendbyte(0xf8);
sendbyte(cmdcode & 0xf0);
sendbyte((cmdcode && 4) & 0xf0);
delay(2);
}
/********************************************************************
* 名称 : write_data()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void write_data(unsigned char Dispdata)
{
CS = 1;
sendbyte(0xfa);
sendbyte(Dispdata & 0xf0);
sendbyte((Dispdata && 4) & 0xf0);
delay(2);
}
/********************************************************************
* 名称 : lcdinit()
* 功能 : 初始化函数
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void lcdinit()
{&&
RST = 0;
delay(100);
RST = 1;
delay(20000);
write_com(0x30);
delay(50);
write_com(0x0c);
delay(50);
}
/********************************************************************
* 名称 : hzkdis()
* 功能 : 显示字符串
* 输入 : *s
* 输出 : 无
***********************************************************************/
void hzkdis(unsigned char code *s)
{&&
while(*s & 0)
& & {
&&write_data(*s);
&&s++;
&&delay(50);
& & }
}
/********************************************************************
* 名称 : Test()
* 功能 : 显示子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Test()
{&&
write_com(0x03);
delay(50);& &
write_com(0x81);
hzkdis(&& &HOT-51&);
write_com(0x91);
hzkdis(&单片机开发板&);
write_com(0x89);
hzkdis(&& && && & &);
write_com(0x98);
hzkdis(&& & 东流电子&);
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
CH = 0;
delay(1);
lcdinit();
delay(10);
while(1)
{
&&Test();
&&delay(5000);
}
}复制代码
Powered by51单片机LCD1602如何显示串口助手发过来的一串数据-CSDN论坛
单片机/工控
51单片机LCD1602如何显示串口助手发过来的一串数据
最近写了一个程序,可以把串口助手发送的一个字符(比如1,2,3,a,A,b)显示到LCD1602中,但是如果发送一串数据(比如1234,abcd),LCD也只能显示一位数据而且是最后一位数据:下面是我写的一个程序:
#include&reg51.h&
#include"lcd.h"
void&chuankoushezhi();
void&main(void)
LcdInit();
//LCD显示频初始化
chuankoushezhi(); //串口设置
LcdWriteCom(0x80); &&//LCD第一行第一个开始显示
& chuankoushuju=SBUF;
& LcdWriteData(chuankoushuju);&&&//显示接收到的数据
void&chuankoushezhi()
&&&//串口设置波特率为4800;
&&SCON=0X50;
&&TMOD=0X20;
&&PCON=0x80;
&&TH1=0XF3;
&&TL1=0XF3;
void&chuankou()&interrupt&4
//串口中断程序
&&&chuankoushuju=SBUF;
&&&while(!TI);
现在有什么难度?感觉很简单啊
我们学的还是MOV.MOVX....汇编,你敢信
标签:51串口
#include&&reg52.h&
#define&uchar&unsigned&char
#define&uint&unsigned&int
void&delay(uint&ms)
for(i=0;i&i++)
&&&for(j=0;j&112;j++);
void&init()
TMOD=&0X20;&&&//T1&方式2&,8位&&&自动重装&&
TL1=0X&&&&//9600
TR1=1;&&&&//&定时器1启动
//SCON=&0X40;&&&//&串口工作模式&1
SM0=0;&//&设置串口的工作模式
SM1=1;&&&&&//方式1
REN=0;&&&&//&不允许串口接收数据
//ES=1;&//&串口中断应许
//EA=1;&&&//&开启中断
void&uart_sendB(uchar&d)
while(!TI);
void&uart_sendS(uchar&*str)
while(*str)
&&&uart_sendB(*str)&;
&&&delay(1);
void&main()
&&&init();
//uart_sendB('S');
uart_sendS("XXXXXXXXXXXaaa@@@@@@@@@@&");
//uart_sendB(0x0d);&&&&//换行
//uart_sendB(0x0a);
========================================================================
========================================================================
========================================================================
#include&&reg52.h&
#include&"1602.h"
#define&uchar&unsigned&char
#define&uint&unsigned&int
uchar&BUF[30],i=0;
void&delay(uint&ms)
for(e=0;e&e++)
&&&for(j=0;j&112;j++);
void&init_uart()
TMOD=&0X20;&&&//T1&方式2&,8位&&&自动重装
TL1=0X&&&&//9600
TR1=1;&&&&&//&定时器1启动
//SCON=&0X40;&&&//&串口工作模式&1
SM0=0;&//&设置串口的工作模式
SM1=1;&&&&&//方式1
//SM2&=&1;&&&//;收到有效的停止位时才将RI置1yh
REN=1;&&&&//&允许串口接收数据
ES=1;&&&&//&串口中断应许
EA=1;&&&//&开启中断
void&uart_sendB(uchar&d)
while(!TI);
void&uart_sendS(uchar&*str)
while(*str)
&&&uart_sendB(*str)&;
&&&delay(1);
void&main()
&&&init_uart();
init_1602();
LCD_write_string(0,0,"LYQ");&//列x=0-15,行y=0,1
BUF[0]='\0';
&&&while(1)
&&&LCD_write_string(0,1,BUF);
void&uart_rx(void)&interrupt&4&//using&3
&&&&//RI=0;
&&&&BUF[i++]=SBUF;
&&&//uart_sendB(BUF[i]);
&&&//LCD_write_char(12,1,'i');
这个例程比你上面贴的好一点。
注意初始化时给BUF写了个\0进去,接收中断中收到新数据时却没有写这个字符串结束标志。这样LCD_write可能会跑飞出去。
可以在BUF[i++]=SBUF;后面加一句BUF[i]=0;
这样当缓冲区写满时也还是有问题,可以再加个边界检查&if(i&=28)&i=0;51单片机串口通信和12232LCD显示,实现将接收到的数据实时显示在12232上的功能。_百度知道
51单片机串口通信和12232LCD显示,实现将接收到的数据实时显示在12232上的功能。
问题是,能正常接收数据(24个字节),数据的校验在主程序的循环中实现,但是用定时器刷屏时lcd上的数据不变。不知道原因出在哪里,求各位高手指点!
我有更好的答案
用得定时中断吧?,是否在进入中断的时候,你存储的数区出错了!如果没必要的话,程序就直接收到就显示,不用再搞定时了!
但是,显示程序太长了,串口接收到数据经校验后显示的话,根本实现不了数据的动态显示。我想知道的是怎么样将串口接收,校验,显示这三部分协调起来(因为这三部分的程序都比较长),实现动态显示。谢谢了!
那就很正常了,显示程序很长,一个显示,中断了无数次,你这个工作肯定不正常!你想,中断是不管任何时候都会进行的,而你的缓存数据却是同一个地址,可能问题就出在这
为您推荐:
其他类似问题
您可能关注的内容
51单片机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。&>&解决51单片机用串口显示12864zk问题无显示
解决51单片机用串口显示12864zk问题无显示
上传大小:338KB
解决51单片机用串口显示12864问题无显示,压缩包内包含使用手册和代码,亲测可用,要注意的是12864分为LCD12864和LCM12864的,背面带12864zk的是LCM12864,也就是上传的文件,采用串行显示,使用的是stc12c5a60s2,亲测可用,注意LCM12864和LCD12864使用时不一样的
综合评分:0
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有0条
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
解决51单片机用串口显示12864zk问题无显示
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*投诉人姓名:
*投诉人联系方式:
*版权证明:
*详细原因:
解决51单片机用串口显示12864zk问题无显示}

我要回帖

更多关于 单片机串口发送数据 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信