Свежие обсуждения
Микроконтроллеры

Ликбез по С для микроконтроллеров PIC

1 26 64

ты хоть в аску вечером зайди. часов в 20 00

 

electric: а как сделать так как на асме делалось:
bsf TRISB,2
bcf TRISC,5
и т.д

TRISB2=1;
TRISC5=0;

Тоже все очень просто, смотри соответствующий файл контроллера *.h

 


ring()
{
clr_lcd();
temp_lcd=0b11000011;
lcd_com();
word5();
temp_lcd=0x20;
lcd_char();
word4();
{
// effect();
if (RB5!=1);
// up();
if (RB4!=1);
// no_calls();
{
RA2=1;
clr_lcd();
temp_lcd=0b11000011;
lcd_char();
word9();
temp_lcd=0x20;
lcd_char();
word10();
for (i=0; i500; i++); //отрегулировать на 0.7 сек
clr_lcd();
temp_lcd=0b11000110;
lcd_com();
word11();
temp_lcd=0b10011000;
lcd_com();
word15();
temp_lcd=0x3a;
lcd_char();
// time(); // функция подщета времени
{
clr_lcd();
temp_lcd=0b11000011;
lcd_com();
word12();
temp_lcd=0x20;
lcd_char();
word13();
for (i=0; i500; i++); // отрегулировать на 3 сек
clr_lcd();
temp_lcd=0b11000010;
lcd_com();
word15();
temp_lcd=0x20;
.....
первый вопрос: вот там где кнопка проверяеся как мне сделать чтоб зациклить вектор там?
второй вопрос: вот на диспл я отсылаю данные так, сначала в темп потом макрос соответствующей функции, можно ли проще??
lcd_char()
{
RB1=1;
PORTD=temp_lcd;
RB0=1;
#asm
nop
#endasm
RB0=0;
{
for (i=0; i100; i++);
}
return;
}

lcd_com()
{
RB1=0;
PORTD=temp_lcd;
RB0=1;
#asm
nop
#endasm
RB0=0;
{
for (i=0; i100; i++);
}
return;
}
это те макросы.

 

и еще вопрос как мне написат вот такой код?:

забэкапить число
вычесть из числа 100 пместить результат в рег result
проверить бит переноса
a++
если нет то в $-3
поместить result в temp
вычесть из temp 10 пместить результат в рег result
проверить бит переноса
b++
если нет то в $-3
поместить result в temp
вычесть из temp 1 пместить результат в рег result
проверить бит переноса
c++
если нет то в $-3

короче прога должна раскидать восьмибитное число по регистрам - сотни , десятки , еденицы

 

я так делаю:

d1 = temp / 100
d2 = temp / 10 Mod 10
d3 = temp Mod 10

правда это в бейсике, но принцип я думаю понятен:
восьмибитное число temp раскидывается по декадам,
где d1-сотни, d2-десятки, d3-единицы

 

Мне кажется большим извращением писать программу на ассемблере используя для этого синтаксис языка C.
electric: прога должна раскидать восьмибитное число по регистрам - сотни , десятки , еденицы
x - заданное число; a,b,c - соответственно сотни, десятки, единицы.
В стандартном C это будет выглядеть примерно так:

a=0; b=0; c=x;
while (c>=100) {a++; c-=100;}
while (c>=10) {b++; c-=10;}

Можно ещё нахождением остатка от деления, но мне кажется на пике это будет дольше выполняться.

 

спасибо попробую. а вот пост перед этим где число раскидывается подскажите.

 

работает. последовал примеру SAK'а
а в чем фишкА?
a=0; b=0; c=x;
вот a понятно,b понятно ,а с = х зачем? объясните как рабоает прога??я просто не понял.

 

Очень просто работает: в "c" записывается исходное число и пока значение этой переменной больше или равно 100 из него вычитаем 100 и увеличиваем счётчик сотен на единицу при каждом вычитании. Затем также поступаем с десятками. После этого в переменной "c" останутся единицы и с ними уже ничего делать не надо.
electric: с = х зачем?
Ну так кто просил: забэкапить число
Исходная переменная "x" при вычислениях не изменяется, поэтому и не портебуется его "бэкапить"

 

electric
сегодня, 10:25

ring()
{
clr_lcd();
temp_lcd=0b11000011;
lcd_com();
word5();
temp_lcd=0x20;
lcd_char();
word4();
{
// effect();
if (RB5!=1);
// up();
if (RB4!=1);
// no_calls();
{
RA2=1;
clr_lcd();
temp_lcd=0b11000011;
lcd_char();
word9();
temp_lcd=0x20;
lcd_char();
word10();
for (i=0; i500; i++); //отрегулировать на 0.7 сек
clr_lcd();
temp_lcd=0b11000110;
lcd_com();
word11();
temp_lcd=0b10011000;
lcd_com();
word15();
temp_lcd=0x3a;
lcd_char();
// time(); // функция подщета времени
{
clr_lcd();
temp_lcd=0b11000011;
lcd_com();
word12();
temp_lcd=0x20;
lcd_char();
word13();
for (i=0; i500; i++); // отрегулировать на 3 сек
clr_lcd();
temp_lcd=0b11000010;
lcd_com();
word15();
temp_lcd=0x20;
.....
первый вопрос: вот там где кнопка проверяеся как мне сделать чтоб зациклить вектор там?
второй вопрос: вот на диспл я отсылаю данные так, сначала в темп потом макрос соответствующей функции, можно ли проще??
lcd_char()
{
RB1=1;
PORTD=temp_lcd;
RB0=1;
#asm
nop
#endasm
RB0=0;
{
for (i=0; i100; i++);
}
return;
}

lcd_com()
{
RB1=0;
PORTD=temp_lcd;
RB0=1;
#asm
nop
#endasm
RB0=0;
{
for (i=0; i100; i++);
}
return;
}
это те макросы.

это то обясните плиззз