久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
求大俠幫忙有關單片機數據類型的困惑
[打印本頁]
作者:
lern01
時間:
2017-10-21 10:22
標題:
求大俠幫忙有關單片機數據類型的困惑
做了一個單片機按鍵控制步進電機程序,將addendt和num定義為int或long型,均不能正常工作,定義為char型,沒問題。求大俠給予指導,在下先謝了!!
代碼如下:
#include<reg52.h>
sbit KEYIN_4 = P2^7; //矩陣鍵盤
sbit KEYIN_3 = P2^6;
sbit KEYIN_2 = P2^5;
sbit KEYIN_1 = P2^4;
sbit KEYOUT_1 = P2^3;
sbit KEYOUT_2 = P2^2;
sbit KEYOUT_3 = P2^1;
sbit KEYOUT_4 = P2^0;
sbit ADDR0 = P1^0; //三八譯碼器選通
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char code KeyCodeMap[4][4] = { //矩陣按鍵編號到標準鍵盤鍵碼的映射表
{ 0x31, 0x32, 0x33, 0x26 }, //數字鍵 1、數字鍵 2、數字鍵 3、向上鍵
{ 0x34, 0x35, 0x36, 0x25 }, //數字鍵 4、數字鍵 5、數字鍵 6、向左鍵
{ 0x37, 0x38, 0x39, 0x28 }, //數字鍵 7、數字鍵 8、數字鍵 9、向下鍵
{ 0x30, 0x1B, 0x0D, 0x27 } //數字鍵 0、ESC 鍵、 回車鍵、 向右鍵
};
unsigned char code BeatCode[8] = { //步進電機節拍對應的 IO 控制代碼
0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6};
unsigned char code LedChar[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
unsigned char LedBuff[6] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
unsigned char KeySta[4][4] = {
{1,1,1,1}, {1,1,1,1}, {1,1,1,1}, {1,1,1,1}};
signed long beats = 0; //電機總節拍數
bit dir = 0; //電機正反轉標志
void KeyDriver();
void main()
{
EA = 1;
ENLED = 0;
ADDR3 = 1;
LedBuff[0] = LedChar[0];
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x67;
ET0 = 1;
TR0 = 1;
while(1)
{
KeyDriver();
}
}
void ShowNumber(unsigned char num) //數碼管顯示函數
{
signed char i;
unsigned char buf[6];
for(i=0; i<3; i++) //分離轉動圈數暫存
{
buf[i] = num % 10;
num = num / 10;
}
for(i=3; i>=1; i--) //高位是零不顯示
{
if(buf[i] == 0)
LedBuff[i] = 0xFF;
else
break;
}
if(dir != 0) //反轉時圈數前面加負號
{
if(i < 3)
LedBuff[i+1] = 0xBF;
}
for( ; i>=0; i--) //顯示電機轉動圈數
LedBuff[i] = LedChar[buf[i]];
}
void StartMotor(signed long angle) //電機啟動函數
{
EA = 0;
beats = angle * 4076 / 360;
EA = 1;
}
void StopMotor() //電機停止函數
{
beats = 0;
}
void KeyAction(unsigned char keycode) //按鍵動作函數
{
static unsigned char addend = 0;
if((keycode >= 0x30) && (keycode <= 0x39))
{
addend = (addend * 10) + (keycode - 0x30);
if(addend > 90)
addend = 0;
ShowNumber(addend);
}
else if(keycode == 0x26)
{
dir = 0;
ShowNumber(addend);
}
else if(keycode == 0x28)
{
dir = 1;
ShowNumber(addend);
}
else if(keycode == 0x25)
StartMotor(90);
else if(keycode == 0x27)
StartMotor(-90);
else if(keycode == 0x0D)
{
if(dir == 0)
{
StartMotor(360 * addend);
}
else
{
StartMotor(- 360 * addend);
}
}
else if(keycode == 0x1B)
{
StopMotor();
addend = 0;
ShowNumber(addend);
}
}
void KeyDriver() //按鍵驅動函數
{
unsigned char i, j;
static unsigned char backup[4][4] = {
{1,1,1,1}, {1,1,1,1}, {1,1,1,1}, {1,1,1,1}};
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
{
if(KeySta[i][j] != backup[i][j])
{
if(backup[i][j] == 0)
{
KeyAction(KeyCodeMap[i][j]);
}
backup[i][j] = KeySta[i][j];
}
}
}
}
void KeyScan() //按鍵掃描函數
{
unsigned char i;
unsigned char keybuf[4][4];
static unsigned char keyout = 0;
keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KEYIN_1;
keybuf[keyout][1] = (keybuf[keyout][1] << 1) | KEYIN_2;
keybuf[keyout][2] = (keybuf[keyout][2] << 1) | KEYIN_3;
keybuf[keyout][3] = (keybuf[keyout][3] << 1) | KEYIN_4;
for(i=0; i<4; i++)
{
if((keybuf[keyout][i] & 0x0F) == 0x0F)
KeySta[keyout][i] = 1;
else if((keybuf[keyout][i] & 0x0F) == 0x00)
KeySta[keyout][i] = 0;
}
keyout++;
keyout = keyout & 0x3;
switch(keyout)
{
case 0: KEYOUT_4 = 1; KEYOUT_1 = 0; break;
case 1: KEYOUT_1 = 1; KEYOUT_2 = 0; break;
case 2: KEYOUT_2 = 1; KEYOUT_3 = 0; break;
case 3: KEYOUT_3 = 1; KEYOUT_4 = 0; break;
default: break;
}
}
void LedScan() //數碼管掃描函數
{
static unsigned char i = 0;
P0 = 0xFF;
P1 = (P1 & 0xF8) | i;
P0 = LedBuff[i];
if(i < 5)
i++;
else
i = 0;
}
void TurnMotor() //電機運轉函數
{
unsigned char tmp;
static unsigned char index = 0;
if(beats != 0)
{
if(beats > 0)
{
index++;
index = index & 0x7;
beats--;
}
else
{
index--;
index = index & 0x7;
beats++;
}
tmp = P3;
tmp = (tmp & 0xF0) | BeatCode[index];
P3 = tmp;
}
else
P3 = P3 | 0x0F;
}
void Timer0() interrupt 1
{
static bit div = 0;
TH0 = 0xFC;
TL0 = 0x67;
KeyScan();
LedScan();
div = ~div;
if(div)
{
TurnMotor();
}
}
復制代碼
作者:
lern01
時間:
2017-10-21 22:28
自己頂頂頂
作者:
lern01
時間:
2017-10-21 22:29
大俠們出來幫幫忙吧
作者:
lern01
時間:
2017-10-21 22:34
自己不可頂嗎?
作者:
shy77210
時間:
2017-10-21 22:49
數碼管顯示函數buf是char類型求組,把num定義成int類型不能計算吧,除非強制轉換類型。
作者:
botgs
時間:
2017-10-22 11:07
我感覺樓上說的對,
buf
= num % 10;
這句話等號兩邊的數據類型不一樣,需要對等號右邊的運算結果進行強制類型轉換,你可以試一下。
作者:
111314
時間:
2017-10-22 17:45
前后數據類型不一致,需要轉換即可
作者:
lern01
時間:
2017-10-23 18:55
但下面這個函數可以正常顯示,為什么
void ShowNumber(unsigned long num)
{
signed char i;
unsigned char buf[6];
for (i=0; i<6; i++)
{
buf[i] = num % 10;
num = num / 10;
}
for (i=5; i>=1; i--) //從最高位起
{
if (buf[i] == 0)
LedBuff[i] = 0xFF;
else
break;
}
for ( ; i>=0; i--)
{
LedBuff[i] = LedChar[buf[i]];
}
}
作者:
lern01
時間:
2017-10-29 09:46
還有人能解釋嗎?困惑中。。。。
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲成人www
|
成人免费淫片aa视频免费
|
欧洲一区二区视频
|
中文字幕在线三区
|
久久久久国产一区二区
|
欧美一区二区三区,视频
|
欧美精品在线观看
|
日本精品一区二区三区在线观看
|
91色在线
|
91精品久久久
|
国产一级片免费在线观看
|
精品久久久久久久
|
日韩网站免费观看
|
北条麻妃视频在线观看
|
亚洲综合视频
|
国产乱精品一区二区三区
|
亚洲视频二区
|
精品少妇v888av
|
成人av网站在线观看
|
亚洲在线
|
中文字幕韩在线第一页
|
国产美女在线观看
|
国产黄色网址在线观看
|
久久精品久久久久久
|
欧美日韩中文字幕在线播放
|
久久国产高清视频
|
五月天婷婷综合
|
国产探花在线精品一区二区
|
日韩精品av一区二区三区
|
中文天堂在线一区
|
少妇性l交大片免费一
|
av一级
|
欧美成人一区二区三区
|
一区二区视频免费观看
|
欧美久久久网站
|
色在线免费视频
|
日韩国产一区二区三区
|
91麻豆精品一区二区三区
|
免费a级毛片在线播放
|
亚洲国产成人精品在线
|
欧美日韩三级
|