久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
求大俠幫忙有關(guān)單片機(jī)數(shù)據(jù)類型的困惑
[打印本頁]
作者:
lern01
時(shí)間:
2017-10-21 10:22
標(biāo)題:
求大俠幫忙有關(guān)單片機(jī)數(shù)據(jù)類型的困惑
做了一個(gè)單片機(jī)按鍵控制步進(jìn)電機(jī)程序,將addendt和num定義為int或long型,均不能正常工作,定義為char型,沒問題。求大俠給予指導(dǎo),在下先謝了。
代碼如下:
#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] = { //矩陣按鍵編號(hào)到標(biāo)準(zhǔn)鍵盤鍵碼的映射表
{ 0x31, 0x32, 0x33, 0x26 }, //數(shù)字鍵 1、數(shù)字鍵 2、數(shù)字鍵 3、向上鍵
{ 0x34, 0x35, 0x36, 0x25 }, //數(shù)字鍵 4、數(shù)字鍵 5、數(shù)字鍵 6、向左鍵
{ 0x37, 0x38, 0x39, 0x28 }, //數(shù)字鍵 7、數(shù)字鍵 8、數(shù)字鍵 9、向下鍵
{ 0x30, 0x1B, 0x0D, 0x27 } //數(shù)字鍵 0、ESC 鍵、 回車鍵、 向右鍵
};
unsigned char code BeatCode[8] = { //步進(jìn)電機(jī)節(jié)拍對(duì)應(yīng)的 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; //電機(jī)總節(jié)拍數(shù)
bit dir = 0; //電機(jī)正反轉(zhuǎn)標(biāo)志
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) //數(shù)碼管顯示函數(shù)
{
signed char i;
unsigned char buf[6];
for(i=0; i<3; i++) //分離轉(zhuǎn)動(dòng)圈數(shù)暫存
{
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) //反轉(zhuǎn)時(shí)圈數(shù)前面加負(fù)號(hào)
{
if(i < 3)
LedBuff[i+1] = 0xBF;
}
for( ; i>=0; i--) //顯示電機(jī)轉(zhuǎn)動(dòng)圈數(shù)
LedBuff[i] = LedChar[buf[i]];
}
void StartMotor(signed long angle) //電機(jī)啟動(dòng)函數(shù)
{
EA = 0;
beats = angle * 4076 / 360;
EA = 1;
}
void StopMotor() //電機(jī)停止函數(shù)
{
beats = 0;
}
void KeyAction(unsigned char keycode) //按鍵動(dòng)作函數(shù)
{
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() //按鍵驅(qū)動(dòng)函數(shù)
{
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() //按鍵掃描函數(shù)
{
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() //數(shù)碼管掃描函數(shù)
{
static unsigned char i = 0;
P0 = 0xFF;
P1 = (P1 & 0xF8) | i;
P0 = LedBuff[i];
if(i < 5)
i++;
else
i = 0;
}
void TurnMotor() //電機(jī)運(yùn)轉(zhuǎn)函數(shù)
{
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();
}
}
復(fù)制代碼
作者:
lern01
時(shí)間:
2017-10-21 22:28
自己頂頂頂
作者:
lern01
時(shí)間:
2017-10-21 22:29
大俠們出來幫幫忙吧
作者:
lern01
時(shí)間:
2017-10-21 22:34
自己不可頂嗎?
作者:
shy77210
時(shí)間:
2017-10-21 22:49
數(shù)碼管顯示函數(shù)buf是char類型求組,把num定義成int類型不能計(jì)算吧,除非強(qiáng)制轉(zhuǎn)換類型。
作者:
botgs
時(shí)間:
2017-10-22 11:07
我感覺樓上說的對(duì),
buf
= num % 10;
這句話等號(hào)兩邊的數(shù)據(jù)類型不一樣,需要對(duì)等號(hào)右邊的運(yùn)算結(jié)果進(jìn)行強(qiáng)制類型轉(zhuǎn)換,你可以試一下。
作者:
111314
時(shí)間:
2017-10-22 17:45
前后數(shù)據(jù)類型不一致,需要轉(zhuǎn)換即可
作者:
lern01
時(shí)間:
2017-10-23 18:55
但下面這個(gè)函數(shù)可以正常顯示,為什么
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
時(shí)間:
2017-10-29 09:46
還有人能解釋嗎?困惑中。。。。
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
www.天天操
|
国产精品久久久久久中文字
|
亚洲视频在线看
|
精品久久久久久久人人人人传媒
|
国产精品一码二码三码在线
|
欧美大片久久久
|
av中文字幕在线
|
亚洲国产精品网站
|
精品视频在线观看
|
一区二区三区久久久
|
国产高清在线视频
|
成人网av
|
欧美区在线
|
一级毛片免费视频观看
|
久久一
|
一区二区三区免费
|
精品国产91乱码一区二区三区
|
亚洲欧美精
|
亚洲国产福利视频
|
国产超碰人人爽人人做人人爱
|
精品不卡
|
91久色
|
国产一区免费视频
|
亚洲欧美在线观看
|
精品一区二区三区在线观看国产
|
日韩欧美不卡
|
91社区视频
|
婷婷在线免费
|
www.日本在线观看
|
亚洲成人三区
|
欧美中文字幕在线
|
欧美成人精品一区二区三区
|
国产精品免费观看
|
国产高清视频一区二区
|
色视频在线播放
|
久久久精品视频一区二区三区
|
大象一区
|
欧美视频1
|
亚洲精品成人av久久
|
91av小视频
|
欧美日韩国产精品一区二区
|