这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 学习笔记:51串口LCD1602显示

共1条 1/1 1 跳转至

学习笔记:51串口LCD1602显示

助工
2014-09-16 20:04:10     打赏
/****************************************************************** 1.项目:串口接收数据并在LCD上显示 2.功能:   2.1:串口接收数据   2.2:数据在1602上显示   2.3:数据会发给串口 3.设计:robin_chen559 4.日期:2013.12.24 备注:C51,11.0592M晶振
******************************************************************/ #include                        //包含头文件
#define uint unsigned int  //预定义一下 #define uchar unsigned char
sbit rs=P3^5;        //1602的数据/指令选择控制线 sbit rw=P3^6;        //1602的读写控制线 sbit en=P3^7;        //1602的使能控制线
bit Uart_Flag = 0;   //串口接收标志
uchar Data_H,Data_L;   //定义数据高低 uchar code table[] = {"0123456789abcdef"}; //定义显示字符串
/****************函数声明*********************/ void Init_UART(void);                    //串口初始化 void lcd_wcom(uchar com);                                //1602写指令 void lcd_wdat(uchar dat);                                //1602显示数据 void lcd_init();                                                //1602初始化 void delay(uint n);                                                //延时子程序 void putchar(unsigned char data1);                //串口发送数据 void putstring(unsigned char *dat);                //串口发送字符串 void LCD_Display(void);                  //LCD显示子程序
/***************子程序************************/
//串口初始化子程序 void Init_UART(void) { SCON = 0x50;           //串口方式1 ,允许接收 TMOD = 0x20;           //T1工作于方式2 PCON = 0x00;           //波特率不倍增 TL1 = 0xfd;              //波特率设置 TH1 = 0xfd;            // EA = 1;                    //开总中断 ES = 1;               //开串口接收中断 //TI = 0; TR1 = 1;             //定时器开启 }
//串口接收子程序 void revdata(void) interrupt 4 {   unsigned char temp,temp1; if(RI == 0) return;          //如果没有接收中断标志,返回 ES = 0;                      //关闭串口中断 RI = 0;                      //清串行中断标志位 temp = SBUF;                 //接收缓冲器中的字符 temp1 = temp; putchar(temp);               //将接收的字符发送出去 Uart_Flag = 1;               //串口已接受标志置1 ES = 1;                      //开启串口中断 Data_H        = (temp>>4);          // Data_H取串口高四位 Data_L = (temp1&0x0f);                  // Data_L取串口低四位 }
//字符发送函数 void putchar(unsigned char data1)   {   SBUF = data1;               //将待发送的字符送入发送缓冲器   while(TI == 0);             //等待发送完成   TI = 0;                     //发送中断标志请0 }
//字符串发送函数 void putstring(unsigned char *dat) {   while(*dat != '\0')           //判断字符串是否发送完毕 {   putchar(*dat);        //发送单个字符   dat++;                 //字符地址加1,指向先下一个字符   delay(5); } }
//毫秒级延时函数 void delay(uint n)       //延时函数                        {     uint x,y;       for(x=n;x>0;x--)         for(y=110;y>0;y--); }
//1602写命令子程序 void lcd_wcom(uchar com)                  {     rs=0;            //选择指令寄存器     rw=0;            //选择写     P2=com;          //把命令字送入P2     delay(5);        //延时一小会儿,让1602准备接收数据     en=1;            //使能线电平变化,命令送入1602的8位数据口     en=0; }
//1602初始化子程序 void lcd_init()                   {     lcd_wcom(0x38);          //8位数据,双列,5*7字形  38          lcd_wcom(0x0c);          //开启显示屏,关光标,光标不闪烁  0C     lcd_wcom(0x06);          //显示地址递增,即写一个数据后,显示位置右移一位     lcd_wcom(0x01);          //清屏 } //1602写数据子程序    void lcd_wdat(uchar dat)            {     rs=1;          //选择数据寄存器     rw=0;          //选择写     P2=dat;        //把要显示的数据送入P2     delay(1);      //延时一小会儿,让1602准备接收数据     en=1;          //使能线电平变化,数据送入1602的8位数据口         delay(1);           en=0; }
//1602显示子程序 void LCD_Display(void) {   //LCD第一行显示   lcd_wcom(0x80+0x01);   lcd_wdat('R');   lcd_wcom(0x80+0x02);   lcd_wdat('o');   lcd_wcom(0x80+0x03);   lcd_wdat('b');   lcd_wcom(0x80+0x04);   lcd_wdat('i');   lcd_wcom(0x80+0x05);   lcd_wdat('n');   lcd_wcom(0x80+0x06);   lcd_wdat('_');   lcd_wcom(0x80+0x07);   lcd_wdat('C');   lcd_wcom(0x80+0x08);   lcd_wdat('h');   lcd_wcom(0x80+0x09);   lcd_wdat('e');   lcd_wcom(0x80+0x0a);   lcd_wdat('n');   lcd_wcom(0x80+0x0b);   lcd_wdat('5');   lcd_wcom(0x80+0x0c);   lcd_wdat('5');   lcd_wcom(0x80+0x0d);   lcd_wdat('9');      //LCD第二行显示
  lcd_wcom(0x80+0x42);   lcd_wdat(table[Data_H]);   lcd_wcom(0x80+0x43);   lcd_wdat(table[Data_L]);
}
//主函数 void main(void) { Init_UART();                //串口初始化 lcd_init();             //液晶初始化
while(1) {     LCD_Display();         } }
// 源文件:keil uv4  proteus7.10

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]