#include <REGX51.H>
#define uchar unsigned char
#define uint unsigned int
// 定義LCD控制引腳
sbit RS = P1^0;
sbit RW = P1^1;
sbit E = P1^2;
// 定義按鍵引腳
sbit KEY = P1^6;
// 定義數據數組
uchar received_data;
// 延時函數
void delayms(uint ms)
{
uchar i;
while (ms--)
for (i = 0; i < 123; i++);
}
// 向LCD寫指令函數
void w_com(uchar com)
{
RS = 0;
RW = 0;
E = 1;
P0 = com;
delayms(1);
E = 0;
}
// 向LCD寫數據函數
void w_dat(uchar dat)
{
RS = 1;
RW = 0;
E = 1;
P0 = dat;
delayms(1);
E = 0;
}
// LCD初始化函數
void lcd_ini(void)
{
delayms(10);
w_com(0x38); // 8位數據接口, 2行顯示, 5x7點陣
delayms(10);
w_com(0x0c); // 顯示開, 光標關
delayms(10);
w_com(0x06); // 文字不動, 地址自動+1
delayms(10);
w_com(0x01); // 清屏
delayms(10);
}
// LCD清屏函數
void lcd_clear(void)
{
w_com(0x01); // 清屏指令
delayms(10); // 等待清屏完成
}
// 通過串口發送一個字節數據
void send_data(uchar data_to_send)
{
SBUF = data_to_send;
while (TI == 0);
TI = 0;
}
// 串口初始化函數
void uart_init()
{
SCON = 0x50; // 8位數據, 可變波特率
TMOD &= 0x0F; // 清除定時器1模式位
TMOD |= 0x20; // 設定定時器1為8位自動重裝方式
TL1 = 0xFD; // 設定定時初值 (9600波特率 @ 11.0592MHz)
TH1 = 0xFD; // 設定定時器重裝值
TR1 = 1; // 啟動定時器1
EA = 1; // 開啟總中斷
ES = 1; // 開啟串口中斷
}
// 主函數
void main()
{
uchar data_to_send[8] = "12345678";
uchar i;
lcd_ini();
uart_init();
while (1)
{
if (KEY == 0)
{
delayms(20);
if (KEY == 0)
{
lcd_clear(); // 清屏
for (i = 0; i < 8; i++)
{
send_data(data_to_send[i]);
}
while (KEY == 0);
}
}
}
}
// 串口中斷服務函數
void uart_interrupt() interrupt 4
{
if (RI)
{
RI = 0;
received_data = SBUF;
// 更新LCD顯示,這里可能需要設置LCD的地址,確保數據寫入正確位置
// 假設每次接收的數據都覆蓋顯示,這里簡單地從第一列開始顯示
w_com(0x80); // 設置LCD DDRAM起始地址為第一行第一列
for (uchar j = 0; j < 1; j++) // 這里假設每次只接收一個字符,如果需要接收多個,需要調整邏輯
{
w_dat(received_data);
}
}
} |