📄 7279test.c
字号:
#include <reg51.h>//*** 函数定义 ***void long_delay(void); // 长延时void short_delay(void); // 短暂延时void delay10ms(unsigned char); // 延时10MSvoid write7279(unsigned char, unsigned char); // 写入到HD7279unsigned 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=P1^4; // cs at P1.4sbit clk=P1^5; // clk 连接于 P1.5sbit dat=P1^2; // dat 连接于 P1.2sbit key=P1^3; // key 连接于 P1.3//****** HD7279A 指令 ******#define CMD_RESET 0xa4#define CMD_TEST 0xbf#define DECODE0 0x80#define DECODE1 0xc8#define CMD_READ 0x15#define UNDECODE 0x90#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//*** 主程序 ***main(){ while (1) { for (tmr=0;tmr<0x2000;tmr++); // 上电延时 send_byte(CMD_RESET); // 复位HD7279A //******************************************// 测试指令演示//****************************************** send_byte(CMD_TEST); // 测试指令 for (j=0;j<3;j++) // 延时约3秒 { 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&0x0f); // 在第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++) // 计数初始值为00000 { digit[j]=0; write7279(DECODE0+j,digit[j]); } while (digit[4]<2) // 如果计数达到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[3]==0) { 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); send_byte(CMD_RESET);//*********************************************// 译码方式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); } }} void write7279(unsigned char cmd, unsigned char dta){ send_byte (cmd); send_byte (dta);} 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; // set to input mode 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 + -