書本上的一個案例不能運行,ISIS軟體沒有反應:
這是一個“獨立按鍵實作十進制數的加減計數實體”:通過控制K1,K2按鍵,實作0~9十進制數的加1和減1計數,并通過P2埠外接的共陰極LED數碼管顯示:


上面是代碼和仿真截圖,數碼管只能顯示1,按K1,K2鍵沒有反應,代碼和仿真圖都是書上拷下來的案例,我修改了第四第五行,原本是P3_2,P3_3,但是編譯報錯,改成了P3^2,P3^3,才能編譯,但是仿真沒有反應,求助大神們,不知道什么原因,單片機剛開始學習。
代碼是用C語言寫的
附上完整代碼:
//#include <REGX51.H>
#include"reg52.h"
//#include "stc15f2k60s2.h"
#define K1 P3^2 //--- 宏定義K1代替P3.2 ---
#define K2 P3^3 //--- 宏定義K2代替P3.3 ---
sfr P2M1 = 0X95; //--- 新增的功能暫存器地址宣告 ---
sfr P2M0 = 0X96;
void Delay10mS(void) //--- @12MHz,延時子程式 ---
{
unsigned char i,j;
for(i=117;i>0;i--)
for(j=184;j>0;j--);
}
unsigned char code LEDSEG[] = //--- 數碼管顯示0~9,A~F筆段代碼表 ---
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
};
void main(void)
{
char Counter = 0;
P2M1 = 0x00; //--- 配置P2埠的P2.0~P2.7為推挽輸出模式 ---
P2M0 = 0xFF;
P2 = LEDSEG[Counter]; //---根據計數變數的值查表對應的十進制數筆段碼送P0口顯示 ---
while(1)
{
if(0 == K1) //--- 檢測P3.2引腳上K1是否按下 ---
{
Delay10mS(); //--- 若真按下則延時去按鍵抖動 ---
if(0 == K1) //--- 再次確認P3.2引腳上的K1是否真得按下 ---
{
Counter ++; //--- 若真得按下則計數變數加1 ---
if(Counter > 9)Counter = 0; //--- 計數變數值超過9則歸0 ---
P2 = LEDSEG[Counter]; //--- 根據計數變數的值查表對應的十進制數筆段碼送P2口顯示 ---
}
while(0 == K1); //--- 等待P3.2引腳上的K1釋放 ---
}
if(0 == K2) //--- 檢測P3.3引腳上K2是否按下 ---
{
Delay10mS(); //--- 若真按下則延時去按鍵抖動 ---
if(0 == K2) //--- 再次確認P3.3引腳上的K2是否真得按下 ---
{
Counter --; //--- 若真得按下則計數變數減1 ---
if(Counter < 0)Counter = 9; //--- 計數變數值小于0則歸9 ---
P2 = LEDSEG[Counter]; //--- 根據計數變數的值查表對應的十進制數筆段碼送P2口顯示 ---
}
while(0 == K2); //--- 等待P3.3引腳上的K2釋放 ---
}
}
}
uj5u.com熱心網友回復:
樓主是自學的單片機嗎?先把單片機最小系統搭好,也就是把晶振和上電復位電路搭好。uj5u.com熱心網友回復:
樓主用什么軟體仿真的uj5u.com熱心網友回復:
//#define K1 P3^2 //--- 宏定義K1代替P3.2 ---//#define K2 P3^3 //--- 宏定義K2代替P3.3 ---
sbit K1= P3^2;
sbit K2= P3^3;
不要使用宏定義引腳,使用sbit定義引腳,親測有效。
uj5u.com熱心網友回復:
本來單個引腳就是用sbit定義的啊 define可以用來定義P0的全部引腳uj5u.com熱心網友回復:
取余運算就可以uj5u.com熱心網友回復:
https://blog.csdn.net/xianfajushi/article/details/80885105uj5u.com熱心網友回復:
https://blog.csdn.net/xianfajushi/article/details/85511846轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/156674.html
標籤:單片機/工控
上一篇:如何學單片機程式設計
下一篇:一個51程式設計和仿真——流水燈
