1、串口通信接收LCD1602显示串口通信接收LCD1602显示注意:晶振使用11.0592MHz 波特率9600 /* * 文件名:串口接收试验.c * 描述 : 该程序从串口接收数据,通过LCD显示数据。在LCD的第一行显示出来, 当数据过多时(超过16个字符),LCD第一行将会被覆盖。 该试验使用的晶振是11.0592,如果使用12M晶振,会出现串口接收 不正常的情况。原因是用12M晶振,波特率9600时的误差率达 8%。 */ #include #include #define uchar unsigned char #define uint unsigned int /*LED_Buff
2、er16用来存储串口发送的数据,com_dat用来记录串口发送的个数*/ ucharLED_Buffer16, *q, com_dat; /从串口接收的数据 /这三个引脚参考资料 sbit E=P27; /1602使能引脚 sbit RW=P26; /1602读写引脚 sbit RS=P25; /1602数据/命令选择引脚 /* * 名称 : Delay(uint del) * 功能 : 延时10ms * del * 输入 : 无 * 输出 : 无 */ void Delay(uintdel) uinti,j; for(i=0; idel; i+) for(j=0; j1827; j+) ;
3、/* * 名称 : delay() * 功能 : 延时,延时时间大概为140US。 * 输入 : 无 * 输出 : 无 */ void delay() inti,j; for(i=0; i=10; i+) for(j=0; j=2; j+) ; /* * 名称 : Convert(ucharIn_Date) * 功能 : 因为电路设计时,P0.0-P0.7接法刚好了资料中的相反,所以设计该函数。 * 输入 : 1602资料上的值 * 输出 : 送到1602的值 */ uchar Convert(ucharIn_Date) uchari, Out_Date = 0, temp = 0; for(
4、i=0; ii) & 0x01; Out_Date |= (temp (7 - i); return Out_Date; /* * 名称 : enable(uchar del) * 功能 : 1602命令函数 * 输入 : 输入的命令值 * 输出 : 无 */ void enable(uchardel) P0 = Convert(del); RS = 0; RW = 0; E = 0; delay(); E = 1; delay(); /* * 名称 : write(uchar del) * 功能 : 1602写数据函数 * 输入 : 需要写入1602的数据 * 输出 : 无 */ void
5、write(uchardel) P0 = Convert(del); RS = 1; RW = 0; E = 0; delay(); E = 1; delay(); /* * 名称 : L1602_init() * 功能 : 1602初始化,请参考1602的资料 * 输入 : 无 * 输出 : 无 */ void L1602_init(void) enable(0x01); enable(0x38); enable(0x0c); enable(0x06); enable(0xd0); /* * 名称 : L1602_char(ucharhang,ucharlie,char sign) * 功能
6、 : 改变液晶中某位的值,如果要让第一行,第五个字符显示b ,调用该函数如下 L1602_char(1,5,b) * 输入 : 行,列,需要输入1602的数据 * 输出 : 无 */ void L1602_char(ucharhang,ucharlie,char sign) uchar a; if(hang = 1) a = 0x80; if(hang = 2) a = 0xc0; a = a + lie - 1; enable(a); write(sign); /* * 名称 : L1602_string(ucharhang,ucharlie,uchar *p) * 功能 : 改变液晶中某位
7、的值,如果要让第一行,第五个字符开始显示ab cd ef ,调用该函数如下 L1602_string(1,5,ab cd ef;) * 输入 : 行,列,需要输入1602的数据 * 输出 : 无 */ void L1602_string(ucharhang,ucharlie,uchar *p) uchar a; if(hang = 1) a = 0x80; if(hang = 2) a = 0xc0; a = a + lie - 1; enable(a); while(1) if(*p = 0) break; write(*p); p+; /* * 名称 : Com_Int() * 功能 :
8、串口中断子函数 * 输入 : 无 * 输出 : 无 */ void Com_Int(void) interrupt 4 EA = 0; if(RI = 1) /当硬件接收到一个数据时,RI会置位 LED_Buffercom_dat = SBUF; /把从串口读出的数存到数组 RI = 0; com_dat+; if(com_dat = 16) com_dat = 0; /当com_dat = 16时,清0,防止数组溢出 EA = 1; /* * 名称 : Com_Init() * 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断 * 输入 : 无 * 输出 : 无 */
9、 void Com_Init(void) TMOD = 0x20; /定时器工作在定时器1的方式2 PCON = 0x00; /不倍频 SCON = 0x50; /串口工作在方式1,并且启动串行接收 TH1 = 0xFd; /设置波特率 9600 TL1 = 0xFd; TR1 = 1; /启动定时器1 ES = 1; /开串口中断 EA = 1; /开总中断 /* * 名称 : Main() * 功能 : 主函数 * 输入 : 无 * 输出 : 无 */ void Main() uchari = 0, com_dat = 0; L1602_init(); Delay(100); Com_Init(); P2 = 0x00; while(1) q = LED_Buffer; L1602_string(1,1,q); com_dat = 0; Delay(100);
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2