#include <reg52.h>
#include "lcd1602.h"// 各種頭檔案
#define uchar unsigned char
#define uint unsigned int
#define FOSC 11059200L //System frequency 系統頻率
#define BAUD 9600 //UART baudrate UART波特率
sbit kz=P2^2;
uchar jieshou[1];
void chuan_init(void) //[email protected]
{
SCON = 0x50; //8-bit variable UART 8位變數
TMOD |= 0x20; //Set Timer1 as 8-bit auto reload mode 將時間1設定為8位自動重新加載模式
TH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vaule 設定自動重新加載閥
TR1 = 1; //Timer1 start run 時間1開始運行
ES = 1; //Enable UART interrupt 啟用UART中斷
EA = 1; //Open master interrupt switch 打開主中斷開關
}
void show_init() //液晶初始顯示內容
{
write_string(1,0," LOCK CLOSE "); //
}
/********************************/
void main()
{
init_1602();// 液晶初始化
show_init();// 液晶顯示基本資訊
chuan_init(); // 串口初始化
while(1)
{
;
}
}
void Uart_Isr() interrupt 4 //接收上面傳來的資料
{
static uchar count=0;
ES=0;
if (RI)
{
RI = 0; //Clear receive interrupt flag
jieshou[count]=SBUF;// 否,就存到RevBuf【】陣列中
if(jieshou[0]==10) //接收的資料
{
kz=0;
write_string(1,0," "); //
write_string(1,0," LOCK OPEN "); //
}
else if(jieshou[0]==20)
{
kz=1;
write_string(1,0," "); //
write_string(1,0," LOCK CLOSE "); //
}
}
ES=1;
}
#ifndef _LCD1602_H_
#define _LCD1602_H_
#define uchar unsigned char
#define uint unsigned int
sbit rs = P0^0;
sbit rw = P0^1;
sbit e = P0^2;
sbit d0=P0^3;
sbit d1=P0^4;
sbit d2=P0^5;
sbit d3=P0^6;
sbit d4=P0^7;
sbit d5=P2^7;
sbit d6=P2^6;
sbit d7=P2^5;
/********************************************************************
* 名稱 : delay_uint()
* 功能 : 小延時。
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void delay_uint(uint q)
{
while(q--);
}
/********************************************************************
* 名稱 : write_com(uchar com)
* 功能 : 1602命令函式
* 輸入 : 輸入的命令值
* 輸出 : 無
***********************************************************************/
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
d0=(com&0x01)==0x01?1:0;
d1=(com&0x02)==0x02?1:0;
d2=(com&0x04)==0x04?1:0;
d3=(com&0x08)==0x08?1:0;
d4=(com&0x10)==0x10?1:0;
d5=(com&0x20)==0x20?1:0;
d6=(com&0x40)==0x40?1:0;
d7=(com&0x80)==0x80?1:0;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/********************************************************************
* 名稱 : write_data(uchar dat)
* 功能 : 1602寫資料函式
* 輸入 : 需要寫入1602的資料
* 輸出 : 無
***********************************************************************/
void write_data(uchar date)
{
e=0;
rs=1;
rw=0;
d0=(date&0x01)==0x01?1:0;
d1=(date&0x02)==0x02?1:0;
d2=(date&0x04)==0x04?1:0;
d3=(date&0x08)==0x08?1:0;
d4=(date&0x10)==0x10?1:0;
d5=(date&0x20)==0x20?1:0;
d6=(date&0x40)==0x40?1:0;
d7=(date&0x80)==0x80?1:0;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/***********************lcd1602上顯示這字符函式************************/
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == '\0') break;
write_data(*p);
p++;
}
}
/***********************lcd1602初始化設定************************/
void init_1602() //lcd1602初始化設定
{
write_com(0x38); //
write_com(0x0c);
write_com(0x06);
}
////////////////在指定位置顯示指定字符//////////
/*void write_zifu(uchar hang,uchar add,uchar dat)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(dat);
}*/
/*void write(uchar *pp)
{
while(*pp!='\0')
{
write_data(*pp);
pp++;
}
}*/
#endif
uj5u.com熱心網友回復:
串口通信,液晶1602顯示轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/131651.html
標籤:單片機/工控
上一篇:剛剛看個視頻,說是暫存器的種類
