我這個是使用數碼管顯示,直接貼程序吧用的是HC573驅動8位數碼管
前四數碼管顯示X坐標,后四位顯示Y坐標
實物測試有問題,個人感覺是程序問題,麻煩大家圍觀一下,糾糾錯
#include <reg52.h>
#include <intrins.h>
sbit mouse_sda = P2^0; //鼠標數據線
sbit mouse_clk = P3^3; //鼠標時鐘線
sbit led = P1^3; //按鍵LED指示
sbit beep = P2^5; //蜂鳴器指示
/*--------------------------------------------------------------*/
//數據定義
unsigned char n, m; //循環變量
unsigned int mouse_word; //接收字16bits
unsigned char mouse_data[3];//接收字節緩沖區
unsigned int move_x; //橫坐標
unsigned int move_y; //縱坐標
bit mouse_left; //左鍵
bit mouse_right; //右鍵
bit mouse_middle; //中鍵
/*--------------------------------------------------------------*/
//函數聲明
void INT0_init(void); //外部中斷INT0初始化
void delay120us(void); //延時120us 函數定義
void mouse_write_dat(unsigned char dat); //發送數據
void mouse_read_dat(void); //讀出數據
void mouse_data_process(void); //數據處理
void mouse_init(void); //鼠標初始化
/*--------------------------------------------------------------*/
//外部中斷INT0初始化
void INT0_init(void)
{
EA = 1; //總中斷打開
EX1 = 1; //外部中斷打開
PX1 = 1; //中斷優先級
IT1 = 0; //低電平觸發
}
/*--------------------------------------------------------------*/
//延時120us 函數定義
void delay120us(void)
{
unsigned char i, j;
for(i = 23; i > 0; i--)
for(j = 1; j > 0; j--);
}
/*--------------------------------------------------------------*/
//發送數據
//發送11位數據:1START-8DATA-1PARITY-1STOP
//并接收一個應答位ack = 0
void mouse_write_dat(unsigned char dat)
{
unsigned char i; //循環變量
bit parity; //奇校驗位
EX1 = 0; //關閉外部中斷
ACC = dat; //存入累加器A,得到P(為偶校驗)
parity = ~P; //獲得奇校驗位
mouse_clk = 0; //拉低時鐘線
delay120us(); //至少延時100us
mouse_sda = 0; //發送起始位
mouse_clk = 1; //釋放時鐘線
mouse_sda = 1; //釋放數據線
for(i = 0; i < 8; i++)
{
//至少要在25us內完成發送一位!!!
while(!mouse_clk); //等待設備把時鐘線拉高
mouse_sda =(bit)(dat& 0x01);//先發送最低位
dat >>= 1; //下降沿寫入數據
while(mouse_clk); //等待設備把時鐘線拉低
}
while(!mouse_clk); //等待設備把時鐘線拉高
mouse_sda = parity; //發送奇校驗位
while(mouse_clk); //等待設備把時鐘線拉低
while(!mouse_clk); //等待設備把時鐘線拉高
mouse_sda = 1; //發送停止位
while(mouse_clk); //等待設備把時鐘線拉低
while(!mouse_clk); //等待設備把時鐘線拉高
while(mouse_sda); //等待接收應答位(總是為0)
while(mouse_clk); //等待設備把時鐘線拉低
while(!mouse_clk); //等待設備釋放時鐘線
while(!mouse_sda); //等待設備釋放數據線
EX1 = 1; //打開外部中斷INT0
}
/*--------------------------------------------------------------*/
//奇校驗
bit check_parity(void)
{
ACC = mouse_data[m];
if(~P == (bit)(mouse_word & 0x0200))
return 1; //奇校驗成功則返回1
else
return 0; //奇校驗失敗則返回0
}
/*--------------------------------------------------------------*/
//讀出3字節數據
void mouse_read_dat(void)
{
mouse_data[m] = (unsigned char)(mouse_word >> 1); //去掉最高兩位和最后一位
if(check_parity()) //奇校驗成功
{
mouse_word = 0; //清接收數據字
m++;
if(m == 3) {mouse_data_process(); m = 0;} //讀出三字節數據
}
}
/*--------------------------------------------------------------*/
//數據處理
void mouse_data_process(void)
{
if //水平移動
(mouse_data[0] & 0x10)
move_x -= 256 - mouse_data[1]; //x坐標減
else move_x += mouse_data[1]; //x坐標加
//垂直移動
if
(mouse_data[0] & 0x20)
move_y -= 256 - mouse_data[2]; //y坐標減
else move_y += mouse_data[2]; //y坐標加
if
(mouse_data[0] & 0x01)
mouse_left = 1; //左鍵
else mouse_left = 0;
if
(mouse_data[0] & 0x02)
mouse_right = 1; //右鍵
else mouse_right = 0;
if(mouse_data[0] & 0x04)
mouse_middle = 1; //中鍵
else mouse_middle = 0;}
/*--------------------------------------------------------------*/
//外部中斷INT0服務
//接收11位數據:1START-8DATA-1PARITY-1STOP
void INT0_intservice(void) interrupt 2
{
mouse_word >>= 1; //先向右空移一位
if(mouse_sda) mouse_word |= 0x0400; //先接收最低位
n++;
if(n == 11) {mouse_read_dat();
n = 0;} //接收完成則讀出數據
}
/*--------------------------------------------------------------*/
//鼠標初始化
void mouse_init(void)
{
INT0_init(); //外部中斷INT0初始化
mouse_write_dat(0xf4); //Enable Data Reporting
while(mouse_data[0] != 0xfa); //等待鼠標應答
mouse_data[0] = 0; //清應答數據
m = 0; //重新定義接收數據指針
}
//--定義使用的IO--//
#define GPIO_DIG P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
//--定義全局變量--//
unsigned char code DIG_CODE[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
//0、1、2、3、4、5、6、7、8、9的顯示碼
unsigned char disbuff[8] ={0,0,0,0,0,0,0,0,};
/*******************************************************************************
* 函 數 名 : DigDisplay
* 函數功能 : 使用數碼管顯示
*******************************************************************************/
void DigDisplay()
{
unsigned char i;
unsigned int j;
for(i=0;i<8;i++)
{
switch(i) //位選,選擇點亮的數碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//顯示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//顯示第7位
}
GPIO_DIG=disbuff[i];
j=10; //掃描間隔時間設定
while(j--);
GPIO_DIG=0x00;//消隱
}
}
//********************************************************/
//void main ()
//unsigned int
/********************************************************/
/********************************************************/
void Conut(void)
{
while(1)
{
disbuff[7]=DIG_CODE[move_x%10000/1000];
disbuff[6]=DIG_CODE[move_x%1000/100];
disbuff[5]=DIG_CODE[move_x%100/10];
disbuff[4]=DIG_CODE[move_x%10/1];
disbuff[3]=DIG_CODE[move_y%10000/1000];
disbuff[2]=DIG_CODE[move_y%1000/100];
disbuff[1]=DIG_CODE[move_y%100/10];
disbuff[0]=DIG_CODE[move_y%10/1];
}
}
|