?? cmpmnck.c
字號:
//本程序為Franklin/keil C51源程序,可以在所有51系列(或兼容)單片機中運行。
//完成功能:使用任意2個引腳模擬串行接口,實現對觸摸屏控制器數據的接收
// 和對KY系列智能液晶終端進行控制.
//程序中給出了設計方法,通過修改TIMEzq使本程序適用于各種晶振及各種波特率.
//本例為:當通訊波特率=9600Hz,單片機晶振=18.432MHz時,TIMEzq=50
// 使用P1.0模擬串口輸入,使用P1.1模擬串口輸出,使用P1.2檢測"忙"信號.
//本程序在Wave For windows ver 2.80仿真軟件編譯成功。
//在AT89C51(9600Hz,18.432MHz)中運行通過.運行結果是:將接收的XY坐標在屏幕左上角顯示并劃點.
//=========================================================================================
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit CMP_DATA =P1^0; //由此接收觸摸屏發出的串行數據,可以使用任一引腳.
sbit ZD_DATA =P1^1; //向液晶終端輸出串行數據,使用模擬串口輸出數據時,可以使用任一引腳.
sbit ZD_BUSY =P1^2; //接收液晶終端發來的"忙"(BUSY)信號,可以連接于任意一位輸入引腳上.
//=========================================================================================
bdata char DATA;
sbit mb0=DATA^0;
sbit mb1=DATA^1;
sbit mb2=DATA^2;
sbit mb3=DATA^3;
sbit mb4=DATA^4;
sbit mb5=DATA^5;
sbit mb6=DATA^6;
sbit mb7=DATA^7;
//=========================================================================================
#define TIMEzq 50 //修改TIMEzq可使本程序適用于各種晶振及各種波特率.計算方法見文件尾。
//本例:AT89C51(9600Hz,18.432MHz)時 TIMEzq=50
//=========================================================================================
//延時函數TIME()
//為了得到精確的延時時間,不要修改本函數的形式,絕對不要修改!
void TIME(void)
{
uchar i;
for(i=0;i<TIMEzq;i++);
}
//=========================================================================================
//延時函數TIME1B()
//為了得到精確的延時時間,不要修改本函數的形式,絕對不要修改!
void TIME1B(void)
{
uchar i;
for(i=0;i<(TIMEzq/2);i++);
}
//=========================================================================================
//將sj(僅低4位有效)轉換為對應的ASCII碼
uchar zh16(uint sj)
{
uchar sj1;
sj1=sj&0xf;
if (sj1>=0x0a) sj1=sj1+7;
sj1=sj1+0x30;
return sj1;
}
//=========================================================================================
//向終端發送一字節數據
//為了得到精確的延時時間,不要修改本函數的形式,絕對不要修改!
void FSsj(uchar sj)
{
while(ZD_BUSY);
ZD_DATA =0; //起始位=0
TIME();
ZD_DATA =sj&1; //D0;12+24+24+24
TIME();
ZD_DATA =sj&2; //D1
TIME();
ZD_DATA =sj&4; //D2
TIME();
ZD_DATA =sj&8; //D3
TIME();
ZD_DATA =sj&0x10; //D4
TIME();
ZD_DATA =sj&0x20; //D5
TIME();
ZD_DATA =sj&0x40; //D6
TIME();
ZD_DATA =sj&0x80; //D7
TIME();
ZD_DATA =0; //奇偶位=0
TIME();
ZD_DATA =1; //停止位=1
TIME();
}
//=========================================================================================
//用CMP_DATA模擬串口接收數據
//為了得到精確的延時時間,不要修改本函數的形式,絕對不要修改!
//讀觸摸屏1個字節
uchar JSsj(void)
{
while(CMP_DATA); //CMP_DATA=1,則等待.
TIME1B();
TIME();
mb0=CMP_DATA; //D0
TIME();
mb1=CMP_DATA; //D1
TIME();
mb2=CMP_DATA; //D2
TIME();
mb3=CMP_DATA; //D3
TIME();
mb4=CMP_DATA; //D4
TIME();
mb5=CMP_DATA; //D5
TIME();
mb6=CMP_DATA; //D6
TIME();
mb7=CMP_DATA; //D7
TIME();
TIME();
return DATA;
}
//=========================================================================================
void main(void)
{
uchar zj2,zj3,zj4,zj5; //接收觸摸屏數據的第2,3,4,5字節。
uint Xzb,Yzb;//X坐標在Xzb中,Y坐標在Yzb中
CMP_DATA=1;
ZD_BUSY=1;
ZD_DATA=1;
//清屏幕(黑色)
FSsj(0X1B);
FSsj(0X51);
FSsj(0);
//循環接收數據,完成顯示和劃點任務
while(1)
{
while(1){if(JSsj()==0xa0)break;}
zj2=JSsj();
zj3=JSsj();
zj4=JSsj();
zj5=JSsj();
//X坐標在Xzb中,Y坐標在Yzb中
Xzb=zj2;
Xzb=Xzb<<6;
Xzb=Xzb+zj3;
Yzb=zj4;
Yzb=Yzb<<6;
Yzb=Yzb+zj5;
//在左上角顯示收到數據
FSsj(0X1B);
FSsj('z');
FSsj(0X90);
FSsj(0);
FSsj(0X80);
FSsj(0);
FSsj('X');
FSsj('=');
FSsj(zh16(Xzb>>8));
FSsj(zh16(Xzb>>4));
FSsj(zh16(Xzb));
FSsj('H');
FSsj(',');
FSsj('Y');
FSsj('=');
FSsj(zh16(Yzb>>8));
FSsj(zh16(Yzb>>4));
FSsj(zh16(Yzb));
FSsj('H');
//XY坐標除以4后劃點
Xzb=Xzb/4;
Yzb=Yzb/4;
FSsj(0X1B);//劃點指令
FSsj('d');
FSsj(0XF0);//劃白點
FSsj(Xzb);
FSsj(0);
FSsj(Yzb);
}
}
//=========================================================================================
//例1:當通訊波特率F=9.6KHz,單片機晶振Z=18.432MHz時,TIMEzq=50
//計算方法:
//當波特率為9.6KHz時,每個二進制位的寬度為104uS.振蕩周期數zq=(1000/9.6)*18.432MHz=1920個振蕩周期
//調用本函數的其它指令執行時間為(12+24*3+12*3)=120個振蕩周期.
//執行每個循環需要(12+24=36)個振蕩周期,則TIMEzq=(zq-120)/36=(1920-120)/36=50
//即:TIMEzq=[((1000/F)*Z)-120]/36=50
//-------------
//例2:當通訊波特率F=4.8KHz,單片機晶振Z=18.432MHz時:
// TIMEzq=[((1000/F)*Z)-120]/36=103
//-------------
//例3:當通訊波特率F=19.2KHz,單片機晶振Z=18.432MHz時:
// TIMEzq=[((1000/F)*Z)-120]/36=23
//-------------
//例4:當通訊波特率F=9.6KHz,單片機晶振Z=12.000MHz時:
// TIMEzq=[((1000/F)*Z)-120]/36=31
//-------------
//例5:當通訊波特率F=4.8KHz,單片機晶振Z=12.000MHz時:
// TIMEzq=[((1000/F)*Z)-120]/36=66
//-------------
//例6:當通訊波特率F=19.2KHz,單片機晶振Z=12.000MHz時:
// TIMEzq=[((1000/F)*Z)-120]/36=14
//-------------
//例7:當通訊波特率F=9.6KHz,單片機晶振Z= 6.000MHz時:
// TIMEzq=[((1000/F)*Z)-120]/36=14
//-------------
//例8:當通訊波特率F=9.6KHz,單片機晶振Z=11.0592MHz時:
// TIMEzq=[((1000/F)*Z)-120]/36=28
//-------------
//例9:當通訊波特率F=9.6KHz,單片機晶振Z=22.1184MHz時:
// TIMEzq=[((1000/F)*Z)-120]/36=60
//-------------
//例10:當通訊波特率F=9.6KHz,單片機晶振Z=24.0000MHz時:
// TIMEzq=[((1000/F)*Z)-120]/36=66
//------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -