⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 单片机双机串口通信演示程序,里面包含preoteus仿真
💻 C
字号:
/*模拟时序*/
#include <reg51.h>
#include <cncode.h>
#include <encode.h>

sbit cd = P2^0;
sbit ce = P2^1;
sbit rd = P2^2;
sbit wr = P2^3;
sbit md2 = P2^4;
sbit fs1 = P2^5;
sbit halt = P2^6;
sbit res = P2^7;
sbit busy = P1^0;

void delay(unsigned char tt){
	for(;tt!=0; --tt);
}

void writed(unsigned char dat){//把数值传送到D口
	cd = 0;//传输类型是数据
	ce = 0;
	wr = 0;
	P0 = dat;
	delay(1);//lcm占用时间,晶振较快时需要
	wr = 1;
	ce = 1;
}

void writec(unsigned char command){//把命令传送到D口
	cd = 1;//传输类型是命令
	ce = 0;
	wr = 0;
	P0 = command;
	delay(1);
	wr = 1;
	ce = 1;
}

void cls(unsigned char x, unsigned char y, unsigned int len){
	unsigned int i, pos;
	pos = x*30 + y;
	writed(pos&0xff);
	writed(pos/256);
	writec(0x24);//设置写地址
	writec(0xb0);
	for(i=0; i < len; ++i) writed(0);//空格,清屏
	writec(0xb2);//关自动写
}

void wprintf(unsigned char x, unsigned char y, unsigned char *ptr){
	unsigned int posi, i=0;
	unsigned char c1, c2, j, k;
	while(ptr[i]>0x1f){
		c1 = ptr[i];
		c2 = ptr[i+1];
		posi = x*30 + y;
		if(c1 <= 128){//ascii大于128为汉字
			for(k=0; k<16; ++k){//16*8
				writed(posi&0xff);
				writed(posi/256);
				writec(0x24);
				writec(0xb0);
				writed(ASC_MSK[(c1-0x20)*16+k]);
				writec(0xb2);
				posi += 30;
			}
			if(y>28){//换行
				x += 16;
				y = 0;
			}else ++y;
			++i;
		}
		else{
			if(y>28){//换行
				x += 16;
				y = 0;
			}else{
				for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);++j){//找到汉字
					if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1]) break;
				}
				if(j<sizeof(GB_16)/sizeof(GB_16[0])){
					for(k=0;k<16;++k){
						writed(posi&0xff);
						writed(posi/256);
						writec(0x24);
						writec(0xb0);
						writed(GB_16[j].Msk[k*2]);
						writed(GB_16[j].Msk[k*2+1]);//16*16,每行2字节
						writec(0xb2);
						posi += 30;//下一行
					}
				}
				else{//没找到则涂黑
					for(k=0;k<16;k++){
						writed(posi&0xff);
						writed(posi/256);
						writec(0x24);
						writec(0xb0);
						writed(0xff);
						writed(0xff);
						writec(0xb2);
						posi += 30;//下一行
					}
				}
				y += 2;
		      	i += 2;//下一字
			}
		}
	}
}

void main(void){
	unsigned char i=0;
	unsigned char receive;
	//串口相关设置
	TMOD = 0x20;
	SCON = 0xd0;
	TH1 = 0xfa;
	TL1 = 0xfa;
	//IE = 0x98;
	TR1 = 1;
	//液晶设置
	fs1 = 0;//fs1管脚高电平时表示字体为8*6;低电平时为8*8,8*6写不了16*16中文,所以不用了
	md2 = 0;
	halt = 0;
	writed(0);
	writed(0);
	writec(0x42);
	writed(30);
	writed(0);
	writec(0x43);
	writec(0x80);
	writec(0x9a);//关闭文本显示,开图形显示
	cls(0,0,240*128/8);//清除指定范围,一开始可以不清屏
	wprintf(0,0,"^_^ Please Press The Button!\0");
	//串口接收
	busy = 0;
	while(1){
		if(RI==1){ 
			busy = 1;
			RI = 0;
			receive = SBUF;
			if(receive<0x20) break;
			wprintf(16,i,&receive);
			busy = 0;
			++i;
		};
	}
	busy = 1;
	wprintf(32,0,"Well Done!");
	while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -