51hei0.jpg (206.85 KB, 下載次數(shù): 0)
下載附件
2024-12-17 22:32 上傳
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- // 定義獨立按鍵連接引腳,這里假設(shè)連接到P3^2,可根據(jù)實際調(diào)整
- sbit key = P3^2;
- // LCD1602控制引腳定義
- sbit RS = P2^0;
- sbit RW = P2^1;
- sbit E = P2^2;
- // 要發(fā)送給PC機的8個數(shù)據(jù)
- uchar data_to_send[8] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38};
- // 用于緩存接收自PC機的數(shù)據(jù)
- uchar received_data[16];
- // 記錄接收數(shù)據(jù)的個數(shù)
- uchar received_count = 0;
- // 軟件延時函數(shù),用于產(chǎn)生一定時間的延時
- void delay(uint ms) {
- uint i, j;
- for (i = ms; i > 0; i--)
- for (j = 110; j > 0; j--);
- }
- // 向LCD1602寫入命令
- void LCD_WriteCmd(uchar cmd) {
- RS = 0;
- RW = 0;
- P0 = cmd;
- E = 1;
- _nop_();
- E = 0;
- delay(5);
- }
- // 向LCD1602寫入數(shù)據(jù)
- void LCD_WriteData(uchar dat) {
- RS = 1;
- RW = 0;
- P0 = dat;
- E = 1;
- _nop_();
- E = 0;
- delay(5);
- }
- // 初始化LCD1602
- void LCD_Init() {
- LCD_WriteCmd(0x38); // 設(shè)置16*2顯示,5*7點陣,8位數(shù)據(jù)接口
- LCD_WriteCmd(0x0C); // 顯示開,光標關(guān),光標不閃爍
- LCD_WriteCmd(0x06); // 文字不動,地址自動+1
- LCD_WriteCmd(0x01); // 清屏
- delay(5);
- }
- // 在LCD1602上顯示給定緩沖區(qū)中的數(shù)據(jù)
- void LCD_Display(uchar dat_buf[], uchar length) {
- uchar i;
- for (i = 0; i < length; i++) {
- LCD_WriteData(dat_buf[i]);
- }
- }
- // 初始化串口
- void UART_Init() {
- SCON = 0x50; // 設(shè)置串口工作模式1,8位數(shù)據(jù),1位停止位
- TMOD = 0x20; // 設(shè)置定時器1為模式2,自動重裝
- TH1 = 0xFD; // 波特率9600bps,晶振11.0592MHz
- TL1 = 0xFD;
- TR1 = 1; // 啟動定時器1
- ES = 1; // 使能串口中斷
- EA = 1; // 使能總中斷
- }
- // 通過串口發(fā)送一個字節(jié)的數(shù)據(jù)
- void UART_Send(uchar dat) {
- SBUF = dat; // 發(fā)送數(shù)據(jù)
- while (!TI); // 等待發(fā)送完成
- TI = 0; // 清除發(fā)送標志
- }
- // 串口中斷服務(wù)函數(shù),用于接收數(shù)據(jù)
- void UART_ISR() interrupt 4 {
- if (RI) {
- RI = 0; // 清除接收標志
- received_data[received_count++] = SBUF; // 接收數(shù)據(jù)到緩存數(shù)組
- if (received_count >= 16) {
- received_count = 0; // 防止緩存溢出,重置計數(shù)
- }
- }
- }
- void main() {
- uchar i;
- UART_Init(); // 初始化串口
- LCD_Init(); // 初始化LCD1602
- while (1) {
- if (key == 0) { // 檢測按鍵是否按下
- for (i = 0; i < 8; i++) {
- UART_Send(data_to_send[i]); // 循環(huán)發(fā)送8個數(shù)據(jù)給PC機
- }
- while (key == 0); // 等待按鍵釋放
- }
- if (received_count > 0) { // 如果有接收到的數(shù)據(jù)
- LCD_WriteCmd(0x80); // 設(shè)置LCD顯示位置為第一行
- LCD_Display(received_data, received_count); // 在LCD上顯示接收的數(shù)據(jù)
- received_count = 0; // 清空接收緩存計數(shù),準備下次接收
- }
- }
- }
復制代碼
|