Пт мар 13, 2015 08:45:16
Пт мар 13, 2015 08:47:55
Действительно, не то что можно (как я написал), а НУЖНО защёлкивать после передачи всех байтов.ARV писал(а):да, главное: защелкивать регистр надо после вывода 2-х байтов, а не после каждого, иначе будет фигня, они же оба одновременно защелкиваются
Вс мар 15, 2015 00:31:02
Вс мар 15, 2015 11:22:22
У Вас в массиве SEGMENTE всего 10 элементов. Откуда 11-13 взялись ?SEGMENTE[11];
......
SEGMENTE[12];
......
SEGMENTE[13];
А как Вы задаёте эту частоту ?При небольшой частоте обновления
Вс мар 15, 2015 12:33:12
Вс мар 15, 2015 15:22:26
Дык у Вас в массиве то ВСЕГО 10 ЭЛЕМЕНТОВ ! А Вы пытаетесь выдернуть из него 11-ый, 12-ый и 13-ый !djrec писал(а):SEGMENTE 11-13 это байт для зажигания цифры на индикаторе (катод).
Вс мар 15, 2015 16:20:26
Вс мар 15, 2015 21:26:10
Вс мар 15, 2015 22:49:00
Вс мар 15, 2015 22:52:29
Вс мар 15, 2015 23:04:51
Вс мар 15, 2015 23:20:33
//***********************************************************************************************
volatile unsigned int temperature;
// Массив значениий для семисегментного индикатора
//----------
char SEGMENTE[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D,
//----------
0x7D, 0x07, 0x7F, 0x6F, 0x00, 0xF7, 0xFB, 0xFD};
//***********************************************************************************************
//***********************************************************************************************
void out_latch(void){
PORTC |= (1 << PC1);
PORTC &= ~(1 << PC1);
}
//***********************************************************************************************
void out_byte(unsigned char data){
unsigned char i=8;
while(i--){
if(data & 0x80) PORTC |= (1 << PC0); // DATA 1
else PORTC &= ~(1 << PC0); // DATA 0
PORTC |= (1 << PC2); // CLK 1
PORTC &= ~(1 << PC2); // CLK 0
data<<=1;
}
}
//***********************************************************************************************
void write_display(unsigned char *data){
out_byte(0xff);
out_latch();
out_byte(data[0]);
out_byte(data[1]);
out_latch();
}
//***********************************************************************************************
//***********************************************************************************************
void main(void){
unsigned char display[2];
temperature=123;
while(1){
display[0] = SEGMENTE[temperature % 10];
display[1] = 0xf7;
write_display(display);
_delay_ms(3);
display[0] = SEGMENTE[(temperature / 10) % 10];
display[1] = 0xfb;
write_display(display);
_delay_ms(3);
display[0] = SEGMENTE[(temperature / 100) % 10];
if(display[0]==SEGMENTE[0]) display[0]=SEGMENTE[10]; // Гашение нуля
display[1] = 0xfd;
write_display(display);
_delay_ms(3);
}
}
//***********************************************************************************************
Пн мар 16, 2015 00:02:51
//***********************************************************************************************
unsigned char display[4];
volatile unsigned int temperature;
// Массив значениий для семисегментного индикатора
//----------
char SEGMENTE[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x00};
//***********************************************************************************************
//***********************************************************************************************
void out_latch(void){
PORTC |= (1 << PC1);
PORTC &= ~(1 << PC1);
}
//***********************************************************************************************
void out_byte(unsigned char data){
unsigned char i=8;
while(i--){
if(data & 0x80) PORTC |= (1 << PC0); // DATA 1
else PORTC &= ~(1 << PC0); // DATA 0
PORTC |= (1 << PC2); // CLK 1
PORTC &= ~(1 << PC2); // CLK 0
data<<=1;
}
}
//***********************************************************************************************
void write_display(unsigned char data, unsigned char ind_num){
out_byte(0xff); // На железе эти 2 строки
out_latch(); // можно убрать !
out_byte(data);
out_byte(~(1<<ind_num));
out_latch();
}
//***********************************************************************************************
//***********************************************************************************************
void main(void){
temperature=123;
display[0] = SEGMENTE[10];
display[1] = SEGMENTE[1];
display[2] = SEGMENTE[2];
display[3] = SEGMENTE[3];
while(1){
//****** Замена обработчика прерываний ********//
_delay_ms(1);
{
static unsigned char i=0;
write_display(display[i], i);
if(++i>=4) i=0;
}
//*********************************************//
}
}
//***********************************************************************************************
Пн мар 16, 2015 09:15:51
Ср янв 31, 2018 22:23:16
#include <mega128.h>
#include <delay.h>
#include <io.h>
#include <string.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define decc 4 // колличество разрядов
unsigned char test_data[decc];
unsigned char test_data_dot[decc];
////// DM135B --bit`s
/// D15=segA1; D14=segB1; D13=segC1; D12=segD1; D11=segE1; D10=segF1; D9=segG1; D8=segH1; --1DEC
/// D7=segA2; D6=segB2; D5=segC2; D4=segD2; D3=segE2; D2=segF2; D1=segG2; D0=segH2. --2DEC
//////////////////////////
unsigned char char2byte( unsigned char ch ){
switch(ch){
case 0 : return 0x3f;
case 1 : return 0x06;
case 2 : return 0x5B;
case 3 : return 0x4F;
case 4 : return 0x66;
case 5 : return 0x6D;
case 6 : return 0x7D;
case 7 : return 0x27;
case 8 : return 0x7F;
case 9 : return 0x6F;
case 'a' : return 0x77;
case 'b' : return 0x7C;
case 'c' : return 0x39;
case 'd' : return 0x5E;
case 'e' : return 0x79;
case 'f' : return 0x71;
case 'g' : return 0x3D;
case 'h' : return 0x74;
case 'u' : return 0x3E;
case 'o' : return 0x5C;
case 'i' : return 0x30;
case 't' : return 0x78;
case 's' : return 0x6D;
case 'r' : return 0x50;
case 'П' : return 0x37;
case 'p' : return 0x73;
case 'Г' : return 0x31;
case '_' : return 0x08;
case '-' : return 0x40;
case '+' : return 0x70;
case '=' : return 0x48;
case '°' : return 0x63;
case '.' : return 0x80;
case ' ' : return 0x00;
default : return 0x00;
}
}
////////////////////
void clock()
{
PORTA = PORTA | (1<<1) ; //1
#asm("nop");
PORTA = PORTA & ~(1<<1); //0
} ;
void _dm135(const char *data, unsigned char *dot_)
{
unsigned char i, j;
// PORTA, configure pins 0..2 as outputs
// pin0 - data, pin1 - clock, pin2 - latch:
DDRA |= (1 << 2) | (1 << 1) | (1 << 0);
// reset data, clock and latch pins:
PORTA &= ~((1 << 2) | (1 << 1) | (1 << 0));
// send bytes
for (i = 0; i < decc; i++) {
// 8 bits in each byte
j = 8;
while (j-- > 0) {
// pin0 (1 << 0) - data
if (dot_[i] == 1) { // Кроме if (x & (1 << j)) других сдвигов не нужно!
if (( char2byte(data[i]) + 0x80 ) & (1 << j)) {
PORTA = PORTA |= 1;
} else {
PORTA = PORTA &= ~1;
}
} else {
if (( char2byte(data[i]) + 0x00 ) & (1 << j)) {
PORTA = PORTA |= 1;
} else {
PORTA = PORTA &= ~1;
}
}
clock();
}
}
// pulse latch input (0 to 1, then 1 to 0):
PORTA |= (1 << 2);
#asm("nop");
PORTA &= ~(1 << 2);
}
void wr7seg__(unsigned char dig)
{ unsigned int tmp;
tmp = font7seg[dig];
_dm135(tmp);
};