|
我把IO腳配置了一下,你再試試
#include "reg51.h"
//#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0
sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1
sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0
sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1
sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0
sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1
sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0
sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1
uchar code SEG7[10]={0x03,0x9f,0x25,0x0d,0x99,
0x49,0x41,0x1f,0x01,0x09};
uchar data cnt[5];//在data區(qū)定義5位長(zhǎng)度的數(shù)組,用來(lái)存放計(jì)數(shù)值
uchar data pre_cnt[5];//在data區(qū)定義5位長(zhǎng)度的數(shù)組,用來(lái)存放預(yù)置值
sbit P3_7=P3^7;
sbit P3_6=P3^6;
sbit P3_5=P3^5;
//sbit P3_4=P3^4;
sbit P3_3=P3^3;
sbit P3_2=P3^2;
sbit P3_1=P3^1;
sbit P3_0=P3^0;
sbit drv=P3^4;//定義輸出驅(qū)動(dòng)端
bit set_flag;//定義工作標(biāo)志
bit out_flag;//定義輸出標(biāo)志
bit keydown_flag;//鍵按下標(biāo)志
/****************************/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++){
for(j=0;j<5;j++)
{;}}
}
/**********************************************/
void scan_key(void) //掃描S1~S5鍵子程序開(kāi)始
{uchar i,m=0x08; //定義兩個(gè)字符型局部變量,并賦值0x01給m
P3_6=0;P3_7=1; //禁止發(fā)送給顯示器,消隱有效
for(i=0;i<5;i++) //循環(huán)5次
{
SBUF=255-m;while(!TI);TI=0; //依次發(fā)送數(shù)據(jù)使IC2的輸出從右至左的列線為0
if(!P3_5)pre_cnt[i]++; //若檢測(cè)到P3.5為0,說(shuō)明某列線送出0時(shí)與連接
//該列線的按鍵被按下,數(shù)組中對(duì)應(yīng)的存放單元加1
m<<=1; //m的取值使從右向左的下一條列線為0
} //掃描S1~S5鍵子程序結(jié)束
//------------------------
for(i=0;i<5;i++) //循環(huán)5次
{if(pre_cnt[i]>9)pre_cnt[i]=0;} //對(duì)數(shù)組中的5個(gè)單元進(jìn)行調(diào)整,其范圍為0~9
}
/************************************/
void dis_cnter(void) //顯示計(jì)數(shù)器值子程序開(kāi)始
{uchar i; //定義字符型局部變量i
P3_7=1;P3_6=1; //消隱有效,允許顯示
for(i=0;i<5;i++) //循環(huán)5次
{SBUF=SEG7[cnt[i]];while(!TI);TI=0;} //根據(jù)8個(gè)單元的計(jì)數(shù)值查表發(fā)送顯示
P3_7=0; //關(guān)閉消隱,正常顯示
} //顯示計(jì)數(shù)器值子程序結(jié)束
/**********************************************/
void dis_pre_cnter(void)
{uchar i;
P3_7=1;P3_6=1;
SBUF=SEG7[pre_cnt[0]]&0xfe;while(!TI);TI=0;
//----------------------------------------
for(i=1;i<5;i++)
{SBUF=SEG7[pre_cnt[i]];while(!TI);TI=0;}
P3_7=0;
}
/****************************************/
void cnter(void) //計(jì)數(shù)轉(zhuǎn)換子程序開(kāi)始
{uchar i; //定義字符型局部變量i
for(i=0;i<4;i++) //循環(huán)5次
{if(cnt[i]>9){cnt[i]=0;cnt[i+1]++;}} //若計(jì)數(shù)器某位值大于9,則該位回0,
//------------------------------------ //而高位被進(jìn)位加1
if(cnt[4]>9){for(i=0;i<5;i++)cnt[i]=0;}// 若計(jì)數(shù)器最高位值大于9,則計(jì)數(shù)器全清0
} //計(jì)數(shù)轉(zhuǎn)換子程序結(jié)束
/***************************************************/
void pt_cnt(void) //輸出控制子程序開(kāi)始
{
if((cnt[0]==pre_cnt[0])&&(cnt[1]==pre_cnt[1])&&(cnt[2]==pre_cnt[2])&&(cnt[3]==pre_cnt[3])&&(cnt[4]==pre_cnt[4]))
//若計(jì)數(shù)值等于預(yù)置值
out_flag=1;
//drv=1; //輸出標(biāo)志置1
else out_flag=0; //否則輸出標(biāo)志置0
//==========================
if(out_flag)drv=0; //若輸出標(biāo)志為1,輸出端(P3.4)置0,驅(qū)動(dòng)光耦U2
else drv=1; //若輸出標(biāo)志為1,輸出端(P3.4)置0,驅(qū)動(dòng)光耦U2 //否則輸出端(P3.4)置1
} //輸出控制子程序結(jié)束
/********************************************/
void main(void) //主程序開(kāi)始
{
P0M0 = P0M1 = 0x00;//IO腳配置,按普通51輸入輸出方式
P1M0 = P1M1 = 0x00;
P2M0 = P2M1 = 0x00;
P3M0 = P3M1 = 0x00;
IE=0x84; //開(kāi)放CPU中斷,開(kāi)放外中斷1的中斷
IT1=1; //置外中斷1為邊沿觸發(fā)
while(1) //無(wú)限循環(huán)
{P3_6=0;P3_7=1; //禁止發(fā)送給顯示器,消隱有效
SBUF=0x00;while(!TI);TI=0; //向IC2發(fā)送0x00,使IC2輸出為全0
if((P3&0x24)!=0x24)keydown_flag=1; //檢測(cè)P3.2、P3.5是否為高電平。
//若不為高電平,說(shuō)明有鍵按下,鍵被按下標(biāo)志置1
else keydown_flag=0; //否則,鍵被按下標(biāo)志置0
//--------------------------
SBUF=0xfe;while(!TI);TI=0; //向IC2發(fā)送0xfe
if(!P3_2)set_flag=!set_flag; //若P3.2為0,說(shuō)明S9鍵按下,標(biāo)志set_flag取反
//=============================================
if(!set_flag){cnter();dis_cnter();
pt_cnt();delay(100);} //若標(biāo)志set_flag為0,調(diào)用計(jì)數(shù)、顯示計(jì)數(shù)、輸出控制的子程序
else {scan_key();dis_pre_cnter();delay(10);}//否則標(biāo)志set_flag為1,調(diào)用掃描S1~S8鍵、顯示預(yù)置值的子程序
//=============================================
if(keydown_flag)delay(300); //因有鍵按下,調(diào)用延時(shí)300mS子程序,
} //以免調(diào)整鍵值的速度過(guò)快
} //主程序結(jié)束
/************************************************/
void extern_int1(void) interrupt 2 using 1
{
cnt[0]++;
} |
評(píng)分
-
查看全部評(píng)分
|