Вт апр 18, 2017 15:07:30
typedef enum{
STATE_OFF,
STATE_LEFT,
STATE_RIGHT,
STATE_ALARM
} states;
states state;
volatile int counter;
interrupt [TIM1_COMPA] void timer1_compa_isr(void){
counter++;
}
void main(void){
// тут добавить настройки таймера и портов
while(1){
if(!alarm_butt) state = STATE_ALARM;
else if(!left_butt) state = STATE_LEFT;
else if(!right_butt) state = STATE_RIGHT;
else state = STATE_OFF;
if(counter & 1)
switch(state){
case STATE_LEFT: left_on; break;
case STATE_RIGHT: right_on; break;
case STATE_ALARM: right_on; left_on; break;
}
else {
left_off;
right_off;
}
}
}
Чт апр 20, 2017 19:53:25
Чт май 18, 2017 20:44:18
typedef enum KEY_DEFINITION {
KEY_NO_DATA = 0u,
KEY_SET = 0x40u,
KEY_MODE = 0x10u,
KEY_RELEASE = 0x02u
} keys_t;
#define KEYMASK (unsigned char)(KEY_SET | KEY_MODE)
unsigned char kbdread(void) {
unsigned char readkey;
static unsigned char repeated, prevkey;
readkey = (PORTC ^ KEYMASK) & KEYMASK;
#define PORTC PORTC
extern volatile unsigned char PORTC @ 0x007;
Чт май 18, 2017 21:56:19
Чт май 18, 2017 22:12:25
(PORTC ^ KEYMASK) & KEYMASK
Чт май 18, 2017 22:36:09
(PORTC ^ KEYMASK) & KEYMASK
Чт май 18, 2017 23:23:43
readkey = (PORTC ^ KEYMASK) & KEYMASK;
int tmp = (PORTC ^ KEYMASK) & KEYMASK;
readkey = tmp;
Пт май 19, 2017 06:05:07
#define KEY_SET (1u<<6)
#define KEY_MODE (1u<<4)
#define KEY_RELEASE (1u<<1)
#define KEYMASK (KEY_SET | KEY_MODE)
XC8 v1.42 pic16f723aКакой компилятор и проц ?
1. Избегайте логических операций с константами enum, иначе могут появляться предупреждения несоответствия типа Warning[Pe188]. Причина в том, что операторы логики дают в результате своей работы целый тип, а не тот тип, который определен в typedef enum. Задавать битовый маски константами enum тоже плохая идея.
Пт июн 02, 2017 22:26:12
while(1)
{
PORTE.OUT = ~led;
_delay_ms(BLINK_DELAY_MS);
led <<= 1;
if (led == 0) led=0b00000001;
}
while(1)
{
for (led = 0b00000001;led != 0;led <<= 1)
{
PORTE.OUT = ~led;
_delay_ms(BLINK_DELAY_MS);
}
}
Пт июн 02, 2017 23:09:29
Сб июн 03, 2017 06:34:58
Пн июн 05, 2017 12:51:26
Пн июн 05, 2017 12:58:17
и яZhuk72 писал(а):Я и сам вечно начинающий в Си
Моё мнение - чем проще, тем лучше. иногда принцип чуть меняется: чем ближе к сути происходящего, тем лучше.Пока_без_кота писал(а):Я хочу знать, "правильно" ли так писать, или надо (желательно, принято и т.п) расписывать в 2 строки
Вт июн 13, 2017 15:22:08
const unsigned char lcd_font[159][5] =
{
0x00, 0x00, 0x00, 0x00, 0x00, // sp - 0
0x00, 0x00, 0x2f, 0x00, 0x00, // ! - 1
0x00, 0x07, 0x00, 0x07, 0x00, // " - 2
0x14, 0x7f, 0x14, 0x7f, 0x14, // # - 3
0x24, 0x2a, 0x7f, 0x2a, 0x12, // $ - 4
и т.д.
}
void lcd_out (unsigned char row, unsigned char col, unsigned char *text)
{
unsigned char ch, i;
unsigned char *ptr;
lcd_setxy(row,col*6);
ptr = lcd_font; // a value of type "const unsigned char (*)[5]" cannot be assigned to an entity of type "unsigned char *"
while (*text != "\0") // operand types are incompatible ("unsigned char" and "char *")
{
ch = *text;
if ((ch >= 32) && (ch <= '~')) ch -= 32;
else ch = 255;
for (i = 0; i < 5 ; i++)
{
lcd_send(*(ptr+ch * 5 + i),DTA);
}
lcd_send(0,DTA); // Additional space
text++;
}
}
lcd_out(1,3,"test\0");
Вт июн 13, 2017 15:42:45
Вт июн 13, 2017 15:54:38
Вт июн 13, 2017 16:23:03
while (*text)
{
Вт июн 13, 2017 20:49:49
lcd_send(lcd_font[ch][i],DTA);
passing 'char [5]' to parameter of type 'unsigned char *' converts between pointers to integer types with different sign
Вт июн 13, 2017 20:55:14
Один - указатель на константу int, другой - указатель-константа на int.Zhuk72 писал(а):Вычитал тут, правда по плюсам, что может быть const int *ptr и int *const ptr.
ptr должен быть указателем на такой же тип, с такими же квалификаторами, как и lcd_font.Zhuk72 писал(а):но ptr = lcd_font все равно вызывает ошибку.
Вт июн 13, 2017 21:01:28