📄 24m点阵时钟.c
字号:
}
}
}
void Show_Move_Word(uchar code *WORDS[][8]){
int m,i;
while(1){
for(m=0;m<6;m++){ //若要上下移动 m=16
//hang = 0;
for(i=0;i<16;i++){
Put_Hdispram(); //把第i行放入行缓冲
RL_Move(); //是否要左右移动
Show_Line();
//delay(); //看需要
}
//UD_Move(); //是否要上下移动
}
//========================================
//测试左移右移 切换时有跳变!!
// if(MSG_MV){
move_times++;
if((move_times == 9) && (MSG_MV == MSG_MV_L)){
move_times = 1;
Put_Wdispram(WORDS);
start_word++;
switch(STATE){
case STA_gTEMP:
Read_Temperature();
Disp_Temperature(); //
Put_gTEMP(); //
if(start_word > (sizeof(TMP_WORDS)/16 - 8))
MSG_MV = MSG_MV_R;
break;
case STA_gWORD:
if(start_word > (sizeof(MY_WORDS)/16 - 8))
MSG_MV = MSG_MV_R;
default:
break;
}
if(start_word > (sizeof(TMP_WORDS)/16 - 4))
MSG_MV = MSG_MV_R;
}
else if((move_times == 9) && (MSG_MV == MSG_MV_R)){
move_times = 1;
Put_Wdispram(WORDS); //
start_word-- ;
switch(STATE){
case STA_gTEMP:
Disp_Temperature(); //
Put_gTEMP();
break;
default:
break;
}
if(start_word < 1){
MSG_MV = MSG_MV_L;
return;
}
}
// }
}
}
void Show_All_Word(){
int m,i;
//MSG_MV = MSG_MV_L;
for(start_word = 0;start_word < 8;start_word++){
for(move_times = 0; move_times < 8;move_times++){
for(m=0;m<4;m++){ //若要上下移动 m=16
for(i=0;i<16;i++){
Put_Hdispram(); //把第i行放入行缓冲
RL_Move(); //是否要左右移动
Show_Line();
}
}
}
}
}
void delay()
{
uint i;
for(i=0;i<40;i++);
}
//------------------------------------
//----------字发送子程序-----------
void SendByte(void)
{
uchar m;
for(m=0;m<8;m++)
{
CLK = 0;
Red = (SendData & 0x80); //红屏显示
// Greed = (SendData & 0x80); //绿屏显示
SendData =SendData<<1;
CLK = 1; //移位时钟上升沿
}
}
//-----------------------------------
//----------行扫描子程序-------------
void RowsCan(void)
{
P2 = P2 & 0xf0;
P2 = P2 | hang;
hang++;
if (hang>=16)
{
hang =0x00;
}
}
void initial(void)
{
OE = 1;
Red = 1;
Greed = 1;
SendData = 0x00;
hang = 0x00;
}
/*****************************************************
函数功能:延时若干微秒
入口参数:n
***************************************************/
void delaynus(unsigned char n)
{
unsigned char i;
// for(i=0;i<n;i++)
;
}
/*****************************************************
函数功能:向1302写一个字节数据
入口参数:x
***************************************************/
void Write1302(unsigned char dat)
{
unsigned char i;
SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备
delaynus(2); //稍微等待,使硬件做好准备
for(i=0;i<8;i++) //连续写8个二进制位数据
{
DATA=dat&0x01; //取出dat的第0位数据写入1302
delaynus(2); //稍微等待,使硬件做好准备
SCLK=1; //上升沿写入数据
delaynus(2); //稍微等待,使硬件做好准备
SCLK=0; //重新拉低SCLK,形成脉冲
dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位
}
}
/*****************************************************
函数功能:根据命令字,向1302写一个字节数据
入口参数:Cmd,储存命令字;dat,储存待写的数据
***************************************************/
void WriteSet1302(unsigned char Cmd,unsigned char dat)
{
RST=0; //禁止数据传递
SCLK=0; //确保写数居前SCLK被拉低
RST=1; //启动数据传输
delaynus(2); //稍微等待,使硬件做好准备
Write1302(Cmd); //写入命令字
Write1302(dat); //写数据
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
}
/*****************************************************
函数功能:从1302读一个字节数据
入口参数:x
***************************************************/
unsigned char Read1302(void)
{
unsigned char i,dat;
delaynus(2); //稍微等待,使硬件做好准备
for(i=0;i<8;i++) //连续读8个二进制位数据
{
dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位
if(DATA==1) //如果读出的数据是1
dat|=0x80; //将1取出,写在dat的最高位
SCLK=1; //将SCLK置于高电平,为下降沿读出
delaynus(2); //稍微等待
SCLK=0; //拉低SCLK,形成脉冲下降沿
delaynus(2); //稍微等待
}
return dat; //将读出的数据返回
}
/*****************************************************
函数功能:根据命令字,从1302读取一个字节数据
入口参数:Cmd
***************************************************/
unsigned char ReadSet1302(unsigned char Cmd)
{
unsigned char dat;
RST=0; //拉低RST
SCLK=0; //确保写数居前SCLK被拉低
RST=1; //启动数据传输
Write1302(Cmd); //写入命令字
dat=Read1302(); //读出数据
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
return dat; //将读出的数据返回
}
/*****************************************************
函数功能: 1302进行初始化设置
***************************************************/
void Init_DS1302(void)
{
unsigned char flag;
flag= ReadSet1302(0x81);
if(flag&0x80) { //判断时钟芯片是否关闭
WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令
WriteSet1302(0x80,((0/10)<<4|(0%10))); //根据写秒寄存器命令字,写入秒的初始值
WriteSet1302(0x82,((18/10)<<4|(18%10))); //根据写分寄存器命令字,写入分的初始值
WriteSet1302(0x84,((21/10)<<4|(21%10))); //根据写小时寄存器命令字,写入小时的初始值
WriteSet1302(0x86,((23/10)<<4|(23%10))); //根据写日寄存器命令字,写入日的初始值
WriteSet1302(0x88,((7/10)<<4|(7%10))); //根据写月寄存器命令字,写入月的初始值
//WriteSet1302(0x8A,2);
WriteSet1302(0x8c,((10/10)<<4|(10%10))); //根据写小时寄存器命令字,写入小时的初始值
WriteSet1302(0x90,0xa5);
WriteSet1302(0x8E,0x80);
}
//如果不想每次都初始化时间,也就是掉电后还想让时钟继续走时的话 就用上面的语句
/*--------------------这是每次都初始化的语句-----------------*/
/* WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令
WriteSet1302(0x80,((0/10)<<4|(0%10))); //根据写秒寄存器命令字,写入秒的初始值
WriteSet1302(0x82,((18/10)<<4|(18%10))); //根据写分寄存器命令字,写入分的初始值
WriteSet1302(0x84,((21/10)<<4|(21%10))); //根据写小时寄存器命令字,写入小时的初始值
WriteSet1302(0x86,((23/10)<<4|(23%10))); //根据写日寄存器命令字,写入日的初始值
WriteSet1302(0x88,((7/10)<<4|(7%10))); //根据写月寄存器命令字,写入月的初始值
//WriteSet1302(0x8A,2);
WriteSet1302(0x8c,((10/10)<<4|(10%10))); //根据写小时寄存器命令字,写入小时的初始值
WriteSet1302(0x90,0xa5);
WriteSet1302(0x8E,0x80);
*/
}
void write_time1302(){
WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令
WriteSet1302(0x80,Time.Second); //根据写秒寄存器命令字,写入秒的初始值
WriteSet1302(0x82,Time.Minute); //根据写分寄存器命令字,写入分的初始值
WriteSet1302(0x84,Time.Hour); //根据写小时寄存器命令字,写入小时的初始值
WriteSet1302(0x86,Time.Day); //根据写日寄存器命令字,写入日的初始值
WriteSet1302(0x88,Time.Month); //根据写月寄存器命令字,写入月的初始值
WriteSet1302(0x8A,Time.Week);
WriteSet1302(0x8c,Time.Year); //根据写小时寄存器命令字,写入小时的初始值
// WriteSet1302(0x90,0xa5);
//WriteSet1302(0x8E,0x80);
}
//读时间
void Read_TIME(){
RST=0; //拉低RST
SCLK=0; //确保写数居前SCLK被拉低
RST=1; //启动数据传输
Write1302(0xbf); //写入命令字
Time.Second = Read1302() & 0x7f;
Time.Minute = Read1302() & 0x7f;
Time.Hour = Read1302() & 0x7f;
Time.Day = Read1302() & 0x7f;
Time.Month = Read1302() & 0x7f;
Time.Week= Read1302() & 0x7f;
Time.Year = Read1302() & 0x7f;
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
/*unsigned char ReadValue; //储存从1302读取的数据
ReadValue = ReadSet1302(0x81); //从秒寄存器读数据
Time.Second =ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F);//将读出数据转化
ReadValue = ReadSet1302(0x83); //从分寄存器读
Time.Minute = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //将读出数据转化
ReadValue = ReadSet1302(0x85); //从时寄存器读
Time.Hour = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //将读出数据转化
ReadValue = ReadSet1302(0x87); //从分寄存器读
Time.Day = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //将读出数据转化
ReadValue = ReadSet1302(0x89); //从分寄存器读
Time.Month = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //将读出数据转化
ReadValue = ReadSet1302(0x8B); //从时寄存器读
Time.Week= ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //将读出数据转化
ReadValue = ReadSet1302(0x8d); //从分寄存器读
Time.Year = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //将读出数据转化
*/ }
void Put_Adispram(uchar a){
uchar i;
//第一屏"今天是:"
disword[a+1] = &NO_WORDS[12][0]; //空格
for(i=0;i<6;i++)
disword[a+i+2] = &TIME_WORDS[i][0];
disword[a+8] = &NO_WORDS[11][0]; //":"
//第二屏
//disword[4] = &TIME_WORDS[];
}
//将年份放入到显示缓存
//需要参数:缓冲区首地址下标
void Put_Ydispram(uchar i){
disword[i+1] = &NO_WORDS[12][0];
if(Time.Year < 30 && !HIDE){
disword[i+2] = &NO_WORDS[2][0];
disword[i+3] = &NO_WORDS[0][0];
}
else if(!HIDE){
disword[i+2] = &NO_WORDS[1][0];
disword[i+3] = &NO_WORDS[9][0];
}
disword[i+4] = &NO_WORDS[Time.Year>>4][0];
disword[i+5] = &NO_WORDS[Time.Year&0x0f][0];
disword[i+6] = &TIME_WORDS[6][0];
disword[i+7] = &TIME_WORDS[7][0]; //年
disword[i+8] = &NO_WORDS[12][0];
}
//将星期放入到显示缓存
//参数:缓冲区首地址下标
void Put_Kdispram(uchar i){
disword[i+1] = &NO_WORDS[12][0];
disword[i+2] = &TIME_WORDS[12][0];
disword[i+3] = &TIME_WORDS[13][0]; //星期
disword[i+4] = &TIME_WORDS[14][0];
disword[i+5] = &TIME_WORDS[15][0];
if(STATE== STA_CHG &&HIDE){
disword[i+6] = &NO_WORDS[12][0]; //
disword[i+7] = &NO_WORDS[12][0]; //
}
else{
disword[i+6] = &WEEK_WORDS[Time.Week*2-2][0]; //
disword[i+7] = &WEEK_WORDS[Time.Week*2-1][0]; //
}
disword[i+8] = &NO_WORDS[12][0];
}
//将日期放入到显示缓存
//参数:缓冲区首地址下标
void Put_Ddispram(uchar i){
disword[i+1] = &NO_WORDS[Time.Month>>4][0]; //小时高位
disword[i+2] = &NO_WORDS[ Time.Month&0x0f][0]; //小时地位
disword[i+3] = &TIME_WORDS[8][0]; //-
disword[i+4] = &TIME_WORDS[9][0]; //分钟高位
disword[i+5] = &NO_WORDS[ Time.Day>>4][0]; //分钟地位
disword[i+6] = &NO_WORDS[Time.Day&0x0f][0]; //-
disword[i+7] = &TIME_WORDS[10][0]; //秒高位
disword[i+8] = &TIME_WORDS[11][0]; //秒地位
}
//将时间放入到显示缓存
//参数:缓冲区首地址下标
void Put_Tdispram(uchar i){
disword[i+1] = &NO_WORDS[Time.Hour>>4][0]; //小时高位
disword[i+2] = &NO_WORDS[ Time.Hour&0x0f][0]; //小时地位
disword[i+3] = &NO_WORDS[ 11 ]; //-
disword[i+4] = &NO_WORDS[Time.Minute>>4][0]; //分钟高位
disword[i+5] = &NO_WORDS[ Time.Minute&0x0f][0]; //分钟地位
disword[i+6] = &NO_WORDS[ 11 ]; //-
disword[i+7] = &NO_WORDS[Time.Second>>4][0]; //秒高位
disword[i+8] = &NO_WORDS[ Time.Second&0x0f][0]; //秒地位
}
//===================================
//*****关于温度检测部分*****
void Put_gTEMP(){
// uchar i;
// Put_Wdispram(TMP_WORDS,0);
disword[6] = &NO_WORDS[temp_ram[3]][0]; //百位
disword[7] = &NO_WORDS[temp_ram[2]][0]; //十位
disword[8] = &NO_WORDS[temp_ram[1]][0]; //个位
disword[10] = &NO_WORDS[temp_ram[0]][0]; //小数
disword[12] = &NO_WORDS[12]; //空格
disword[13] = &NO_WORDS[12]; //空格
//
}
void Put_sTEMP(uchar i){
disword[i+1] = &NO_WORDS[12]; //空格
disword[i+2] = &NO_WORDS[12];//&NO_WORDS[temp_ram[3]][0]; //百位
disword[i+3] = &NO_WORDS[temp_ram[2]][0]; //十位
disword[i+4] = &NO_WORDS[temp_ram[1]][0]; //个位
disword[i+5] = &TMP_WORDS[8][0]; //小数点
disword[i+6] = &NO_WORDS[temp_ram[0]][0]; //小数
disword[i+7] = &TMP_WORDS[10][0];
disword[i+8] = &NO_WORDS[12]; //空格
}
void Put_Cpyrt(uchar i){
uchar m;
for(m=0;m<8;m++)
disword[i+1+m] = &CPYRT_WORDS[m];
}
void Show_Cpyrt(){
uchar i;
for(i=1;i<9;i++)
disword[i] = &NO_WORDS[12];
Put_Cpyrt(8);
Move_Down();
Put_Cpyrt(0);
Put_Tdispram(8);
Move_Down();
}
//========================
//参数i:放入第几屏缓存
//参数j:诗歌第几页
//========================
void Put_Song(uchar i,uchar j){
uchar m;
for(m=0;m<8;m++)
disword[i+1+m] = &SONG_WORDS[j+m];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -