📄 disp.c
字号:
#include <inttypes.h>
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
//#include "type.h"
#include "disp.h"
/*
* 74HC138 INPUT A B C : PA5 PA6 PA7
* Data PORT: 74HC595的ST对应NCS :PA2
* SH对应SCK :PA3
* DS对应MOSI:PA4
*
*/
#define DispSel(x) (PORTA=((PORTA&0x1f)|(x<<5)))
#define NCS_PIN PA2
#define NCS_DDR DDRA
#define NCS_PORT PORTA
#define SCK_PIN PA3
#define SCK_DDR DDRA
#define SCK_PORT PORTA
#define MOSI_PIN PA4
#define MOSI_DDR DDRA
#define MOSI_PORT PORTA
#define NCS_SET (NCS_PORT|=(1<<NCS_PIN))
#define NCS_CLR (NCS_PORT&=~(1<<NCS_PIN))
#define SCK_SET (SCK_PORT|=(1<<SCK_PIN))
#define SCK_CLR (SCK_PORT&=~(1<<SCK_PIN))
#define MOSI_SET (MOSI_PORT|=(1<<MOSI_PIN))
#define MOSI_CLR (MOSI_PORT&=~(1<<MOSI_PIN))
//四位共阳数码管码
//PB 0 1 2 3 4 5 6 7
// a b c d e f g h
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, ., off
const uint8_t NumTab[19]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xFF};
//uint8_t DispBuf[8];
/*
#define DispPortInit() do{\
NCS_DDR|=(1<<NCS_PIN);\
SCK_DDR|=(1<<SCK_PIN);\
MOSI_DDR|=(1<<MOSI_PIN);\
DispData(0xff);\
DDRA|=(1<<PA5)|(1<<PA6)|(1<<PA7);\
}while(0)
*/
void DispData(uint8_t x)
{
uint8_t i;
NCS_CLR;
SCK_CLR;
for(i=0;i<8;i++)
{
if(x&0x80) //一位一位数据通过MOSI(PA4)输出,先输出高位
MOSI_SET;
else MOSI_CLR;
SCK_SET; //上升沿有效,SCK对应74HC595的ST_CP,逐位移位输入,但Qn引脚不改变
SCK_CLR;
x<<=1;
}
NCS_SET; //上升沿有效,NSC对应74HC595的SH_CP,当8位数据均移入后,才改变Qn的引脚电平,并行输出8位数据
}
void DispPortInit(void)
{
NCS_DDR|=(1<<NCS_PIN);
SCK_DDR|=(1<<SCK_PIN);
MOSI_DDR|=(1<<MOSI_PIN);
DispData(NumTab[17]);
DDRA|=(1<<PA5)|(1<<PA6)|(1<<PA7);
}
void Disp(uint8_t *p)
{
uint8_t i;
for(i=0;i<8;i++)
{
DispSel(i);
if(i==4)_delay_ms(1);
DispData(NumTab[*p++]);
_delay_ms(1);
DispData(NumTab[17]);//off the disp
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -