📄 0-9.c
字号:
#include <at89x52.h>
#include <stdio.h>
#define uchar unsigned char
uchar i=0x00;
uchar j=0x00;
uchar k=0x00;
uchar t=0x00; //计数初值
uchar keytemp;
uchar x;
uchar pDisplay=0x00; //扫描指针
uchar count=0x00;
const uchar b[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//逐列扫描码
const uchar c[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //逐行扫描码
char code a[3][24] = {
0x00,0x00,0x00,0x00,0x3F,0x00,0xE0,0xC0,
0x01,0x10,0x00,0x06,0x08,0x00,0x08,0x0C,
0x00,0x10,0xC2,0x03,0x20,0x42,0x02,0x60,
0x41,0x02,0x42,0x41,0x02,0x45,0xC1,0x73,
0x87,0x01,0x50,0x85,0x01,0x50,0x87,0x01,
0x50,0x85,0xC1,0x73,0x47,0x41,0x02,0x45,
0x41,0x02,0x42,0x42,0x02,0x20,0xC2,0x03,
0x20,0x0C,0x00,0x10,0x08,0x00,0x08,0x10,
0x00,0x06,0xE0,0xC0,0x01,0x00,0x3F,0x00
};
void device_init();
void display();
void next();
/******************************************************************************
名称:device_init
功能:初始化端口、状态寄存器。打开定时器0,按方式1工作,设计数初值为0x3caf
参数:无
******************************************************************************/
void device_init()
{
TL0=0xbf; //置定时器初值0xf0bf
TH0=0xf0;
TMOD=0x01; //设定定时器/计数器0工作方式为1
IE=0x82; //允许全局中断,允许定时器/计数器0溢出中断
TR0=0x01; //启动定时器/计数器0
}
/******************************************************************************
名称:Base_Send
功能:发送8bit到1个74HC595中 P1_5 控制线 P1_6 数据线 P1_7 时钟线
参数:send_data,为欲发送的数据
******************************************************************************
void base_send(uchar send_data)
{
uchar index = 0x00;
for (index=0x00; index<0x08; index++)
{
P1_7 = 0;
P1_6 = send_data & (0x80 >> index);
P1_7 = 1;
}
}
/******************************************************************************
名称:display
功能:将要显示的数码发送到缓冲区,等待扫描显示
参数:无
******************************************************************************/
void display()
{
//扫描的片选和数码发送出去
Transport(c[pDisplay%8],a[pDisplay]);
pDisplay++; //扫描下一位
if(pDisplay==0x48)
{
pDisplay=0;
}
}
/****************************************************************************
名称:Transport
功能:发送3个字节到级联的6个74HC595中
参数:first,second 分别为欲发送到2个74HC595中的数据
*****************************************************************************/
void Transport(uchar first,uchar second,uchar third,uchar four,uchar five,uchar six) *
{
uchar i;
//发送第一个数据
P3_5=0x00;
for(i=0x00;i<0x08;i++)
{
P3_7=0x00;
P3_6=first&(0x80>>i);
P3_7=0x01;
}
P3_5=0x01;
//发送第二个数据
P3_2=0x00;
for(i=0x00;i<0x08;i++)
{
P3_4=0x00;
P3_3=second&(0x80>>i);
P3_4=0x01;
}
P3_2=0x01;
//发送第三个数据
P2_7=0x00;
for(i=0x00;i<0x08;i++)
{
P3_1=0x00;
P3_0=third&(0x80>>i);
P3_1=0x01;
}
P2_7=0x01;
//发送第四个数据
P2_4=0x00
for(i=0x00;i<0x08;i++)
{
P2_6=0x00;
P2_5=four&(0x80>>i);
P2_6=0x01;
}
P2_4=0x01;
//发送第五个数据
P2_1=0x00;
for(i=0x00;i<0x08;i++)
{
P1_3=0x00;
P1_2=five&(0x80>>i);
P1_3=0x01;
}
P2_1=0x01;
//发送第六个数据
P1_6=0x00;
for(i=0x00;i<0x08;i++)
{
P2_0=0x00;
P1_7=six&(0x80>>i);
P2_0=0x01;
}
P1_6=0x01;
}
//******************************************************************************/
// --------------------------------------
void display()
{
if(j>t%24)
x=i;
else
// x=(i+1)%0x15;
x=(i+1)%0x18;
send(c[k],a[x][j]);
j++;
if(j==0x08)
{
j=0x00;
}
k++;
if(k==0x08)
{
k=0x00;
}
}
//---------------------------------------
void next() //字符移动
{
t++;
//if(t==(0x15)*8)
if(t==(0x03)*24)
{
t=0x00; // 循环显示控制
}
i=t/24; //行
j=t%24; //列
}
/******************************************************************************
名称:timer0_over
功能:定时器/计数器0溢出中断服务程序,每1秒钟更新显示一次
参数:无
******************************************************************************/
void timeover() interrupt 1
{
count++;
if(count==0x40)//0.1秒移动一次
{
count=0x00;
next();
}
display(); //调用显示函数
TL0=0xbf; //置初值0xf0bf
TH0=0xf0;
}
//---------------------------------------
void main()
{
device_init();
while(1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -