永发信息网

单片机c语言,我的单片机是:stc12c5a60s2 液晶是12864 带字库的 我想实现一个功能如下:

答案:2  悬赏:60  手机版
解决时间 2021-11-26 22:35
  • 提问者网友:却不属于对方
  • 2021-11-26 09:40
单片机c语言,我的单片机是:stc12c5a60s2 液晶是12864 带字库的 我想实现一个功能如下:
最佳答案
  • 五星知识达人网友:荒野風
  • 2021-11-26 10:25
//适用于st7920驱动的带字库12864液晶
#include
#include
#include "stdio.h"
void send_com(unsigned char cmd);
void send_data(unsigned char dat);
void print(unsigned char x,unsigned char y,char* str);
#define DATA P0 //P2接数据口
#define uint unsigned int
#define uchar unsigned char
sfr WATCH_DOG=0xc1;
sbit RS=P3^7;
sbit RW=P3^6;
sbit P21=P2^1;
sbit P20=P2^0;
sbit E=P2^2;
uchar gun[16],num,flag;

//

void delay(uint i)
{
char a;
while(i--)
{
for(a=0;a<10;a++);
}
}
void delay1(uint i)
{
while(i--);
}

//测忙碌子程序
//RS=0,RW=1,E=H,D0-D7=状态字

void chek_busy(void)
{ unsigned char temp1;//状态信息(判断是否忙)
P2=0x13;
P20=0;
P21=1;
DATA=0xFF;
RS = 0;
delay1(10);
RW = 1;
delay1(10);
do{
E = 1;
P21=0;
delay1(10);
temp1 = DATA;
E = 0;
delay1(10);
} while(temp1&0x80);//??????
RS = 0;
delay1(10);
RW = 0;
P20=1;
delay1(10);
P2=0x13;
}

read_12864()
{
uchar shuju;
P20=0;
P21=1;
DATA=0xff;
RS=1;
delay1(10);
RW=1;
delay1(10);
E=1;
P21=0;
delay1(10);
shuju=DATA;
E=0;
delay1(10);
P2=0x13;
return(shuju);
}

//写命令子程序

void send_com(unsigned char cmd)
{
chek_busy();
P2=0x13;
delay1(10);
P20=0;
RS = 0;
delay1(10);
RW = 0;
delay1(10);
P21=1;
E = 1;
delay1(10);
DATA = cmd;
E = 0;
P20=1;
delay1(10);
P2=0x13;
}

//写数据子程序

void send_data(unsigned char dat)
{
chek_busy();
P2=0x13;
P20=0;
RS = 1;
delay1(10);
RW = 0;
delay1(10);
P21=1;
E = 1;
delay1(10);
DATA = dat;
E = 0;
P20=1;
delay1(10);
P2=0x13;
}

// 设置字符串显示位置 xpos(0~7),ypos(1~4)

void set_xy(unsigned char xpos,unsigned char ypos)
{
switch(ypos)
{
case 1:
send_com(0x80|xpos);break;
case 2:
send_com(0x90|xpos);break;
case 3:
send_com(0x88|xpos);break;
case 4:
send_com(0x98|xpos);break;
default:break;
}
}

// 在指定位置显示字符串

void print(unsigned char x,unsigned char y,char* str)
{
unsigned char lcd_temp;
set_xy(x,y);
lcd_temp=*str;
while(lcd_temp != 0x00)
{
send_data(lcd_temp);
lcd_temp=*(++str);
}
}

//LCD字库初始化函数

void lcd_str(void)
{
delay(4000);
send_com(0x30);
delay(1000);
send_com(0x0C);
delay(1000);
send_com(0x01);
delay(1000);
send_com(0x06);
}

//LCD图片(扩展)初始化函数

void lcd_pic(void)
{
send_com(0x36);
delay(1000);
send_com(0x36);
delay(1000);
send_com(0x3E);
delay(1000);
send_com(0x01);
}

void serisr() interrupt 4
{
if(RI)
{
RI=0;
gun[num]=SBUF;
num++;
TR0=0;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
}
if(TI)
{
TI=0;
}
}

void t0isr() interrupt 1
{
flag=1;
TR0=0;
}



void main()
{
uint i;
lcd_str();
TMOD=0x01;
ET0=1;
EA=1;
num=0;
flag=0;
while(1)
{
if(flag==1) //10ms没有接收到数据则处理已接收数据
{
num=0;
flag=0;
if((gun[3]=='1')&&(gun[5]=='2')){
print(0,1,"环境");
print(4,1,gun);
}
for(i=0;i<16;i++)gun[i]=0;
}
}
}追问串行连接:决定显示的内容:4.6位数字 大哥能六下qq嘛 谢谢啊
11 班长 12 副班 13 组长 14 副组 15 学生
21 书记 22 副书 23 队长 24 副队 25 队员
31 校长 33 主任 34 老师 35 党员
显示格式为:
成员证号: 队长
14526342536987 //队员号的第四位和第六位是23
请以上队员确认
厦门集美大学!追答我说兄弟,参照程序稍加补充就OK了,你自己完善一下,也作为做一个课题的收获吧,这里已经给你提供了一个思路。追问大哥 主要是有的看不懂 呀 六下qq吧 大哥 比如
sbit P21=P2^1;
sbit P20=P2^0;
#define DATA P0 //P2接数据口 我接的p0口 没有反映 可能是上面两个没接

什么意思 怎么接 呀追答带字库的12864还需要接控制线RS、RW、E,你看到上面的定义了吗?追问大哥 完全按照你的 定义接的 就是数据线接的p0口 没有接你注释说的p2 口 但是没有 反映 给单片机 送数据 没有反映

大哥能加qq么 这边 我追问完这次就不能 追问了 帮帮忙吧 大哥追答有关接口部分修改了一下,你试试,这个程序我原来采用的是STC12系列CPU1T工作模式速度较快,现在稍微调整了一下,你替换原来相同程序看看

//测忙碌子程序
//RS=0,RW=1,E=H,D0-D7=状态字

void chek_busy(void)
{ unsigned char temp1;//状态信息(判断是否忙)
DATA=0xFF;
RS = 0;
delay1(1);
RW = 1;
delay1(1);
do{
E = 1;
delay1(1);
temp1 = DATA;
E = 0;
delay1(1);
} while(temp1&0x80);
RS = 0;
delay1(1);
RW = 0;
delay1(1);
}

read_12864()
{
uchar shuju;
DATA=0xff;
RS=1;
delay1(1);
RW=1;
delay1(1);
E=1;
delay1(1);
shuju=DATA;
E=0;
delay1(1);
return(shuju);
}

//写命令子程序

void send_com(unsigned char cmd)
{
chek_busy();
RS = 0;
delay1(1);
RW = 0;
delay1(1);
E = 1;
delay1(1);
DATA = cmd;
E = 0;
delay1(1);
}

//写数据子程序

void send_data(unsigned char dat)
{
chek_busy();
RS = 1;
delay1(1);
RW = 0;
delay1(1);
E = 1;
delay1(1);
DATA = dat;
E = 0;
delay1(1);
}
全部回答
  • 1楼网友:孤老序
  • 2021-11-26 10:31
建立一个缓冲,将接收到的字符串存起来,然后取出4 6位做比较即可,处理完后清空缓冲并设置好标志位
分析gps模块的数据就会采用这种方式,那么数据量很大的,所以这个还是比较容易的,按照上面我说的方法比较容易实现,
如果每个字符串都是 字头 就更好办了,比如都是SDX开头的追问你脚得楼上的写得对吗? 我写程序进单片机没有作用追答他程序是在他的板子上实现的,你的板子的接口跟他的不一定一样,比如P0.0接的是哪里,P0.1接的又是哪里,这个定义是需要修改的

sbit SDA = P0^0;
这个就是定义端口,你跟他端口都不一样,程序肯定也执行的不对的

显示你必须自己实现,如果在这里让大家帮你实现,那就需要你吧电路图发出来,液晶资料发出来,很多工作的

如果只是问问接收到串口的数据如何解析处理,就按我说的建立缓存然后处理即可,先从简单入手,都是一步一步成长起来的,直接让大家给你代码你看不懂也没有什么意思
如果只是交作业就直接出钱找人帮你设计即可。追问大哥 他的板子和我是一样的 还有你说的什么p0.0 p0.1
sbit SDA = P0^0;

这些 程序里面貌似都没有呀 你是不是看错了呀追答p0.0 p0.1 是比方啦

加油吧,方法告诉你了,实现就要靠你了
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯