📄 hd7279a.c
字号:
#include <reg52.h>
//*** 函数定义 ***
void long_delay (void); // 长延时
void short_delay (void); // 短暂延时
void delay10ms (unsigned char); // 延时10MS
void write7279 (unsigned char, unsigned char); // 写入到HD7279
unsigned char read7279 (unsigned char); // 从HD7279读出
void send_byte (unsigned char); // 发送一个字节
unsigned char receive_byte (void); // 接收一个字节
//*** 变量及I/O口定义 ***
unsigned char digit[5];
unsigned char key_number, j, k;
unsigned int tmr;
unsigned long wait_cnter;
sbit cs = P0^4; // cs 连接 P1.1
sbit clk = P0^5; // clk 连接于 P1.2
sbit dat = P0^6; // dat 连接于 P1.3
sbit key = P1^4; // key 连接于 P1.4
//****** HD7279A 指令 ******
#define CMD_RESET 0xa4 // 复位
#define CMD_TEST 0xbf // 测试
#define DECODE0 0x80 // 方式0译码
#define DECODE1 0xc8 // 方式1译码
#define CMD_READ 0x15 // 读键盘指令
#define UNDECODE 0x90 // 方式2译码
#define RTL_CYCLE 0xa3 // 循环左移
#define RTR_CYCLE 0xa2 // 循环右移
#define RTL_UNCYL 0xa1 // 左移指令
#define RTR_UNCYL 0xa0 // 右移指令
#define ACTCTL 0x98 // 消隐指令
#define SEGON 0xe0 // 段亮指令
#define SEGOFF 0xc0 // 段关闭指令
#define BLINKCTL 0x88 // 闪烁指令
//*** 主程序 ***
void main()
{
while (1)
{
for (tmr=0;tmr<0x2000;tmr++) ; // 上电延时
send_byte (CMD_RESET); // 复位HD7279A
//***********************************************
// 测试指令演示
//***********************************************
send_byte (CMD_TEST); // 测试指令
for (j=0; j<3; j++)
{
delay10ms (100);
}
send_byte (CMD_RESET); // 清除指令
//***********************************************
// 闪烁指令及键盘接口测试
// 将用户按键的键码显示出来,如果10秒内无按键
// 或按S0键即进入下一步演示
//***********************************************
wait_cnter = 0;
key_number = 0xff;
write7279 (BLINKCTL, 0xfc); // 第1、2两位设为闪烁显示
write7279 (UNDECODE, 0x08); // 在第1位显示下划线'_'
write7279 (UNDECODE +1, 0x08); // 在第2位显示下划线'_'
do
{
if (!key) // 如果有键按下
{
key_number = read7279 (CMD_READ); // 读出键码
write7279 (DECODE1 +1, key_number/16); // 在第2位显示键码高8位
write7279 (DECODE1, key_number &0xff); // 在第1位显示键码低8位
while (!key); // 等待按键放开
wait_cnter = 0;
}
wait_cnter++;
}
while (key_number != 0 && wait_cnter<0x30000); // 如果按键为'0'和超时进入下一步演示
write7279 (BLINKCTL, 0xff); //清除闪烁设置
//***********************************************
// 快速计数演示
//***********************************************
for (j=0; j<5; j++) // 计数初始值为0000
{
digit [j] = 0;
write7279 (DECODE0+j,digit [j]);
}
while (digit [4] < 1) //如果计数达到20000就停止
{
digit [0]++;
if (digit [0] > 9)
{
digit [0] = 0;
digit [1]++;
if (digit [1] > 9)
{
digit [1] = 0;
digit [2]++;
if (digit [2] > 9)
{
digit [2] = 0;
digit [3]++;
if (digit [3] > 9)
{
digit [3] = 0;
digit [4]++;
if (digit [4] > 9)
{
digit [4] = 0;
}
}
}
}
}
write7279 (DECODE0, digit [0]);
if (digit [0] == 0)
{
write7279 (DECODE0 + 1,digit [1]);
if (digit [1] == 0)
{
write7279 (DECODE0 + 2, digit [2]);
if (digit [2] == 0)
{
write7279 (DECODE0 + 3, digit [3]);
if (digit [0] == 3)
{
write7279 (DECODE0 + 4, digit [4]);
}
}
}
}
}
delay10ms (150);
send_byte (CMD_RESET); // 清除显示
//***********************************************
// 下载数据但不译码指令测试
//***********************************************
write7279 (UNDECODE + 7, 0x49); //在第8位按不译码方式显示一字符‘三’
delay10ms (80);
//***********************************************
// 循环左/右移测试
// “三”字向右运动3次,再向左运动3次
//***********************************************
for (j=0; j < 23; j++)
{
send_byte (RTR_CYCLE); // 循环右移23次
delay10ms(12);
}
for (j=0; j < 23; j++)
{
send_byte (RTL_CYCLE); // 循环左移23次
delay10ms(12);
}
//***********************************************
// 译码方式0及左移指令测试
//***********************************************
for (j=0; j<16; j++)
{
send_byte (RTL_UNCYL); // 不循环左移指令
write7279 (DECODE0, j); // 译码方式0指令,显示在第1位
delay10ms (50);
}
delay10ms (150);
//***********************************************
// 译码方式1及右移指令测试
//***********************************************
for (j=0; j<16; j++)
{
send_byte (RTR_UNCYL); // 不循环右移指令
write7279 (DECODE1 +7, j); // 译码方式0指令,显示在第8位
delay10ms (50);
}
delay10ms (150);
//***********************************************
// 消隐指令测试
//***********************************************
k = 0xff;
for (j=0; j<6; j++)
{
k = k/2;
write7279 (ACTCTL,k); // 每隔一秒钟增加一个消隐位
delay10ms (100);
}
write7279 (ACTCTL,0xff); // 恢复8位显示
delay10ms (100);
send_byte (CMD_RESET); // 清除显示
//***********************************************
// 段点亮指令和段关闭指令
//***********************************************
for (j=0; j<64; j++)
{
write7279 (SEGON,j); // 将64个显示段逐个点亮
write7279 (SEGOFF, j - 1); // 同时将前一个显示段关闭
delay10ms (20);
}
}
}
//***********************************************
// 写入7279
//***********************************************
void write7279 (unsigned char cmd, unsigned char dta)
{
send_byte (cmd);
send_byte (dta);
}
//***********************************************
// 读7279
//***********************************************
unsigned char read7279 (unsigned char command)
{
send_byte (command);
return (receive_byte());
}
//***********************************************
// 发送字节
//***********************************************
void send_byte (unsigned char out_byte)
{
unsigned char i;
cs=0;
long_delay();
for (i=0;i<8;i++)
{
if (out_byte&0x80)
{
dat=1;
}
else
{
dat=0;
}
clk=1;
short_delay();
clk=0;
short_delay();
out_byte=out_byte*2;
}
dat=0;
}
//***********************************************
// 接收字节
//***********************************************
unsigned char receive_byte (void)
{
unsigned char i, in_byte;
dat=1; // 设为输入状态
long_delay();
for (i=0;i<8;i++)
{
clk=1;
short_delay();
in_byte=in_byte*2;
if (dat)
{
in_byte=in_byte|0x01;
}
clk=0;
short_delay();
}
dat=0;
return (in_byte);
}
//***********************************************
// 长延时
//***********************************************
void long_delay (void)
{
unsigned char i;
for (i=0; i<0x30; i++);
}
void short_delay (void)
{
unsigned char i;
for (i=0;i<8;i++);
}
//***********************************************
// 延时 n*10ms
//***********************************************
void delay10ms (unsigned char time)
{
unsigned char i;
unsigned int j;
for (i=0;i<time;i++)
{
for (j=0;j<0x390;j++);
/* {
if (!key)
{
key_int();
}
}*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -