📄 7279a.#3
字号:
#include "c8051f020.h"
#include <intrins.h>
sbit HD7279_DAT=P1^7;
sbit HD7279_CLK=P1^6;
#define NOSELECT7279 P5 |= 0x80 //SPICS4(P57)=1
#define SELECT7279 P5 &= ~(0x80) //SPICS4(P57)=0;
#define Set7279DAT HD7279_DAT=1
#define Clr7279DAT HD7279_DAT=0
#define Set7279CLK HD7279_CLK=1
#define Clr7279CLK HD7279_CLK=0
void SYSCLK_Init (void); //初始化时钟
void Delay1us (unsigned char T);
void Delay1ms(unsigned char T);
void Delay1s(unsigned char T);
void Timer0_Init (void); //初始化定时器
void PORT_Init (void); //初始化IO口
void SPI0_Init (void); //初始化SPI0
void Send7279Byte(unsigned char ch);
void Test7279(bit LoopFlag);
void main (void)
{
WDTCN = 0xde;
WDTCN = 0xad; //关看门狗
SYSCLK_Init (); //初始化时钟
Timer0_Init(); //初始化定时器
PORT_Init (); //初始化IO口
SPI0_Init (); //初始化SPI0
// CPT1CN |= 0x80; //使能比较器1
// REF0CN = 0x03; //使能片内参考电压
// DAC0CN |= 0x80; //使能DAC0
// DAC0H=0;
// DAC0L=0;
EA=1; //开中断
Test7279(1);
}
void SYSCLK_Init (void)
{
int i; // delay counter
OSCXCN = 0x67; // start external oscillator with
// 18.432MHz crystal
for (i=0; i < 256; i++) ; // Wait for osc. to start up
//while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
// source and enable missing clock detector
}
void PORT_Init (void) // 初始化IO口
{
XBR0 = 0x07; // Enable SMBus, SPI0, and UART0
XBR1 = 0x00;
XBR2 = 0x44; // Enable crossbar and weak pull-ups
EMI0TC = 0x21;
P74OUT = 0xFF;
P0MDOUT = 0x15;
P1MDOUT |= 0x3C; //P1.2-P1.5推挽输出
P1 &= 0xc3; //P1.2-P1.5=0
}
void SPI0_Init (void) //初始化SPI0
{
SPI0CFG = 0x07; // data sampled on 1st SCK rising edge
// 8-bit data words
SPI0CFG|=0xC0; //CKPOL =1;
SPI0CN = 0x03; // Master mode; SPI enabled; flags
// cleared
SPI0CKR = SYSCLK/2/8000000-1; // SPI clock <= 8MHz (limited by
// EEPROM spec.)
}
unsigned char Count1ms;
void Timer0_Init (void) //定时器0初始化,定时1ms
{
CKCON|=0x8;
TMOD|=0x1; //定时器0方式1,16Bit
Count1ms=10;
TR0 = 0; // STOP Timer0
TH0 = (-SYSCLK/1000) >> 8; // set Timer0 to overflow in 1ms
TL0 = -SYSCLK/1000;
TR0 = 1; // START Timer0
IE|= 0x2;
}
void Timer0_ISR (void) interrupt 1 // 定时器0中断服务程序
{
TH0 = (-SYSCLK/1000) >> 8;
TL0 = -SYSCLK/1000;
if (Count1ms) Count1ms--;
}
void Send7279Byte(unsigned char ch)
{
char i;
SELECT7279; //置CS低电平
Delay1us(50); //延时50μ
for (i=0;i<8;i++)
{
if (ch&0x80) //输出7位到HD7279A的DATA端
{
Set7279DAT;
}
else
{
Clr7279DAT;
}
Set7279CLK; //置CLK高电平
ch=ch<<1; //待发数据左移
Delay1us(8); //延时8μ
Clr7279CLK; //置CLK低电平
Delay1us(8); //延时50μ
}
Clr7279DAT; //发送完毕,DATA端置低,返回
}
unsigned char Receive7279Byte(void)
{
unsigned char i,ch;
ch=0;
Set7279DAT; //DATA端置为高电平,输入状态
Delay1us(50); //延时50μ
for (i=0;i<8;i++)
{
Set7279CLK; //置CLK高电平
Delay1us(8); //延时8μ
ch=ch<<1; //接收数据左移1位
if (HD7279_DAT)
ch+=1; //接收1位数据
Clr7279CLK; //置CLK低电平
Delay1us(8); //延时8μ
}
Clr7279DAT; //接收完毕,DATA端重新置成低电平(输出状态)
return ch;
}
void FlashLED(unsigned char No)
{
char i;
Send7279Byte(0x88); //发闪烁指令
i=0x1;
while (No)
{
i=i<<1;
No--;
}
Send7279Byte(~i); //1闪烁
NOSELECT7279; //置CS高电平
}
/*
void BlankLED(unsigned char ch)
{
Send7279Byte(0x98); //发消隐指令
Send7279Byte(ch); //1-显示 0-消隐
NOSELECT7279; //置CS高电平
}
*/
void MoveLeft(void)
{
Send7279Byte(0xA1); //发左移指令
NOSELECT7279; //置CS高电平
}
void MoveRight(void)
{
Send7279Byte(0xA0); //发右移指令
NOSELECT7279; //置CS高电平
}
unsigned char code BdSeg[]={
0x7e,0x30,0x6d,0x79, // 0 1 2 3
0x33,0x5b,0x5f,0x70, // 4 5 6 7
0x7f,0x7b,0x77,0x1f, // 8 9 a b
0x4e,0x3d,0x4f,0x47, // c d e f
0x00,0x01};
/*
; b6
; ----
; b1| b0 |b5
; ---- small
; b2| b3 |b4
; ---- .b7
*/
void DispLED(char *DispBuf,char ShowDot)//ShowDot 显示小数点位
{
char i,ch;
ShowDot--;
for (i=0;i<6;i++)
{
ch=DispBuf[i];
if ((ch>='a') && (ch<='f'))
{
ch-='a';ch+=0xa;
}
if ((ch>='A') && (ch<='F'))
{
ch-='A';ch+=0xa;
}
Send7279Byte(0x90+5-i); //不译码
if (ch==' ')
Send7279Byte(0x00);
else
if (ch=='-')
Send7279Byte(0x01);
else
{
if (ShowDot==i)
Send7279Byte(0x80|BdSeg[ch&0x0f]);
else
Send7279Byte(BdSeg[ch&0x0f]);
}
}
NOSELECT7279; //置CS高电平
}
char GetKeyValue(void)
{
char KeyValue;
if (CPT1CN&0x40) return -1; //无键按下
Send7279Byte(0x15); //发读键盘指令
KeyValue=Receive7279Byte();
NOSELECT7279; //置CS高电平
return KeyValue;
}
void WaitKeyOff(void)
{
while (!(CPT1CN&0x40));
}
void Test7279(bit LoopFlag)
{
char i,KeyValue;
Delay1ms(25); //等待25ms复位时间
Send7279Byte(0xA4); //发复位指令
NOSELECT7279; //置CS高电平
if (LoopFlag==0) return;
DispLED("123456",0); //显示123456
for (i=0;i<8;i++)
{
Delay1s(1);
MoveLeft();
}
DispLED("123456",0); //显示123456
DispLED("7890AB",2); //显示123456
DispLED("CDEF -",3); //显示123456
for (i=0;i<6;i++)
{
Delay1s(1);
MoveRight();
}
DispLED("F 1",1); //显示123456
FlashLED(0); //第一位闪烁
Delay1s(1);
FlashLED(1); //第二位闪烁
Delay1s(1);
FlashLED(8); //关闪烁
//BlankLED(0x23); //注意:执行消隐后,键盘输入中断口不能恢复.
for (;;)
{
KeyValue=GetKeyValue();
if(KeyValue!=-1)
{
Send7279Byte(0xC8); //发送键码值,按方式1译码下载显示
Send7279Byte(KeyValue%16);
NOSELECT7279; //置CS高电平
WaitKeyOff();
}
}
}
void Delay1us(unsigned char us)
{
while (us)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
--us;
}
}
void Delay1ms(unsigned char T)
{
Count1ms=T;
while (Count1ms);
}
void Delay1s(unsigned char T)
{
while (T)
{
Delay1ms(200);
Delay1ms(200);
Delay1ms(200);
Delay1ms(200);
Delay1ms(200);
T--;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -