Я изучаю PIC (pic18f4550) и довольно плохо знаком с программированием микроконтроллеров. Я пытаюсь получить значение три кнопки на PORTA и отправить его в светодиодную матрицу 8×8 в виде координат X через 74LS595. Проблема в том, что значение, отображаемое в светодиодной матрице, не изменяется, когда я нажимаю кнопки, чтобы создать другое значение. Я симулирую на Proteus, поэтому я думаю, что мне не нужна функция debounce.
Вот мой код и схема:
#include<p18f4550.h>
#define SCK LATBbits.LATB0
#define DATA PORTBbits.RB1
#define SCL PORTBbits.RB2
void Data_in(unsigned char k){
DATA=k;
SCK=0;
SCK=1;
}
void LatchData(){
SCL=0;
SCL=1;
}
void Send1byte(unsigned char data)
{
unsigned char i,temp;
for(i=0;i<8;i++)
{
temp = data & (1<<i);
if(temp)
{
DATA = 1;
}
else
{
DATA = 0;
}
SCK = 0;
SCK = 1;
}
SCL = 0;
SCL = 1;
}
unsigned char getMatrixX(unsigned char in_X)
{
switch(in_X)
{
case 0: // the value stuck here
return 0b01111111;
case 1:
return 0b10111111;
case 2:
return 0b11011111;
case 3:
return 0b11101111;
case 4:
return 0b11110111;
case 5:
return 0b11111011;
case 6:
return 0b11111101;
case 7:
return 0b11111110;
default:
return 0b11111111;
}
}
void main()
{
TRISA = 1;
TRISC = 1;
TRISB = 0;
TRISD = 0;
PORTD = 0x80;
while(1){
Send1byte(getMatrixX(LATA));
}
}
Это ссылка на мою схему:
моя схема
Очень ценю любые решения и советы. Извините за мой плохой английский.
здесь реальная проблема — аналоговая функция RA0: RA3, поэтому добавление их исправит:
ADCON1 = 0x0F; // All digital inputs
CMCON = 0x07; // Comparators off (note this is the POR default)
Спасибо Дэвиду в этом вопросе: https://electronics.stackexchange.com/questions/111614/pic-programming-get-value-of-multiple-buttons-to-a-port/111625?noredirect=1#111625 , он объяснил это очень хорошо.