📄 xians164old.c
字号:
/*********************************************
1.功能: 本程序针对74x164的LED显示驱动程序
2.I/O脚使用
io_74x164clk; // 串行通信时钟,上升沿有效
io_74x164data; // 串行数据,单向通信
3.调试环境:12M晶振(51系列12时钟模式)
若为其他时钟则作如下修改:
(1)
(2)
3.程序大小(ROM估计):
4.数据大小(RAM估计):
5.运行时间(与调用函数有关):
***********************************************/
#ifdef __XIANS164_DEBUG__
#include<wywcomm.h>
#include<reg51.h>
sbit io_74x164clk =P0^7; // 串行通信时钟,上升沿有效
sbit io_74x164data=P0^6; // 串行数据,单向通信
//此模块调用其它模块的外部变量和函数的声明(此程序无)
#else
#include "system.h" //所有的项目用相同的系统头文件,但存放的路径不同,各自存放在对应的项目文件夹。
#endif
//此模块的宏定义(常数等)
//此模块必要的库函数包含(include)
#include<intrins.h>
#include<math.h>
//全局变量(静态或一般)的定义
//以下为函数定义
//***********写164************************
static void write(uint8 data *shu)
{
int8 x,d;
for(x=7;x >= 0;x--)
{
uint8 i;
i=shu[x];
for(d=8;d>0;d--)
{
io_74x164clk=0;
if(i & 0x80) io_74x164data=1;
else io_74x164data=0;
i <<= 1 ;
io_74x164clk=1;
}
}
}
//****************清屏***************//
void v_74x164Ini_f(void)
{
uint8 i;
for(i=64;i>0;i--)
{
io_74x164clk=0;
io_74x164data=0;
io_74x164clk=1;
}
}
void v_74x164WriteNumber_f(uint8 xd,int16 shuju)
//**************************************************************************************
//功能: 显示六位以下的带小数点的数字
//说明: 输入xd(16进制)x表示:指出个位显示位置, 取值范围:0~2。
// d表示:小数点相对数字的显示位置 ,取值范围:0~4。(超出范围不显示)
// 输入shuju 表示:显示任意有符号16位整数, 取值范围:-32768~32767。
//***************************************************************************************
{
uint8 data u8_HuanCun8_a[8];
uint8 x,d,k=0;
uint16 i,j;
bit zf=1;
uint8 code yima[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};/*0,1,2,3,4,5,6,7,8,9,-,*/
x=xd>>4; d=xd&0x0f;
if(shuju >= 0) zf=0;
j=abs(shuju); //取绝对值
i = j/10000;
j = j%10000;
if(i|(d==4)) {u8_HuanCun8_a[x+4] = yima[i]; k++;}
else u8_HuanCun8_a[x+4] = 0;
i = j/1000;
j = j%1000;
if(i|k|(d==3)) {u8_HuanCun8_a[x+3] = yima[i];k++;}
else u8_HuanCun8_a[x+3] = 0;
i = j/100;
j = j%100;
if(i|k|(d==2)) {u8_HuanCun8_a[x+2] = yima[i];k++;}
else u8_HuanCun8_a[x+2] = 0;
i = j/10;
j = j%10;
if(i|k|(d==1)) {u8_HuanCun8_a[x+1] = yima[i];k++;}
else u8_HuanCun8_a[x+1] = 0;
u8_HuanCun8_a[x] = yima[j]; k++;
//????if(k != 5)
u8_HuanCun8_a[x+5] = 0; //判断写入负号
if(zf) u8_HuanCun8_a[x+k] = 0x02;
if(d < 5 ) u8_HuanCun8_a[x+d] |= 1; //写入小数点
write(u8_HuanCun8_a); //写入
}
void v_74x164WriteOneSegment_f(uint8 x,bit xians_bz)
//x表示:指出段显示的地址(取值范围:0~63)
//xians_bz表示:该段是亮还是灭,“0”表示亮,“1”表示灭,取值范围:0~1
{
uint8 data u8_HuanCun8_a[8];
switch(x%8)
{
case 0:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0x7e;//灭
else u8_HuanCun8_a[x/8] |= 0x80;//亮
break;}
case 1:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xbe;
else u8_HuanCun8_a[x/8] |= 0x40;
break;}
case 2:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xde;
else u8_HuanCun8_a[x/8] |= 0x20;
break;}
case 3:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xee;
else u8_HuanCun8_a[x/8] |= 0x10;
break;}
case 4:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xf6;
else u8_HuanCun8_a[x/8] |= 0x08;
break;}
case 5:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xfa;
else u8_HuanCun8_a[x/8] |= 0x04;
break;}
case 6:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xfc;
else u8_HuanCun8_a[x/8] |= 0x02;
break;}
case 7:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xfe;
else u8_HuanCun8_a[x/8] |= 0x01;
break;}
}
write(u8_HuanCun8_a);
}
void v_BC7281AWriteOneDig_f(uint8 reg_add,uint8 write_data)
//reg_add 表示:指出位显示的地址(取值范围:0~15)
//write_data 表示:写入的数据(不译码)
{
uint8 data u8_HuanCun8_a[8];
u8_HuanCun8_a[reg_add] = write_data;
write(u8_HuanCun8_a);
}
#ifdef __XIANS164_DEBUG__
void main()
{
v_74x164Ini_f();
v_BC7281AWriteOneDig_f(7,0xff);
v_74x164WriteNumber_f(0x14,-4560) ;
v_74x164WriteNumber_f(0x21,-40) ;
v_74x164WriteNumber_f(0x00,-450) ;
v_74x164WriteNumber_f(0x04,-4560) ;
v_74x164WriteNumber_f(0x35,-40) ;
v_74x164WriteNumber_f(0x41,-450) ;
v_BC7281AWriteOneDig_f(7,0x00);
v_BC7281AWriteOneDig_f(6,0x0f);
v_BC7281AWriteOneDig_f(4,0xfe);
v_74x164WriteOneSegment_f(24,0);
v_74x164WriteOneSegment_f(0,1);
v_74x164WriteOneSegment_f(0,0);
v_74x164WriteOneSegment_f(63,0);
while(1) ;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -